From 36c2c3085e8c6246eb9dda66ae7950d5059b045f Mon Sep 17 00:00:00 2001 From: Zhebrikov Date: Fri, 1 Dec 2023 15:24:23 +0900 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +- install-soft-on-Astra-linux/bin/activate | 76 + install-soft-on-Astra-linux/bin/activate.csh | 37 + install-soft-on-Astra-linux/bin/activate.fish | 75 + install-soft-on-Astra-linux/bin/easy_install | 11 + .../bin/easy_install-3.5 | 11 + .../bin/easy_install-3.7 | 11 + install-soft-on-Astra-linux/bin/pip | 11 + install-soft-on-Astra-linux/bin/pip3 | 11 + install-soft-on-Astra-linux/bin/pip3.5 | 11 + install-soft-on-Astra-linux/bin/pip3.7 | 11 + install-soft-on-Astra-linux/bin/python | 1 + install-soft-on-Astra-linux/bin/python3 | 1 + install-soft-on-Astra-linux/bin/python3.7 | 1 + .../__pycache__/easy_install.cpython-35.pyc | Bin 0 -> 288 bytes .../python3.5/site-packages/easy_install.py | 5 + .../ldap3-2.9.1.dist-info/COPYING.LESSER.txt | 165 + .../ldap3-2.9.1.dist-info/COPYING.txt | 674 ++ .../ldap3-2.9.1.dist-info/INSTALLER | 1 + .../ldap3-2.9.1.dist-info/LICENSE.txt | 13 + .../ldap3-2.9.1.dist-info/METADATA | 165 + .../ldap3-2.9.1.dist-info/RECORD | 230 + .../site-packages/ldap3-2.9.1.dist-info/WHEEL | 6 + .../ldap3-2.9.1.dist-info/top_level.txt | 1 + .../python3.5/site-packages/ldap3/__init__.py | 150 + .../ldap3/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 3470 bytes .../ldap3/__pycache__/version.cpython-35.pyc | Bin 0 -> 448 bytes .../site-packages/ldap3/abstract/__init__.py | 50 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 735 bytes .../__pycache__/attrDef.cpython-35.pyc | Bin 0 -> 4130 bytes .../__pycache__/attribute.cpython-35.pyc | Bin 0 -> 9955 bytes .../__pycache__/cursor.cpython-35.pyc | Bin 0 -> 29239 bytes .../abstract/__pycache__/entry.cpython-35.pyc | Bin 0 -> 23344 bytes .../__pycache__/objectDef.cpython-35.pyc | Bin 0 -> 9497 bytes .../site-packages/ldap3/abstract/attrDef.py | 121 + .../site-packages/ldap3/abstract/attribute.py | 290 + .../site-packages/ldap3/abstract/cursor.py | 912 +++ .../site-packages/ldap3/abstract/entry.py | 712 +++ .../site-packages/ldap3/abstract/objectDef.py | 270 + .../site-packages/ldap3/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 137 bytes .../__pycache__/connection.cpython-35.pyc | Bin 0 -> 50389 bytes .../__pycache__/exceptions.cpython-35.pyc | Bin 0 -> 22973 bytes .../core/__pycache__/pooling.cpython-35.pyc | Bin 0 -> 10625 bytes .../core/__pycache__/rdns.cpython-35.pyc | Bin 0 -> 1849 bytes .../core/__pycache__/results.cpython-35.pyc | Bin 0 -> 3700 bytes .../core/__pycache__/server.cpython-35.pyc | Bin 0 -> 21057 bytes .../core/__pycache__/timezone.cpython-35.pyc | Bin 0 -> 1512 bytes .../ldap3/core/__pycache__/tls.cpython-35.pyc | Bin 0 -> 9075 bytes .../core/__pycache__/usage.cpython-35.pyc | Bin 0 -> 7670 bytes .../site-packages/ldap3/core/connection.py | 1605 +++++ .../site-packages/ldap3/core/exceptions.py | 608 ++ .../site-packages/ldap3/core/pooling.py | 329 + .../site-packages/ldap3/core/rdns.py | 68 + .../site-packages/ldap3/core/results.py | 137 + .../site-packages/ldap3/core/server.py | 682 ++ .../site-packages/ldap3/core/timezone.py | 56 + .../python3.5/site-packages/ldap3/core/tls.py | 327 + .../site-packages/ldap3/core/usage.py | 229 + .../site-packages/ldap3/extend/__init__.py | 334 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 9675 bytes .../__pycache__/operation.cpython-35.pyc | Bin 0 -> 2768 bytes .../ldap3/extend/microsoft/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 149 bytes .../addMembersToGroups.cpython-35.pyc | Bin 0 -> 2945 bytes .../__pycache__/dirSync.cpython-35.pyc | Bin 0 -> 2152 bytes .../__pycache__/modifyPassword.cpython-35.pyc | Bin 0 -> 1516 bytes .../persistentSearch.cpython-35.pyc | Bin 0 -> 2784 bytes .../removeMembersFromGroups.cpython-35.pyc | Bin 0 -> 2877 bytes .../__pycache__/unlockAccount.cpython-35.pyc | Bin 0 -> 1129 bytes .../extend/microsoft/addMembersToGroups.py | 98 + .../ldap3/extend/microsoft/dirSync.py | 94 + .../ldap3/extend/microsoft/modifyPassword.py | 75 + .../extend/microsoft/persistentSearch.py | 117 + .../microsoft/removeMembersFromGroups.py | 99 + .../ldap3/extend/microsoft/unlockAccount.py | 57 + .../ldap3/extend/novell/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 146 bytes .../addMembersToGroups.cpython-35.pyc | Bin 0 -> 4608 bytes .../checkGroupsMemberships.cpython-35.pyc | Bin 0 -> 5279 bytes .../__pycache__/endTransaction.cpython-35.pyc | Bin 0 -> 1669 bytes .../__pycache__/getBindDn.cpython-35.pyc | Bin 0 -> 998 bytes .../__pycache__/listReplicas.cpython-35.pyc | Bin 0 -> 1568 bytes .../nmasGetUniversalPassword.cpython-35.pyc | Bin 0 -> 1666 bytes .../nmasSetUniversalPassword.cpython-35.pyc | Bin 0 -> 1582 bytes .../partition_entry_count.cpython-35.pyc | Bin 0 -> 1674 bytes .../removeMembersFromGroups.cpython-35.pyc | Bin 0 -> 4650 bytes .../__pycache__/replicaInfo.cpython-35.pyc | Bin 0 -> 2276 bytes .../startTransaction.cpython-35.pyc | Bin 0 -> 1804 bytes .../ldap3/extend/novell/addMembersToGroups.py | 167 + .../extend/novell/checkGroupsMemberships.py | 180 + .../ldap3/extend/novell/endTransaction.py | 58 + .../ldap3/extend/novell/getBindDn.py | 41 + .../ldap3/extend/novell/listReplicas.py | 50 + .../extend/novell/nmasGetUniversalPassword.py | 56 + .../extend/novell/nmasSetUniversalPassword.py | 52 + .../extend/novell/partition_entry_count.py | 57 + .../extend/novell/removeMembersFromGroups.py | 170 + .../ldap3/extend/novell/replicaInfo.py | 79 + .../ldap3/extend/novell/startTransaction.py | 56 + .../site-packages/ldap3/extend/operation.py | 98 + .../ldap3/extend/standard/PagedSearch.py | 146 + .../ldap3/extend/standard/PersistentSearch.py | 137 + .../ldap3/extend/standard/__init__.py | 0 .../__pycache__/PagedSearch.cpython-35.pyc | Bin 0 -> 2597 bytes .../PersistentSearch.cpython-35.pyc | Bin 0 -> 3144 bytes .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 148 bytes .../__pycache__/modifyPassword.cpython-35.pyc | Bin 0 -> 2150 bytes .../__pycache__/whoAmI.cpython-35.pyc | Bin 0 -> 909 bytes .../ldap3/extend/standard/modifyPassword.py | 72 + .../ldap3/extend/standard/whoAmI.py | 40 + .../site-packages/ldap3/operation/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 142 bytes .../__pycache__/abandon.cpython-35.pyc | Bin 0 -> 540 bytes .../operation/__pycache__/add.cpython-35.pyc | Bin 0 -> 1744 bytes .../operation/__pycache__/bind.cpython-35.pyc | Bin 0 -> 4718 bytes .../__pycache__/compare.cpython-35.pyc | Bin 0 -> 1551 bytes .../__pycache__/delete.cpython-35.pyc | Bin 0 -> 970 bytes .../__pycache__/extended.cpython-35.pyc | Bin 0 -> 2886 bytes .../__pycache__/modify.cpython-35.pyc | Bin 0 -> 2210 bytes .../__pycache__/modifyDn.cpython-35.pyc | Bin 0 -> 1393 bytes .../__pycache__/search.cpython-35.pyc | Bin 0 -> 18186 bytes .../__pycache__/unbind.cpython-35.pyc | Bin 0 -> 348 bytes .../site-packages/ldap3/operation/abandon.py | 36 + .../site-packages/ldap3/operation/add.py | 72 + .../site-packages/ldap3/operation/bind.py | 160 + .../site-packages/ldap3/operation/compare.py | 64 + .../site-packages/ldap3/operation/delete.py | 46 + .../site-packages/ldap3/operation/extended.py | 109 + .../site-packages/ldap3/operation/modify.py | 96 + .../site-packages/ldap3/operation/modifyDn.py | 62 + .../site-packages/ldap3/operation/search.py | 579 ++ .../site-packages/ldap3/operation/unbind.py | 32 + .../site-packages/ldap3/protocol/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 141 bytes .../__pycache__/controls.cpython-35.pyc | Bin 0 -> 658 bytes .../__pycache__/convert.cpython-35.pyc | Bin 0 -> 9535 bytes .../__pycache__/microsoft.cpython-35.pyc | Bin 0 -> 3327 bytes .../__pycache__/novell.cpython-35.pyc | Bin 0 -> 5245 bytes .../protocol/__pycache__/oid.cpython-35.pyc | Bin 0 -> 72211 bytes .../persistentSearch.cpython-35.pyc | Bin 0 -> 1810 bytes .../__pycache__/rfc2696.cpython-35.pyc | Bin 0 -> 1584 bytes .../__pycache__/rfc2849.cpython-35.pyc | Bin 0 -> 7659 bytes .../__pycache__/rfc3062.cpython-35.pyc | Bin 0 -> 2444 bytes .../__pycache__/rfc4511.cpython-35.pyc | Bin 0 -> 26271 bytes .../__pycache__/rfc4512.cpython-35.pyc | Bin 0 -> 28907 bytes .../__pycache__/rfc4527.cpython-35.pyc | Bin 0 -> 1372 bytes .../site-packages/ldap3/protocol/controls.py | 40 + .../site-packages/ldap3/protocol/convert.py | 221 + .../ldap3/protocol/formatters/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 152 bytes .../__pycache__/formatters.cpython-35.pyc | Bin 0 -> 10988 bytes .../__pycache__/standard.cpython-35.pyc | Bin 0 -> 7742 bytes .../__pycache__/validators.cpython-35.pyc | Bin 0 -> 11684 bytes .../ldap3/protocol/formatters/formatters.py | 436 ++ .../ldap3/protocol/formatters/standard.py | 238 + .../ldap3/protocol/formatters/validators.py | 502 ++ .../site-packages/ldap3/protocol/microsoft.py | 142 + .../site-packages/ldap3/protocol/novell.py | 141 + .../site-packages/ldap3/protocol/oid.py | 1208 ++++ .../ldap3/protocol/persistentSearch.py | 85 + .../site-packages/ldap3/protocol/rfc2696.py | 70 + .../site-packages/ldap3/protocol/rfc2849.py | 295 + .../site-packages/ldap3/protocol/rfc3062.py | 91 + .../site-packages/ldap3/protocol/rfc4511.py | 1007 +++ .../site-packages/ldap3/protocol/rfc4512.py | 850 +++ .../site-packages/ldap3/protocol/rfc4527.py | 57 + .../ldap3/protocol/sasl/__init__.py | 0 .../sasl/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 146 bytes .../sasl/__pycache__/digestMd5.cpython-35.pyc | Bin 0 -> 3894 bytes .../sasl/__pycache__/external.cpython-35.pyc | Bin 0 -> 412 bytes .../sasl/__pycache__/kerberos.cpython-35.pyc | Bin 0 -> 9100 bytes .../sasl/__pycache__/plain.cpython-35.pyc | Bin 0 -> 785 bytes .../sasl/__pycache__/sasl.cpython-35.pyc | Bin 0 -> 4418 bytes .../ldap3/protocol/sasl/digestMd5.py | 159 + .../ldap3/protocol/sasl/external.py | 32 + .../ldap3/protocol/sasl/kerberos.py | 302 + .../ldap3/protocol/sasl/plain.py | 70 + .../site-packages/ldap3/protocol/sasl/sasl.py | 171 + .../ldap3/protocol/schemas/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 149 bytes .../__pycache__/ad2012R2.cpython-35.pyc | Bin 0 -> 330815 bytes .../schemas/__pycache__/ds389.cpython-35.pyc | Bin 0 -> 308116 bytes .../__pycache__/edir888.cpython-35.pyc | Bin 0 -> 176098 bytes .../__pycache__/edir914.cpython-35.pyc | Bin 0 -> 180366 bytes .../__pycache__/slapd24.cpython-35.pyc | Bin 0 -> 127848 bytes .../ldap3/protocol/schemas/ad2012R2.py | 2232 +++++++ .../ldap3/protocol/schemas/ds389.py | 1715 +++++ .../ldap3/protocol/schemas/edir888.py | 1127 ++++ .../ldap3/protocol/schemas/edir914.py | 1157 ++++ .../ldap3/protocol/schemas/slapd24.py | 758 +++ .../site-packages/ldap3/strategy/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 141 bytes .../__pycache__/asyncStream.cpython-35.pyc | Bin 0 -> 3308 bytes .../__pycache__/asynchronous.cpython-35.pyc | Bin 0 -> 9411 bytes .../strategy/__pycache__/base.cpython-35.pyc | Bin 0 -> 30387 bytes .../__pycache__/ldifProducer.cpython-35.pyc | Bin 0 -> 5368 bytes .../__pycache__/mockAsync.cpython-35.pyc | Bin 0 -> 5082 bytes .../__pycache__/mockBase.cpython-35.pyc | Bin 0 -> 23403 bytes .../__pycache__/mockSync.cpython-35.pyc | Bin 0 -> 4643 bytes .../__pycache__/restartable.cpython-35.pyc | Bin 0 -> 7687 bytes .../__pycache__/reusable.cpython-35.pyc | Bin 0 -> 17176 bytes .../safeRestartable.cpython-35.pyc | Bin 0 -> 603 bytes .../__pycache__/safeSync.cpython-35.pyc | Bin 0 -> 568 bytes .../strategy/__pycache__/sync.cpython-35.pyc | Bin 0 -> 7501 bytes .../ldap3/strategy/asyncStream.py | 119 + .../ldap3/strategy/asynchronous.py | 292 + .../site-packages/ldap3/strategy/base.py | 925 +++ .../ldap3/strategy/ldifProducer.py | 152 + .../site-packages/ldap3/strategy/mockAsync.py | 200 + .../site-packages/ldap3/strategy/mockBase.py | 921 +++ .../site-packages/ldap3/strategy/mockSync.py | 133 + .../ldap3/strategy/restartable.py | 260 + .../site-packages/ldap3/strategy/reusable.py | 495 ++ .../ldap3/strategy/safeRestartable.py | 32 + .../site-packages/ldap3/strategy/safeSync.py | 32 + .../site-packages/ldap3/strategy/sync.py | 251 + .../site-packages/ldap3/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 138 bytes .../utils/__pycache__/asn1.cpython-35.pyc | Bin 0 -> 6875 bytes .../utils/__pycache__/ciDict.cpython-35.pyc | Bin 0 -> 6384 bytes .../utils/__pycache__/config.cpython-35.pyc | Bin 0 -> 5973 bytes .../utils/__pycache__/conv.cpython-35.pyc | Bin 0 -> 6940 bytes .../ldap3/utils/__pycache__/dn.cpython-35.pyc | Bin 0 -> 9151 bytes .../utils/__pycache__/hashed.cpython-35.pyc | Bin 0 -> 1842 bytes .../utils/__pycache__/log.cpython-35.pyc | Bin 0 -> 5915 bytes .../utils/__pycache__/ntlm.cpython-35.pyc | Bin 0 -> 12647 bytes .../utils/__pycache__/ordDict.cpython-35.pyc | Bin 0 -> 3883 bytes .../port_validators.cpython-35.pyc | Bin 0 -> 1429 bytes .../utils/__pycache__/repr.cpython-35.pyc | Bin 0 -> 786 bytes .../__pycache__/tls_backport.cpython-35.pyc | Bin 0 -> 2845 bytes .../utils/__pycache__/uri.cpython-35.pyc | Bin 0 -> 1477 bytes .../site-packages/ldap3/utils/asn1.py | 245 + .../site-packages/ldap3/utils/ciDict.py | 199 + .../site-packages/ldap3/utils/config.py | 299 + .../site-packages/ldap3/utils/conv.py | 272 + .../python3.5/site-packages/ldap3/utils/dn.py | 405 ++ .../site-packages/ldap3/utils/hashed.py | 94 + .../site-packages/ldap3/utils/log.py | 216 + .../site-packages/ldap3/utils/ntlm.py | 505 ++ .../site-packages/ldap3/utils/ordDict.py | 130 + .../ldap3/utils/port_validators.py | 37 + .../site-packages/ldap3/utils/repr.py | 51 + .../site-packages/ldap3/utils/tls_backport.py | 133 + .../site-packages/ldap3/utils/uri.py | 118 + .../python3.5/site-packages/ldap3/version.py | 13 + .../pip-18.1.dist-info/DESCRIPTION.rst | 44 + .../pip-18.1.dist-info/INSTALLER | 1 + .../pip-18.1.dist-info/LICENSE.txt | 20 + .../site-packages/pip-18.1.dist-info/METADATA | 70 + .../site-packages/pip-18.1.dist-info/RECORD | 174 + .../site-packages/pip-18.1.dist-info/WHEEL | 6 + .../pip-18.1.dist-info/entry_points.txt | 5 + .../pip-18.1.dist-info/metadata.json | 1 + .../pip-18.1.dist-info/top_level.txt | 1 + .../python3.5/site-packages/pip/__init__.py | 1 + .../python3.5/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 150 bytes .../pip/__pycache__/__main__.cpython-35.pyc | Bin 0 -> 445 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 1947 bytes .../__pycache__/build_env.cpython-35.pyc | Bin 0 -> 5428 bytes .../__pycache__/cache.cpython-35.pyc | Bin 0 -> 7192 bytes .../__pycache__/configuration.cpython-35.pyc | Bin 0 -> 10524 bytes .../__pycache__/download.cpython-35.pyc | Bin 0 -> 22814 bytes .../__pycache__/exceptions.cpython-35.pyc | Bin 0 -> 12049 bytes .../__pycache__/index.cpython-35.pyc | Bin 0 -> 24973 bytes .../__pycache__/locations.cpython-35.pyc | Bin 0 -> 4640 bytes .../__pycache__/pep425tags.cpython-35.pyc | Bin 0 -> 8133 bytes .../__pycache__/pyproject.cpython-35.pyc | Bin 0 -> 2842 bytes .../__pycache__/resolve.cpython-35.pyc | Bin 0 -> 9008 bytes .../__pycache__/wheel.cpython-35.pyc | Bin 0 -> 22882 bytes .../site-packages/pip/_internal/build_env.py | 142 + .../site-packages/pip/_internal/cache.py | 202 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 227 bytes .../__pycache__/autocompletion.cpython-35.pyc | Bin 0 -> 5543 bytes .../__pycache__/base_command.cpython-35.pyc | Bin 0 -> 6884 bytes .../cli/__pycache__/cmdoptions.cpython-35.pyc | Bin 0 -> 15976 bytes .../__pycache__/main_parser.cpython-35.pyc | Bin 0 -> 2400 bytes .../cli/__pycache__/parser.cpython-35.pyc | Bin 0 -> 9547 bytes .../__pycache__/status_codes.cpython-35.pyc | Bin 0 -> 370 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 278 + .../pip/_internal/cli/cmdoptions.py | 714 +++ .../pip/_internal/cli/main_parser.py | 96 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 2621 bytes .../commands/__pycache__/check.cpython-35.pyc | Bin 0 -> 1347 bytes .../__pycache__/completion.cpython-35.pyc | Bin 0 -> 3191 bytes .../__pycache__/configuration.cpython-35.pyc | Bin 0 -> 6853 bytes .../__pycache__/download.cpython-35.pyc | Bin 0 -> 5014 bytes .../__pycache__/freeze.cpython-35.pyc | Bin 0 -> 3020 bytes .../commands/__pycache__/hash.cpython-35.pyc | Bin 0 -> 2148 bytes .../commands/__pycache__/help.cpython-35.pyc | Bin 0 -> 1273 bytes .../__pycache__/install.cpython-35.pyc | Bin 0 -> 13231 bytes .../commands/__pycache__/list.cpython-35.pyc | Bin 0 -> 9667 bytes .../__pycache__/search.cpython-35.pyc | Bin 0 -> 4592 bytes .../commands/__pycache__/show.cpython-35.pyc | Bin 0 -> 6437 bytes .../__pycache__/uninstall.cpython-35.pyc | Bin 0 -> 2792 bytes .../commands/__pycache__/wheel.cpython-35.pyc | Bin 0 -> 5231 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 174 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 555 ++ .../pip/_internal/commands/list.py | 306 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 387 ++ .../site-packages/pip/_internal/download.py | 921 +++ .../site-packages/pip/_internal/exceptions.py | 268 + .../site-packages/pip/_internal/index.py | 899 +++ .../site-packages/pip/_internal/locations.py | 194 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 215 bytes .../__pycache__/candidate.cpython-35.pyc | Bin 0 -> 1093 bytes .../__pycache__/format_control.cpython-35.pyc | Bin 0 -> 2559 bytes .../models/__pycache__/index.cpython-35.pyc | Bin 0 -> 1169 bytes .../models/__pycache__/link.cpython-35.pyc | Bin 0 -> 5050 bytes .../pip/_internal/models/candidate.py | 23 + .../pip/_internal/models/format_control.py | 62 + .../pip/_internal/models/index.py | 29 + .../pip/_internal/models/link.py | 141 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 149 bytes .../__pycache__/check.cpython-35.pyc | Bin 0 -> 3613 bytes .../__pycache__/freeze.cpython-35.pyc | Bin 0 -> 6913 bytes .../__pycache__/prepare.cpython-35.pyc | Bin 0 -> 9748 bytes .../pip/_internal/operations/check.py | 148 + .../pip/_internal/operations/freeze.py | 264 + .../pip/_internal/operations/prepare.py | 355 + .../site-packages/pip/_internal/pep425tags.py | 317 + .../site-packages/pip/_internal/pyproject.py | 144 + .../pip/_internal/req/__init__.py | 69 + .../req/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 1600 bytes .../__pycache__/constructors.cpython-35.pyc | Bin 0 -> 7574 bytes .../req/__pycache__/req_file.cpython-35.pyc | Bin 0 -> 9291 bytes .../__pycache__/req_install.cpython-35.pyc | Bin 0 -> 24955 bytes .../req/__pycache__/req_set.cpython-35.pyc | Bin 0 -> 6144 bytes .../__pycache__/req_tracker.cpython-35.pyc | Bin 0 -> 3093 bytes .../__pycache__/req_uninstall.cpython-35.pyc | Bin 0 -> 14068 bytes .../pip/_internal/req/constructors.py | 298 + .../pip/_internal/req/req_file.py | 340 + .../pip/_internal/req/req_install.py | 860 +++ .../pip/_internal/req/req_set.py | 181 + .../pip/_internal/req/req_tracker.py | 76 + .../pip/_internal/req/req_uninstall.py | 460 ++ .../site-packages/pip/_internal/resolve.py | 353 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 144 bytes .../utils/__pycache__/appdirs.cpython-35.pyc | Bin 0 -> 8267 bytes .../utils/__pycache__/compat.cpython-35.pyc | Bin 0 -> 6455 bytes .../__pycache__/deprecation.cpython-35.pyc | Bin 0 -> 2672 bytes .../utils/__pycache__/encoding.cpython-35.pyc | Bin 0 -> 1194 bytes .../__pycache__/filesystem.cpython-35.pyc | Bin 0 -> 673 bytes .../utils/__pycache__/glibc.cpython-35.pyc | Bin 0 -> 1615 bytes .../utils/__pycache__/hashes.cpython-35.pyc | Bin 0 -> 3449 bytes .../utils/__pycache__/logging.cpython-35.pyc | Bin 0 -> 5712 bytes .../utils/__pycache__/misc.cpython-35.pyc | Bin 0 -> 26371 bytes .../utils/__pycache__/models.cpython-35.pyc | Bin 0 -> 1997 bytes .../utils/__pycache__/outdated.cpython-35.pyc | Bin 0 -> 4222 bytes .../__pycache__/packaging.cpython-35.pyc | Bin 0 -> 2533 bytes .../setuptools_build.cpython-35.pyc | Bin 0 -> 341 bytes .../utils/__pycache__/temp_dir.cpython-35.pyc | Bin 0 -> 2886 bytes .../utils/__pycache__/typing.cpython-35.pyc | Bin 0 -> 1292 bytes .../utils/__pycache__/ui.cpython-35.pyc | Bin 0 -> 12680 bytes .../pip/_internal/utils/appdirs.py | 258 + .../pip/_internal/utils/compat.py | 248 + .../pip/_internal/utils/deprecation.py | 89 + .../pip/_internal/utils/encoding.py | 33 + .../pip/_internal/utils/filesystem.py | 28 + .../pip/_internal/utils/glibc.py | 84 + .../pip/_internal/utils/hashes.py | 94 + .../pip/_internal/utils/logging.py | 225 + .../site-packages/pip/_internal/utils/misc.py | 958 +++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 154 + .../pip/_internal/utils/packaging.py | 75 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 82 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 421 ++ .../pip/_internal/vcs/__init__.py | 509 ++ .../vcs/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 16427 bytes .../vcs/__pycache__/bazaar.cpython-35.pyc | Bin 0 -> 4095 bytes .../vcs/__pycache__/git.cpython-35.pyc | Bin 0 -> 9963 bytes .../vcs/__pycache__/mercurial.cpython-35.pyc | Bin 0 -> 4058 bytes .../vcs/__pycache__/subversion.cpython-35.pyc | Bin 0 -> 6955 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 346 + .../pip/_internal/vcs/mercurial.py | 101 + .../pip/_internal/vcs/subversion.py | 213 + .../site-packages/pip/_internal/wheel.py | 831 +++ .../site-packages/pip/_vendor/__init__.py | 114 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 3046 bytes .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 237 bytes .../__pycache__/_in_process.cpython-35.pyc | Bin 0 -> 5650 bytes .../pep517/__pycache__/check.cpython-35.pyc | Bin 0 -> 5119 bytes .../__pycache__/colorlog.cpython-35.pyc | Bin 0 -> 3102 bytes .../pep517/__pycache__/compat.cpython-35.pyc | Bin 0 -> 1033 bytes .../__pycache__/envbuild.cpython-35.pyc | Bin 0 -> 4450 bytes .../__pycache__/wrappers.cpython-35.pyc | Bin 0 -> 4920 bytes .../pip/_vendor/pep517/_in_process.py | 182 + .../site-packages/pip/_vendor/pep517/check.py | 194 + .../pip/_vendor/pep517/colorlog.py | 110 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 150 + .../pip/_vendor/pep517/wrappers.py | 134 + .../DESCRIPTION.rst | 3 + .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 + .../pkg_resources-0.0.0.dist-info/METADATA | 13 + .../pkg_resources-0.0.0.dist-info/RECORD | 36 + .../pkg_resources-0.0.0.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../site-packages/pkg_resources/__init__.py | 3053 +++++++++ .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 101907 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 156 bytes .../__pycache__/appdirs.cpython-35.pyc | Bin 0 -> 19682 bytes .../__pycache__/pyparsing.cpython-35.pyc | Bin 0 -> 212239 bytes .../_vendor/__pycache__/six.cpython-35.pyc | Bin 0 -> 26371 bytes .../pkg_resources/_vendor/appdirs.py | 552 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-35.pyc | Bin 0 -> 726 bytes .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 566 bytes .../__pycache__/_compat.cpython-35.pyc | Bin 0 -> 1042 bytes .../__pycache__/_structures.cpython-35.pyc | Bin 0 -> 2962 bytes .../__pycache__/markers.cpython-35.pyc | Bin 0 -> 9546 bytes .../__pycache__/requirements.cpython-35.pyc | Bin 0 -> 4262 bytes .../__pycache__/specifiers.cpython-35.pyc | Bin 0 -> 21162 bytes .../__pycache__/utils.cpython-35.pyc | Bin 0 -> 488 bytes .../__pycache__/version.cpython-35.pyc | Bin 0 -> 11442 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 +++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 ++ .../pkg_resources/_vendor/pyparsing.py | 5696 +++++++++++++++++ .../pkg_resources/_vendor/six.py | 868 +++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 2513 bytes .../pyasn1-0.4.8.dist-info/INSTALLER | 1 + .../pyasn1-0.4.8.dist-info/LICENSE.rst | 24 + .../pyasn1-0.4.8.dist-info/METADATA | 38 + .../pyasn1-0.4.8.dist-info/RECORD | 79 + .../pyasn1-0.4.8.dist-info/WHEEL | 6 + .../pyasn1-0.4.8.dist-info/top_level.txt | 1 + .../pyasn1-0.4.8.dist-info/zip-safe | 1 + .../site-packages/pyasn1/__init__.py | 7 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 309 bytes .../pyasn1/__pycache__/debug.cpython-35.pyc | Bin 0 -> 4764 bytes .../pyasn1/__pycache__/error.cpython-35.pyc | Bin 0 -> 2978 bytes .../site-packages/pyasn1/codec/__init__.py | 1 + .../codec/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 140 bytes .../pyasn1/codec/ber/__init__.py | 1 + .../ber/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 144 bytes .../ber/__pycache__/decoder.cpython-35.pyc | Bin 0 -> 33664 bytes .../ber/__pycache__/encoder.cpython-35.pyc | Bin 0 -> 17672 bytes .../codec/ber/__pycache__/eoo.cpython-35.pyc | Bin 0 -> 792 bytes .../site-packages/pyasn1/codec/ber/decoder.py | 1682 +++++ .../site-packages/pyasn1/codec/ber/encoder.py | 890 +++ .../site-packages/pyasn1/codec/ber/eoo.py | 28 + .../pyasn1/codec/cer/__init__.py | 1 + .../cer/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 144 bytes .../cer/__pycache__/decoder.cpython-35.pyc | Bin 0 -> 1750 bytes .../cer/__pycache__/encoder.cpython-35.pyc | Bin 0 -> 6943 bytes .../site-packages/pyasn1/codec/cer/decoder.py | 114 + .../site-packages/pyasn1/codec/cer/encoder.py | 313 + .../pyasn1/codec/der/__init__.py | 1 + .../der/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 144 bytes .../der/__pycache__/decoder.cpython-35.pyc | Bin 0 -> 1178 bytes .../der/__pycache__/encoder.cpython-35.pyc | Bin 0 -> 1723 bytes .../site-packages/pyasn1/codec/der/decoder.py | 94 + .../site-packages/pyasn1/codec/der/encoder.py | 107 + .../pyasn1/codec/native/__init__.py | 1 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 147 bytes .../native/__pycache__/decoder.cpython-35.pyc | Bin 0 -> 5062 bytes .../native/__pycache__/encoder.cpython-35.pyc | Bin 0 -> 7498 bytes .../pyasn1/codec/native/decoder.py | 213 + .../pyasn1/codec/native/encoder.py | 256 + .../site-packages/pyasn1/compat/__init__.py | 1 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 141 bytes .../compat/__pycache__/binary.cpython-35.pyc | Bin 0 -> 601 bytes .../compat/__pycache__/calling.cpython-35.pyc | Bin 0 -> 460 bytes .../__pycache__/dateandtime.cpython-35.pyc | Bin 0 -> 594 bytes .../compat/__pycache__/integer.cpython-35.pyc | Bin 0 -> 2505 bytes .../compat/__pycache__/octets.cpython-35.pyc | Bin 0 -> 2026 bytes .../compat/__pycache__/string.cpython-35.pyc | Bin 0 -> 578 bytes .../site-packages/pyasn1/compat/binary.py | 33 + .../site-packages/pyasn1/compat/calling.py | 20 + .../pyasn1/compat/dateandtime.py | 22 + .../site-packages/pyasn1/compat/integer.py | 110 + .../site-packages/pyasn1/compat/octets.py | 46 + .../site-packages/pyasn1/compat/string.py | 26 + .../python3.5/site-packages/pyasn1/debug.py | 157 + .../python3.5/site-packages/pyasn1/error.py | 75 + .../site-packages/pyasn1/type/__init__.py | 1 + .../type/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 139 bytes .../type/__pycache__/base.cpython-35.pyc | Bin 0 -> 23507 bytes .../type/__pycache__/char.cpython-35.pyc | Bin 0 -> 9180 bytes .../__pycache__/constraint.cpython-35.pyc | Bin 0 -> 25455 bytes .../type/__pycache__/error.cpython-35.pyc | Bin 0 -> 363 bytes .../type/__pycache__/namedtype.cpython-35.pyc | Bin 0 -> 19908 bytes .../type/__pycache__/namedval.cpython-35.pyc | Bin 0 -> 5860 bytes .../type/__pycache__/opentype.cpython-35.pyc | Bin 0 -> 3478 bytes .../type/__pycache__/tag.cpython-35.pyc | Bin 0 -> 10769 bytes .../type/__pycache__/tagmap.cpython-35.pyc | Bin 0 -> 3428 bytes .../type/__pycache__/univ.cpython-35.pyc | Bin 0 -> 101813 bytes .../type/__pycache__/useful.cpython-35.pyc | Bin 0 -> 5076 bytes .../site-packages/pyasn1/type/base.py | 707 ++ .../site-packages/pyasn1/type/char.py | 335 + .../site-packages/pyasn1/type/constraint.py | 756 +++ .../site-packages/pyasn1/type/error.py | 11 + .../site-packages/pyasn1/type/namedtype.py | 561 ++ .../site-packages/pyasn1/type/namedval.py | 192 + .../site-packages/pyasn1/type/opentype.py | 104 + .../site-packages/pyasn1/type/tag.py | 335 + .../site-packages/pyasn1/type/tagmap.py | 96 + .../site-packages/pyasn1/type/univ.py | 3321 ++++++++++ .../site-packages/pyasn1/type/useful.py | 191 + .../DESCRIPTION.rst | 25 + .../setuptools-33.1.1.dist-info/INSTALLER | 1 + .../setuptools-33.1.1.dist-info/METADATA | 51 + .../setuptools-33.1.1.dist-info/RECORD | 119 + .../setuptools-33.1.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 62 + .../setuptools-33.1.1.dist-info/metadata.json | 1 + .../setuptools-33.1.1.dist-info/top_level.txt | 3 + .../setuptools-33.1.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 160 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 5962 bytes .../__pycache__/archive_util.cpython-35.pyc | Bin 0 -> 5475 bytes .../__pycache__/config.cpython-35.pyc | Bin 0 -> 15019 bytes .../__pycache__/depends.cpython-35.pyc | Bin 0 -> 5631 bytes .../__pycache__/dist.cpython-35.pyc | Bin 0 -> 34591 bytes .../__pycache__/extension.cpython-35.pyc | Bin 0 -> 2061 bytes .../__pycache__/glob.cpython-35.pyc | Bin 0 -> 4149 bytes .../__pycache__/launch.cpython-35.pyc | Bin 0 -> 882 bytes .../__pycache__/lib2to3_ex.cpython-35.pyc | Bin 0 -> 2557 bytes .../__pycache__/monkey.cpython-35.pyc | Bin 0 -> 5037 bytes .../__pycache__/msvc.cpython-35.pyc | Bin 0 -> 33572 bytes .../__pycache__/namespaces.cpython-35.pyc | Bin 0 -> 3875 bytes .../__pycache__/package_index.cpython-35.pyc | Bin 0 -> 35449 bytes .../__pycache__/py26compat.cpython-35.pyc | Bin 0 -> 1065 bytes .../__pycache__/py27compat.cpython-35.pyc | Bin 0 -> 875 bytes .../__pycache__/py31compat.cpython-35.pyc | Bin 0 -> 1974 bytes .../__pycache__/py33compat.cpython-35.pyc | Bin 0 -> 1291 bytes .../__pycache__/py36compat.cpython-35.pyc | Bin 0 -> 2355 bytes .../__pycache__/sandbox.cpython-35.pyc | Bin 0 -> 16501 bytes .../__pycache__/site-patch.cpython-35.pyc | Bin 0 -> 1664 bytes .../__pycache__/ssl_support.cpython-35.pyc | Bin 0 -> 7162 bytes .../__pycache__/unicode_utils.cpython-35.pyc | Bin 0 -> 1214 bytes .../__pycache__/version.cpython-35.pyc | Bin 0 -> 299 bytes .../windows_support.cpython-35.pyc | Bin 0 -> 1031 bytes .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 721 bytes .../command/__pycache__/alias.cpython-35.pyc | Bin 0 -> 2607 bytes .../__pycache__/bdist_egg.cpython-35.pyc | Bin 0 -> 14945 bytes .../__pycache__/bdist_rpm.cpython-35.pyc | Bin 0 -> 1833 bytes .../__pycache__/bdist_wininst.cpython-35.pyc | Bin 0 -> 981 bytes .../__pycache__/build_ext.cpython-35.pyc | Bin 0 -> 10931 bytes .../__pycache__/build_py.cpython-35.pyc | Bin 0 -> 9256 bytes .../__pycache__/develop.cpython-35.pyc | Bin 0 -> 6518 bytes .../__pycache__/easy_install.cpython-35.pyc | Bin 0 -> 71233 bytes .../__pycache__/egg_info.cpython-35.pyc | Bin 0 -> 22536 bytes .../__pycache__/install.cpython-35.pyc | Bin 0 -> 4235 bytes .../install_egg_info.cpython-35.pyc | Bin 0 -> 3197 bytes .../__pycache__/install_lib.cpython-35.pyc | Bin 0 -> 5407 bytes .../install_scripts.cpython-35.pyc | Bin 0 -> 2444 bytes .../__pycache__/py36compat.cpython-35.pyc | Bin 0 -> 4916 bytes .../__pycache__/register.cpython-35.pyc | Bin 0 -> 586 bytes .../command/__pycache__/rotate.cpython-35.pyc | Bin 0 -> 2752 bytes .../__pycache__/saveopts.cpython-35.pyc | Bin 0 -> 951 bytes .../command/__pycache__/sdist.cpython-35.pyc | Bin 0 -> 6643 bytes .../command/__pycache__/setopt.cpython-35.pyc | Bin 0 -> 4925 bytes .../command/__pycache__/test.cpython-35.pyc | Bin 0 -> 8354 bytes .../command/__pycache__/upload.cpython-35.pyc | Bin 0 -> 1382 bytes .../__pycache__/upload_docs.cpython-35.pyc | Bin 0 -> 6577 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 472 ++ .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 201 + .../setuptools/command/easy_install.py | 2347 +++++++ .../setuptools/command/egg_info.py | 692 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 10 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 206 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 254 + .../setuptools/command/upload.py | 38 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 558 ++ .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 925 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 4 + .../__pycache__/__init__.cpython-35.pyc | Bin 0 -> 305 bytes .../site-packages/setuptools/glob.py | 176 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 191 + .../site-packages/setuptools/msvc.py | 1193 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1115 ++++ .../site-packages/setuptools/py26compat.py | 31 + .../site-packages/setuptools/py27compat.py | 29 + .../site-packages/setuptools/py31compat.py | 56 + .../site-packages/setuptools/py33compat.py | 45 + .../site-packages/setuptools/py36compat.py | 82 + .../site-packages/setuptools/sandbox.py | 491 ++ .../setuptools/script (dev).tmpl | 5 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 255 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../setuptools/windows_support.py | 29 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 281 bytes .../python3.7/site-packages/easy_install.py | 5 + .../ldap3-2.9.1.dist-info/COPYING.LESSER.txt | 165 + .../ldap3-2.9.1.dist-info/COPYING.txt | 674 ++ .../ldap3-2.9.1.dist-info/INSTALLER | 1 + .../ldap3-2.9.1.dist-info/LICENSE.txt | 13 + .../ldap3-2.9.1.dist-info/METADATA | 165 + .../ldap3-2.9.1.dist-info/RECORD | 230 + .../site-packages/ldap3-2.9.1.dist-info/WHEEL | 6 + .../ldap3-2.9.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/ldap3/__init__.py | 150 + .../ldap3/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3214 bytes .../ldap3/__pycache__/version.cpython-37.pyc | Bin 0 -> 438 bytes .../site-packages/ldap3/abstract/__init__.py | 50 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 697 bytes .../__pycache__/attrDef.cpython-37.pyc | Bin 0 -> 3832 bytes .../__pycache__/attribute.cpython-37.pyc | Bin 0 -> 8985 bytes .../__pycache__/cursor.cpython-37.pyc | Bin 0 -> 26454 bytes .../abstract/__pycache__/entry.cpython-37.pyc | Bin 0 -> 20850 bytes .../__pycache__/objectDef.cpython-37.pyc | Bin 0 -> 8659 bytes .../site-packages/ldap3/abstract/attrDef.py | 121 + .../site-packages/ldap3/abstract/attribute.py | 290 + .../site-packages/ldap3/abstract/cursor.py | 912 +++ .../site-packages/ldap3/abstract/entry.py | 712 +++ .../site-packages/ldap3/abstract/objectDef.py | 270 + .../site-packages/ldap3/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 141 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 45232 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 21365 bytes .../core/__pycache__/pooling.cpython-37.pyc | Bin 0 -> 9548 bytes .../core/__pycache__/rdns.cpython-37.pyc | Bin 0 -> 1739 bytes .../core/__pycache__/results.cpython-37.pyc | Bin 0 -> 3483 bytes .../core/__pycache__/server.cpython-37.pyc | Bin 0 -> 18982 bytes .../core/__pycache__/timezone.cpython-37.pyc | Bin 0 -> 1446 bytes .../ldap3/core/__pycache__/tls.cpython-37.pyc | Bin 0 -> 8185 bytes .../core/__pycache__/usage.cpython-37.pyc | Bin 0 -> 7026 bytes .../site-packages/ldap3/core/connection.py | 1605 +++++ .../site-packages/ldap3/core/exceptions.py | 608 ++ .../site-packages/ldap3/core/pooling.py | 329 + .../site-packages/ldap3/core/rdns.py | 68 + .../site-packages/ldap3/core/results.py | 137 + .../site-packages/ldap3/core/server.py | 682 ++ .../site-packages/ldap3/core/timezone.py | 56 + .../python3.7/site-packages/ldap3/core/tls.py | 327 + .../site-packages/ldap3/core/usage.py | 229 + .../site-packages/ldap3/extend/__init__.py | 334 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9061 bytes .../__pycache__/operation.cpython-37.pyc | Bin 0 -> 2521 bytes .../ldap3/extend/microsoft/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 153 bytes .../addMembersToGroups.cpython-37.pyc | Bin 0 -> 2716 bytes .../__pycache__/dirSync.cpython-37.pyc | Bin 0 -> 1952 bytes .../__pycache__/modifyPassword.cpython-37.pyc | Bin 0 -> 1381 bytes .../persistentSearch.cpython-37.pyc | Bin 0 -> 2532 bytes .../removeMembersFromGroups.cpython-37.pyc | Bin 0 -> 2650 bytes .../__pycache__/unlockAccount.cpython-37.pyc | Bin 0 -> 1044 bytes .../extend/microsoft/addMembersToGroups.py | 98 + .../ldap3/extend/microsoft/dirSync.py | 94 + .../ldap3/extend/microsoft/modifyPassword.py | 75 + .../extend/microsoft/persistentSearch.py | 117 + .../microsoft/removeMembersFromGroups.py | 99 + .../ldap3/extend/microsoft/unlockAccount.py | 57 + .../ldap3/extend/novell/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 150 bytes .../addMembersToGroups.cpython-37.pyc | Bin 0 -> 4167 bytes .../checkGroupsMemberships.cpython-37.pyc | Bin 0 -> 4923 bytes .../__pycache__/endTransaction.cpython-37.pyc | Bin 0 -> 1571 bytes .../__pycache__/getBindDn.cpython-37.pyc | Bin 0 -> 948 bytes .../__pycache__/listReplicas.cpython-37.pyc | Bin 0 -> 1478 bytes .../nmasGetUniversalPassword.cpython-37.pyc | Bin 0 -> 1567 bytes .../nmasSetUniversalPassword.cpython-37.pyc | Bin 0 -> 1492 bytes .../partition_entry_count.cpython-37.pyc | Bin 0 -> 1577 bytes .../removeMembersFromGroups.cpython-37.pyc | Bin 0 -> 4209 bytes .../__pycache__/replicaInfo.cpython-37.pyc | Bin 0 -> 2059 bytes .../startTransaction.cpython-37.pyc | Bin 0 -> 1717 bytes .../ldap3/extend/novell/addMembersToGroups.py | 167 + .../extend/novell/checkGroupsMemberships.py | 180 + .../ldap3/extend/novell/endTransaction.py | 58 + .../ldap3/extend/novell/getBindDn.py | 41 + .../ldap3/extend/novell/listReplicas.py | 50 + .../extend/novell/nmasGetUniversalPassword.py | 56 + .../extend/novell/nmasSetUniversalPassword.py | 52 + .../extend/novell/partition_entry_count.py | 57 + .../extend/novell/removeMembersFromGroups.py | 170 + .../ldap3/extend/novell/replicaInfo.py | 79 + .../ldap3/extend/novell/startTransaction.py | 56 + .../site-packages/ldap3/extend/operation.py | 98 + .../ldap3/extend/standard/PagedSearch.py | 146 + .../ldap3/extend/standard/PersistentSearch.py | 137 + .../ldap3/extend/standard/__init__.py | 0 .../__pycache__/PagedSearch.cpython-37.pyc | Bin 0 -> 2382 bytes .../PersistentSearch.cpython-37.pyc | Bin 0 -> 2837 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 152 bytes .../__pycache__/modifyPassword.cpython-37.pyc | Bin 0 -> 1983 bytes .../__pycache__/whoAmI.cpython-37.pyc | Bin 0 -> 860 bytes .../ldap3/extend/standard/modifyPassword.py | 72 + .../ldap3/extend/standard/whoAmI.py | 40 + .../site-packages/ldap3/operation/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 146 bytes .../__pycache__/abandon.cpython-37.pyc | Bin 0 -> 518 bytes .../operation/__pycache__/add.cpython-37.pyc | Bin 0 -> 1604 bytes .../operation/__pycache__/bind.cpython-37.pyc | Bin 0 -> 4304 bytes .../__pycache__/compare.cpython-37.pyc | Bin 0 -> 1454 bytes .../__pycache__/delete.cpython-37.pyc | Bin 0 -> 908 bytes .../__pycache__/extended.cpython-37.pyc | Bin 0 -> 2622 bytes .../__pycache__/modify.cpython-37.pyc | Bin 0 -> 2021 bytes .../__pycache__/modifyDn.cpython-37.pyc | Bin 0 -> 1294 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 16250 bytes .../__pycache__/unbind.cpython-37.pyc | Bin 0 -> 339 bytes .../site-packages/ldap3/operation/abandon.py | 36 + .../site-packages/ldap3/operation/add.py | 72 + .../site-packages/ldap3/operation/bind.py | 160 + .../site-packages/ldap3/operation/compare.py | 64 + .../site-packages/ldap3/operation/delete.py | 46 + .../site-packages/ldap3/operation/extended.py | 109 + .../site-packages/ldap3/operation/modify.py | 96 + .../site-packages/ldap3/operation/modifyDn.py | 62 + .../site-packages/ldap3/operation/search.py | 579 ++ .../site-packages/ldap3/operation/unbind.py | 32 + .../site-packages/ldap3/protocol/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 145 bytes .../__pycache__/controls.cpython-37.pyc | Bin 0 -> 614 bytes .../__pycache__/convert.cpython-37.pyc | Bin 0 -> 8765 bytes .../__pycache__/microsoft.cpython-37.pyc | Bin 0 -> 3069 bytes .../__pycache__/novell.cpython-37.pyc | Bin 0 -> 4772 bytes .../protocol/__pycache__/oid.cpython-37.pyc | Bin 0 -> 92883 bytes .../persistentSearch.cpython-37.pyc | Bin 0 -> 1638 bytes .../__pycache__/rfc2696.cpython-37.pyc | Bin 0 -> 1474 bytes .../__pycache__/rfc2849.cpython-37.pyc | Bin 0 -> 6866 bytes .../__pycache__/rfc3062.cpython-37.pyc | Bin 0 -> 2280 bytes .../__pycache__/rfc4511.cpython-37.pyc | Bin 0 -> 23274 bytes .../__pycache__/rfc4512.cpython-37.pyc | Bin 0 -> 25887 bytes .../__pycache__/rfc4527.cpython-37.pyc | Bin 0 -> 1314 bytes .../site-packages/ldap3/protocol/controls.py | 40 + .../site-packages/ldap3/protocol/convert.py | 221 + .../ldap3/protocol/formatters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 156 bytes .../__pycache__/formatters.cpython-37.pyc | Bin 0 -> 10235 bytes .../__pycache__/standard.cpython-37.pyc | Bin 0 -> 6855 bytes .../__pycache__/validators.cpython-37.pyc | Bin 0 -> 10697 bytes .../ldap3/protocol/formatters/formatters.py | 436 ++ .../ldap3/protocol/formatters/standard.py | 238 + .../ldap3/protocol/formatters/validators.py | 502 ++ .../site-packages/ldap3/protocol/microsoft.py | 142 + .../site-packages/ldap3/protocol/novell.py | 141 + .../site-packages/ldap3/protocol/oid.py | 1208 ++++ .../ldap3/protocol/persistentSearch.py | 85 + .../site-packages/ldap3/protocol/rfc2696.py | 70 + .../site-packages/ldap3/protocol/rfc2849.py | 295 + .../site-packages/ldap3/protocol/rfc3062.py | 91 + .../site-packages/ldap3/protocol/rfc4511.py | 1007 +++ .../site-packages/ldap3/protocol/rfc4512.py | 850 +++ .../site-packages/ldap3/protocol/rfc4527.py | 57 + .../ldap3/protocol/sasl/__init__.py | 0 .../sasl/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 150 bytes .../sasl/__pycache__/digestMd5.cpython-37.pyc | Bin 0 -> 3434 bytes .../sasl/__pycache__/external.cpython-37.pyc | Bin 0 -> 399 bytes .../sasl/__pycache__/kerberos.cpython-37.pyc | Bin 0 -> 8467 bytes .../sasl/__pycache__/plain.cpython-37.pyc | Bin 0 -> 718 bytes .../sasl/__pycache__/sasl.cpython-37.pyc | Bin 0 -> 4082 bytes .../ldap3/protocol/sasl/digestMd5.py | 159 + .../ldap3/protocol/sasl/external.py | 32 + .../ldap3/protocol/sasl/kerberos.py | 302 + .../ldap3/protocol/sasl/plain.py | 70 + .../site-packages/ldap3/protocol/sasl/sasl.py | 171 + .../ldap3/protocol/schemas/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 153 bytes .../__pycache__/ad2012R2.cpython-37.pyc | Bin 0 -> 330831 bytes .../schemas/__pycache__/ds389.cpython-37.pyc | Bin 0 -> 308126 bytes .../__pycache__/edir888.cpython-37.pyc | Bin 0 -> 176106 bytes .../__pycache__/edir914.cpython-37.pyc | Bin 0 -> 180374 bytes .../__pycache__/slapd24.cpython-37.pyc | Bin 0 -> 127852 bytes .../ldap3/protocol/schemas/ad2012R2.py | 2232 +++++++ .../ldap3/protocol/schemas/ds389.py | 1715 +++++ .../ldap3/protocol/schemas/edir888.py | 1127 ++++ .../ldap3/protocol/schemas/edir914.py | 1157 ++++ .../ldap3/protocol/schemas/slapd24.py | 758 +++ .../site-packages/ldap3/strategy/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 145 bytes .../__pycache__/asyncStream.cpython-37.pyc | Bin 0 -> 3024 bytes .../__pycache__/asynchronous.cpython-37.pyc | Bin 0 -> 8662 bytes .../strategy/__pycache__/base.cpython-37.pyc | Bin 0 -> 27361 bytes .../__pycache__/ldifProducer.cpython-37.pyc | Bin 0 -> 4966 bytes .../__pycache__/mockAsync.cpython-37.pyc | Bin 0 -> 4655 bytes .../__pycache__/mockBase.cpython-37.pyc | Bin 0 -> 20859 bytes .../__pycache__/mockSync.cpython-37.pyc | Bin 0 -> 4258 bytes .../__pycache__/restartable.cpython-37.pyc | Bin 0 -> 6883 bytes .../__pycache__/reusable.cpython-37.pyc | Bin 0 -> 15524 bytes .../safeRestartable.cpython-37.pyc | Bin 0 -> 580 bytes .../__pycache__/safeSync.cpython-37.pyc | Bin 0 -> 545 bytes .../strategy/__pycache__/sync.cpython-37.pyc | Bin 0 -> 6826 bytes .../ldap3/strategy/asyncStream.py | 119 + .../ldap3/strategy/asynchronous.py | 292 + .../site-packages/ldap3/strategy/base.py | 925 +++ .../ldap3/strategy/ldifProducer.py | 152 + .../site-packages/ldap3/strategy/mockAsync.py | 200 + .../site-packages/ldap3/strategy/mockBase.py | 921 +++ .../site-packages/ldap3/strategy/mockSync.py | 133 + .../ldap3/strategy/restartable.py | 260 + .../site-packages/ldap3/strategy/reusable.py | 495 ++ .../ldap3/strategy/safeRestartable.py | 32 + .../site-packages/ldap3/strategy/safeSync.py | 32 + .../site-packages/ldap3/strategy/sync.py | 251 + .../site-packages/ldap3/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 142 bytes .../utils/__pycache__/asn1.cpython-37.pyc | Bin 0 -> 6209 bytes .../utils/__pycache__/ciDict.cpython-37.pyc | Bin 0 -> 5846 bytes .../utils/__pycache__/config.cpython-37.pyc | Bin 0 -> 5476 bytes .../utils/__pycache__/conv.cpython-37.pyc | Bin 0 -> 6259 bytes .../ldap3/utils/__pycache__/dn.cpython-37.pyc | Bin 0 -> 8100 bytes .../utils/__pycache__/hashed.cpython-37.pyc | Bin 0 -> 1626 bytes .../utils/__pycache__/log.cpython-37.pyc | Bin 0 -> 5395 bytes .../utils/__pycache__/ntlm.cpython-37.pyc | Bin 0 -> 11329 bytes .../utils/__pycache__/ordDict.cpython-37.pyc | Bin 0 -> 3569 bytes .../port_validators.cpython-37.pyc | Bin 0 -> 1361 bytes .../utils/__pycache__/repr.cpython-37.pyc | Bin 0 -> 720 bytes .../__pycache__/tls_backport.cpython-37.pyc | Bin 0 -> 2626 bytes .../utils/__pycache__/uri.cpython-37.pyc | Bin 0 -> 1322 bytes .../site-packages/ldap3/utils/asn1.py | 245 + .../site-packages/ldap3/utils/ciDict.py | 199 + .../site-packages/ldap3/utils/config.py | 299 + .../site-packages/ldap3/utils/conv.py | 272 + .../python3.7/site-packages/ldap3/utils/dn.py | 405 ++ .../site-packages/ldap3/utils/hashed.py | 94 + .../site-packages/ldap3/utils/log.py | 216 + .../site-packages/ldap3/utils/ntlm.py | 505 ++ .../site-packages/ldap3/utils/ordDict.py | 130 + .../ldap3/utils/port_validators.py | 37 + .../site-packages/ldap3/utils/repr.py | 51 + .../site-packages/ldap3/utils/tls_backport.py | 133 + .../site-packages/ldap3/utils/uri.py | 118 + .../python3.7/site-packages/ldap3/version.py | 13 + .../pip-18.1.dist-info/DESCRIPTION.rst | 44 + .../pip-18.1.dist-info/INSTALLER | 1 + .../pip-18.1.dist-info/LICENSE.txt | 20 + .../site-packages/pip-18.1.dist-info/METADATA | 70 + .../site-packages/pip-18.1.dist-info/RECORD | 174 + .../site-packages/pip-18.1.dist-info/WHEEL | 6 + .../pip-18.1.dist-info/entry_points.txt | 5 + .../pip-18.1.dist-info/metadata.json | 1 + .../pip-18.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/pip/__init__.py | 1 + .../python3.7/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 152 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 406 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1798 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 5007 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 6792 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9791 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 20859 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 11512 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 23133 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4188 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7247 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 2671 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 8438 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 20800 bytes .../site-packages/pip/_internal/build_env.py | 142 + .../site-packages/pip/_internal/cache.py | 202 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 229 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 5042 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 6267 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 14988 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2189 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8893 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 358 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 278 + .../pip/_internal/cli/cmdoptions.py | 714 +++ .../pip/_internal/cli/main_parser.py | 96 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2457 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1259 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3031 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6383 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4611 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2827 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2021 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1197 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 12175 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8870 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4263 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 5844 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2653 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 4874 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 174 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 555 ++ .../pip/_internal/commands/list.py | 306 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 387 ++ .../site-packages/pip/_internal/download.py | 921 +++ .../site-packages/pip/_internal/exceptions.py | 268 + .../site-packages/pip/_internal/index.py | 899 +++ .../site-packages/pip/_internal/locations.py | 194 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 217 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1052 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2387 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1121 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 4719 bytes .../pip/_internal/models/candidate.py | 23 + .../pip/_internal/models/format_control.py | 62 + .../pip/_internal/models/index.py | 29 + .../pip/_internal/models/link.py | 141 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 153 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3330 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 6285 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 9151 bytes .../pip/_internal/operations/check.py | 148 + .../pip/_internal/operations/freeze.py | 264 + .../pip/_internal/operations/prepare.py | 355 + .../site-packages/pip/_internal/pep425tags.py | 317 + .../site-packages/pip/_internal/pyproject.py | 144 + .../pip/_internal/req/__init__.py | 69 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1521 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 6919 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 8620 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 22770 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5734 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 2845 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 12817 bytes .../pip/_internal/req/constructors.py | 298 + .../pip/_internal/req/req_file.py | 340 + .../pip/_internal/req/req_install.py | 860 +++ .../pip/_internal/req/req_set.py | 181 + .../pip/_internal/req/req_tracker.py | 76 + .../pip/_internal/req/req_uninstall.py | 460 ++ .../site-packages/pip/_internal/resolve.py | 353 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 148 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 7869 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 5939 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2522 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1084 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 615 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1506 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3283 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 5316 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 24407 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1897 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 3869 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2348 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 343 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 2760 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1292 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11817 bytes .../pip/_internal/utils/appdirs.py | 258 + .../pip/_internal/utils/compat.py | 248 + .../pip/_internal/utils/deprecation.py | 89 + .../pip/_internal/utils/encoding.py | 33 + .../pip/_internal/utils/filesystem.py | 28 + .../pip/_internal/utils/glibc.py | 84 + .../pip/_internal/utils/hashes.py | 94 + .../pip/_internal/utils/logging.py | 225 + .../site-packages/pip/_internal/utils/misc.py | 958 +++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 154 + .../pip/_internal/utils/packaging.py | 75 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 82 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 421 ++ .../pip/_internal/vcs/__init__.py | 509 ++ .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 15514 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3777 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9082 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3750 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 6352 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 346 + .../pip/_internal/vcs/mercurial.py | 101 + .../pip/_internal/vcs/subversion.py | 213 + .../site-packages/pip/_internal/wheel.py | 831 +++ .../site-packages/pip/_vendor/__init__.py | 114 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2874 bytes .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 237 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 5302 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4701 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2866 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 975 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4132 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 4699 bytes .../pip/_vendor/pep517/_in_process.py | 182 + .../site-packages/pip/_vendor/pep517/check.py | 194 + .../pip/_vendor/pep517/colorlog.py | 110 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 150 + .../pip/_vendor/pep517/wrappers.py | 134 + .../DESCRIPTION.rst | 3 + .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 + .../pkg_resources-0.0.0.dist-info/METADATA | 13 + .../pkg_resources-0.0.0.dist-info/RECORD | 36 + .../pkg_resources-0.0.0.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../site-packages/pkg_resources/__init__.py | 3053 +++++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 95522 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 160 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 18554 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 200911 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24361 bytes .../pkg_resources/_vendor/appdirs.py | 552 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 696 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 534 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 986 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2838 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8846 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3851 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19764 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 465 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10531 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 +++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 ++ .../pkg_resources/_vendor/pyparsing.py | 5696 +++++++++++++++++ .../pkg_resources/_vendor/six.py | 868 +++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2375 bytes .../pyasn1-0.5.1.dist-info/INSTALLER | 1 + .../pyasn1-0.5.1.dist-info/LICENSE.rst | 24 + .../pyasn1-0.5.1.dist-info/METADATA | 231 + .../pyasn1-0.5.1.dist-info/RECORD | 73 + .../pyasn1-0.5.1.dist-info/WHEEL | 6 + .../pyasn1-0.5.1.dist-info/top_level.txt | 1 + .../pyasn1-0.5.1.dist-info/zip-safe | 1 + .../site-packages/pyasn1/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 159 bytes .../pyasn1/__pycache__/debug.cpython-37.pyc | Bin 0 -> 4095 bytes .../pyasn1/__pycache__/error.cpython-37.pyc | Bin 0 -> 4189 bytes .../site-packages/pyasn1/codec/__init__.py | 1 + .../codec/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 144 bytes .../__pycache__/streaming.cpython-37.pyc | Bin 0 -> 5831 bytes .../pyasn1/codec/ber/__init__.py | 1 + .../ber/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 148 bytes .../ber/__pycache__/decoder.cpython-37.pyc | Bin 0 -> 42000 bytes .../ber/__pycache__/encoder.cpython-37.pyc | Bin 0 -> 16364 bytes .../codec/ber/__pycache__/eoo.cpython-37.pyc | Bin 0 -> 741 bytes .../site-packages/pyasn1/codec/ber/decoder.py | 2141 +++++++ .../site-packages/pyasn1/codec/ber/encoder.py | 917 +++ .../site-packages/pyasn1/codec/ber/eoo.py | 28 + .../pyasn1/codec/cer/__init__.py | 1 + .../cer/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 148 bytes .../cer/__pycache__/decoder.cpython-37.pyc | Bin 0 -> 2212 bytes .../cer/__pycache__/encoder.cpython-37.pyc | Bin 0 -> 6464 bytes .../site-packages/pyasn1/codec/cer/decoder.py | 146 + .../site-packages/pyasn1/codec/cer/encoder.py | 327 + .../pyasn1/codec/der/__init__.py | 1 + .../der/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 148 bytes .../der/__pycache__/decoder.cpython-37.pyc | Bin 0 -> 1565 bytes .../der/__pycache__/encoder.cpython-37.pyc | Bin 0 -> 1799 bytes .../site-packages/pyasn1/codec/der/decoder.py | 116 + .../site-packages/pyasn1/codec/der/encoder.py | 122 + .../pyasn1/codec/native/__init__.py | 1 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 151 bytes .../native/__pycache__/decoder.cpython-37.pyc | Bin 0 -> 5241 bytes .../native/__pycache__/encoder.cpython-37.pyc | Bin 0 -> 7408 bytes .../pyasn1/codec/native/decoder.py | 238 + .../pyasn1/codec/native/encoder.py | 274 + .../site-packages/pyasn1/codec/streaming.py | 244 + .../site-packages/pyasn1/compat/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 166 bytes .../compat/__pycache__/integer.cpython-37.pyc | Bin 0 -> 2130 bytes .../compat/__pycache__/octets.cpython-37.pyc | Bin 0 -> 1906 bytes .../site-packages/pyasn1/compat/integer.py | 103 + .../site-packages/pyasn1/compat/octets.py | 46 + .../python3.7/site-packages/pyasn1/debug.py | 147 + .../python3.7/site-packages/pyasn1/error.py | 116 + .../site-packages/pyasn1/type/__init__.py | 1 + .../type/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 143 bytes .../type/__pycache__/base.cpython-37.pyc | Bin 0 -> 22410 bytes .../type/__pycache__/char.cpython-37.pyc | Bin 0 -> 8496 bytes .../__pycache__/constraint.cpython-37.pyc | Bin 0 -> 24590 bytes .../type/__pycache__/error.cpython-37.pyc | Bin 0 -> 353 bytes .../type/__pycache__/namedtype.cpython-37.pyc | Bin 0 -> 18996 bytes .../type/__pycache__/namedval.cpython-37.pyc | Bin 0 -> 5489 bytes .../type/__pycache__/opentype.cpython-37.pyc | Bin 0 -> 3404 bytes .../type/__pycache__/tag.cpython-37.pyc | Bin 0 -> 10302 bytes .../type/__pycache__/tagmap.cpython-37.pyc | Bin 0 -> 3271 bytes .../type/__pycache__/univ.cpython-37.pyc | Bin 0 -> 96152 bytes .../type/__pycache__/useful.cpython-37.pyc | Bin 0 -> 4544 bytes .../site-packages/pyasn1/type/base.py | 706 ++ .../site-packages/pyasn1/type/char.py | 335 + .../site-packages/pyasn1/type/constraint.py | 756 +++ .../site-packages/pyasn1/type/error.py | 11 + .../site-packages/pyasn1/type/namedtype.py | 561 ++ .../site-packages/pyasn1/type/namedval.py | 192 + .../site-packages/pyasn1/type/opentype.py | 104 + .../site-packages/pyasn1/type/tag.py | 335 + .../site-packages/pyasn1/type/tagmap.py | 96 + .../site-packages/pyasn1/type/univ.py | 3305 ++++++++++ .../site-packages/pyasn1/type/useful.py | 189 + .../DESCRIPTION.rst | 25 + .../setuptools-33.1.1.dist-info/INSTALLER | 1 + .../setuptools-33.1.1.dist-info/METADATA | 51 + .../setuptools-33.1.1.dist-info/RECORD | 119 + .../setuptools-33.1.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 62 + .../setuptools-33.1.1.dist-info/metadata.json | 1 + .../setuptools-33.1.1.dist-info/top_level.txt | 3 + .../setuptools-33.1.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 160 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5644 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5115 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 14005 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5228 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 32514 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1939 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3805 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 818 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2397 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4596 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 31148 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3592 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32302 bytes .../__pycache__/py26compat.cpython-37.pyc | Bin 0 -> 1017 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 813 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1842 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1192 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 2156 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15261 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1466 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6644 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1133 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 292 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 975 bytes .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 671 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2368 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 13505 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1747 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 938 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9943 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8547 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 5951 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 65138 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 20854 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 3975 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2875 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 5033 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2255 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4588 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 564 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2494 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 889 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 6103 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4487 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 7626 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 1317 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6019 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 472 ++ .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 201 + .../setuptools/command/easy_install.py | 2347 +++++++ .../setuptools/command/egg_info.py | 692 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 10 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 206 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 254 + .../setuptools/command/upload.py | 38 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 558 ++ .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 925 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 292 bytes .../site-packages/setuptools/glob.py | 176 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 191 + .../site-packages/setuptools/msvc.py | 1193 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1115 ++++ .../site-packages/setuptools/py26compat.py | 31 + .../site-packages/setuptools/py27compat.py | 29 + .../site-packages/setuptools/py31compat.py | 56 + .../site-packages/setuptools/py33compat.py | 45 + .../site-packages/setuptools/py36compat.py | 82 + .../site-packages/setuptools/sandbox.py | 491 ++ .../setuptools/script (dev).tmpl | 5 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 255 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../setuptools/windows_support.py | 29 + install-soft-on-Astra-linux/lib64 | 1 + install-soft-on-Astra-linux/pyvenv.cfg | 3 + .../CacheControl-0.11.7-py2.py3-none-any.whl | Bin 0 -> 18720 bytes .../appdirs-1.4.0-py2.py3-none-any.whl | Bin 0 -> 11585 bytes .../certifi-2016.2.28-py2.py3-none-any.whl | Bin 0 -> 366896 bytes .../chardet-3.0.4-py2.py3-none-any.whl | Bin 0 -> 133330 bytes .../colorama-0.3.7-py2.py3-none-any.whl | Bin 0 -> 19917 bytes .../distlib-0.2.4-py2.py3-none-any.whl | Bin 0 -> 140216 bytes .../distro-1.0.1-py2.py3-none-any.whl | Bin 0 -> 11734 bytes .../html5lib-0.999999999-py2.py3-none-any.whl | Bin 0 -> 112619 bytes .../idna-2.2-py2.py3-none-any.whl | Bin 0 -> 55347 bytes .../ipaddress-0.0.0-py2.py3-none-any.whl | Bin 0 -> 17502 bytes .../lockfile-0.12.2-py2.py3-none-any.whl | Bin 0 -> 13504 bytes .../packaging-16.8-py2.py3-none-any.whl | Bin 0 -> 23019 bytes .../pip-18.1-py2.py3-none-any.whl | Bin 0 -> 200053 bytes .../pkg_resources-0.0.0-py2.py3-none-any.whl | Bin 0 -> 114836 bytes .../progress-1.2-py2.py3-none-any.whl | Bin 0 -> 9605 bytes .../pyparsing-2.1.10-py2.py3-none-any.whl | Bin 0 -> 56156 bytes .../pytoml-0.1.2-py2.py3-none-any.whl | Bin 0 -> 6676 bytes .../requests-2.21.0-py2.py3-none-any.whl | Bin 0 -> 60298 bytes .../retrying-1.3.3-py2.py3-none-any.whl | Bin 0 -> 9481 bytes .../setuptools-33.1.1-py2.py3-none-any.whl | Bin 0 -> 360149 bytes .../six-1.10.0-py2.py3-none-any.whl | Bin 0 -> 10342 bytes .../urllib3-1.24.1-py2.py3-none-any.whl | Bin 0 -> 122850 bytes .../webencodings-0.5-py2.py3-none-any.whl | Bin 0 -> 11647 bytes .../wheel-0.29.0-py2.py3-none-any.whl | Bin 0 -> 65957 bytes install.py | 15 + requirements.txt | 3 + work-ad.py | 126 + 1303 files changed, 168456 insertions(+), 1 deletion(-) create mode 100644 install-soft-on-Astra-linux/bin/activate create mode 100644 install-soft-on-Astra-linux/bin/activate.csh create mode 100644 install-soft-on-Astra-linux/bin/activate.fish create mode 100755 install-soft-on-Astra-linux/bin/easy_install create mode 100755 install-soft-on-Astra-linux/bin/easy_install-3.5 create mode 100755 install-soft-on-Astra-linux/bin/easy_install-3.7 create mode 100755 install-soft-on-Astra-linux/bin/pip create mode 100755 install-soft-on-Astra-linux/bin/pip3 create mode 100755 install-soft-on-Astra-linux/bin/pip3.5 create mode 100755 install-soft-on-Astra-linux/bin/pip3.7 create mode 120000 install-soft-on-Astra-linux/bin/python create mode 120000 install-soft-on-Astra-linux/bin/python3 create mode 120000 install-soft-on-Astra-linux/bin/python3.7 create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/__pycache__/easy_install.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/easy_install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__pycache__/version.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/attrDef.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/attribute.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/cursor.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/entry.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/objectDef.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attrDef.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attribute.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/cursor.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/entry.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/objectDef.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/connection.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/exceptions.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/pooling.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/rdns.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/results.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/server.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/timezone.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/tls.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/usage.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/connection.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/exceptions.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/pooling.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/rdns.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/results.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/server.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/timezone.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/tls.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/usage.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__pycache__/operation.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/dirSync.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/unlockAccount.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/addMembersToGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/dirSync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/modifyPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/persistentSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/unlockAccount.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/addMembersToGroups.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/checkGroupsMemberships.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/endTransaction.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/getBindDn.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/listReplicas.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/nmasGetUniversalPassword.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/nmasSetUniversalPassword.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/partition_entry_count.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/removeMembersFromGroups.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/replicaInfo.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/startTransaction.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/addMembersToGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/checkGroupsMemberships.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/endTransaction.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/getBindDn.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/listReplicas.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/partition_entry_count.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/removeMembersFromGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/replicaInfo.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/startTransaction.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/operation.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PagedSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PersistentSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/PagedSearch.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/PersistentSearch.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/modifyPassword.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/whoAmI.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/modifyPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/whoAmI.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/abandon.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/add.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/bind.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/compare.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/delete.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/extended.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/modify.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/modifyDn.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/search.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/unbind.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/abandon.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/add.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/bind.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/compare.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/delete.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/extended.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modify.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modifyDn.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/search.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/unbind.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/controls.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/convert.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/microsoft.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/novell.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/oid.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/persistentSearch.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc2696.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc2849.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc3062.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4511.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4512.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4527.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/controls.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/convert.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/formatters.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/standard.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/validators.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/formatters.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/standard.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/validators.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/microsoft.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/novell.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/oid.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/persistentSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2696.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2849.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc3062.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4511.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4512.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4527.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/digestMd5.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/external.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/kerberos.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/plain.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/sasl.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/digestMd5.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/external.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/kerberos.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/plain.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/sasl.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/ds389.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/edir888.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/edir914.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/slapd24.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ad2012R2.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ds389.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir888.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir914.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/slapd24.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/asyncStream.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/asynchronous.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/base.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/ldifProducer.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockAsync.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockBase.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockSync.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/restartable.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/reusable.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/safeRestartable.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/safeSync.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/sync.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asyncStream.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asynchronous.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/base.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/ldifProducer.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockAsync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockBase.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockSync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/restartable.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/reusable.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeRestartable.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeSync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/sync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/asn1.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ciDict.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/config.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/conv.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/dn.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/hashed.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/log.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ntlm.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ordDict.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/port_validators.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/repr.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/tls_backport.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/uri.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/asn1.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ciDict.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/config.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/conv.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/dn.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/hashed.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/log.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ntlm.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ordDict.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/port_validators.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/repr.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/tls_backport.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/uri.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/version.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/DESCRIPTION.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/LICENSE.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/entry_points.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/metadata.json create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__main__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__pycache__/__main__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/build_env.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/cache.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/configuration.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/download.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/exceptions.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/index.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/locations.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/pep425tags.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/pyproject.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/resolve.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/wheel.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/build_env.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cache.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/parser.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/base_command.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/main_parser.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/parser.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/status_codes.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/check.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/completion.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/download.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/hash.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/help.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/install.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/list.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/search.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/show.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/check.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/completion.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/configuration.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/download.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/freeze.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/hash.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/help.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/list.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/search.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/show.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/uninstall.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/wheel.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/configuration.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/download.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/exceptions.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/index.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/locations.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/candidate.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/format_control.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/index.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/link.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/candidate.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/format_control.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/index.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/link.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/check.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/check.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/freeze.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/prepare.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pep425tags.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pyproject.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/constructors.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_file.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_install.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_set.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/constructors.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_file.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_set.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_tracker.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/resolve.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/logging.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/misc.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/models.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/typing.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/ui.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/appdirs.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/deprecation.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/encoding.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/filesystem.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/glibc.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/hashes.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/logging.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/misc.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/models.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/outdated.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/packaging.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/typing.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/ui.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/git.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/git.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/subversion.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/wheel.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/check.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/DESCRIPTION.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/metadata.json create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/six.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/LICENSE.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/zip-safe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/debug.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/error.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/decoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/encoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/eoo.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/eoo.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/decoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/encoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/decoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/encoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/decoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/encoder.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/binary.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/calling.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/dateandtime.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/integer.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/octets.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/string.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/binary.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/calling.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/dateandtime.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/integer.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/octets.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/string.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/debug.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/error.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/base.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/char.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/constraint.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/error.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/namedtype.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/namedval.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/opentype.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/tag.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/tagmap.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/univ.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/useful.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/base.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/char.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/constraint.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/error.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedtype.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedval.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/opentype.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tag.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tagmap.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/univ.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/useful.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/DESCRIPTION.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/dependency_links.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/entry_points.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/metadata.json create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/zip-safe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/archive_util.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/config.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/depends.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/dist.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/extension.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/glob.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/launch.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/monkey.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/msvc.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/namespaces.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/package_index.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py26compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py27compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py31compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py33compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py36compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/sandbox.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/site-patch.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/ssl_support.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/unicode_utils.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/version.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/windows_support.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/archive_util.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli-32.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli-64.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/alias.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/build_ext.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/build_py.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/develop.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/easy_install.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/egg_info.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_lib.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_scripts.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/py36compat.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/register.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/rotate.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/saveopts.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/sdist.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/setopt.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/test.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/upload.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/upload_docs.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/alias.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_egg.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_rpm.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_wininst.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_ext.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_py.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/develop.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/easy_install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/egg_info.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_egg_info.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_lib.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_scripts.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/launcher manifest.xml create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/py36compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/register.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/rotate.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/saveopts.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/sdist.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/setopt.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/test.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload_docs.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/config.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/depends.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/dist.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extension.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__pycache__/__init__.cpython-35.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/glob.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui-32.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui-64.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/launch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/lib2to3_ex.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/monkey.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/msvc.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/namespaces.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/package_index.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py26compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py27compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py31compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py33compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py36compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/sandbox.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script (dev).tmpl create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script.tmpl create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/site-patch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/ssl_support.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/unicode_utils.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/version.py create mode 100644 install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/windows_support.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/easy_install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__pycache__/version.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/attrDef.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/attribute.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/cursor.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/entry.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/objectDef.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attrDef.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attribute.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/cursor.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/entry.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/objectDef.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/connection.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/exceptions.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/pooling.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/rdns.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/results.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/server.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/timezone.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/tls.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/usage.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/connection.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/exceptions.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/pooling.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/rdns.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/results.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/server.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/timezone.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/tls.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/usage.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__pycache__/operation.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/dirSync.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/unlockAccount.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/addMembersToGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/dirSync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/modifyPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/persistentSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/unlockAccount.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/addMembersToGroups.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/checkGroupsMemberships.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/endTransaction.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/getBindDn.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/listReplicas.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/nmasGetUniversalPassword.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/nmasSetUniversalPassword.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/partition_entry_count.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/removeMembersFromGroups.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/replicaInfo.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/startTransaction.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/addMembersToGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/checkGroupsMemberships.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/endTransaction.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/getBindDn.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/listReplicas.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/partition_entry_count.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/removeMembersFromGroups.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/replicaInfo.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/startTransaction.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/operation.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PagedSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PersistentSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/PagedSearch.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/PersistentSearch.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/modifyPassword.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/whoAmI.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/modifyPassword.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/whoAmI.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/abandon.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/add.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/bind.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/compare.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/delete.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/extended.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/modify.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/modifyDn.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/search.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/unbind.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/abandon.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/add.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/bind.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/compare.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/delete.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/extended.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modify.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modifyDn.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/search.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/unbind.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/controls.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/convert.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/microsoft.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/novell.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/oid.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/persistentSearch.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc2696.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc2849.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc3062.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc4511.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc4512.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc4527.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/controls.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/convert.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/formatters.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/standard.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/validators.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/formatters.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/standard.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/validators.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/microsoft.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/novell.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/oid.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/persistentSearch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2696.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2849.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc3062.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4511.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4512.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4527.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/digestMd5.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/external.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/kerberos.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/plain.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/sasl.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/digestMd5.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/external.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/kerberos.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/plain.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/sasl.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/ds389.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/edir888.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/edir914.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/slapd24.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/ad2012R2.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/ds389.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir888.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir914.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/slapd24.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/asyncStream.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/asynchronous.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/base.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/ldifProducer.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockAsync.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockBase.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockSync.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/restartable.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/reusable.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/safeRestartable.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/safeSync.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/sync.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asyncStream.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asynchronous.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/base.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/ldifProducer.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockAsync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockBase.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockSync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/restartable.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/reusable.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeRestartable.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeSync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/sync.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/asn1.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ciDict.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/config.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/conv.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/dn.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/hashed.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/log.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ntlm.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ordDict.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/port_validators.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/repr.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/tls_backport.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/uri.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/asn1.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/ciDict.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/config.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/conv.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/dn.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/hashed.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/log.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/ntlm.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/ordDict.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/port_validators.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/repr.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/tls_backport.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/uri.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/version.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/DESCRIPTION.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/LICENSE.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/entry_points.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/metadata.json create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip-18.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/__main__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/build_env.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cache.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/base_command.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/parser.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/check.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/completion.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/download.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/hash.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/help.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/list.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/search.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/show.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/configuration.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/download.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/exceptions.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/index.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/locations.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/candidate.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/format_control.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/index.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/models/link.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/check.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/pep425tags.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/pyproject.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/constructors.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/req_file.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/req_install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/req_set.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/resolve.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/logging.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/misc.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/models.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/outdated.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/typing.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/utils/ui.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/git.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_internal/wheel.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/DESCRIPTION.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources-0.0.0.dist-info/metadata.json create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/LICENSE.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1-0.5.1.dist-info/zip-safe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/__pycache__/debug.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/__pycache__/error.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/__pycache__/streaming.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/__pycache__/decoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/__pycache__/encoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/__pycache__/eoo.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/ber/eoo.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/cer/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/cer/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/cer/__pycache__/decoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/cer/__pycache__/encoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/cer/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/cer/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/der/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/der/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/der/__pycache__/decoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/der/__pycache__/encoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/der/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/der/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/native/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/native/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/native/__pycache__/decoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/native/__pycache__/encoder.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/native/decoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/native/encoder.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/codec/streaming.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/compat/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/compat/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/compat/__pycache__/integer.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/compat/__pycache__/octets.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/compat/integer.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/compat/octets.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/debug.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/error.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/base.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/char.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/constraint.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/error.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/namedtype.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/namedval.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/opentype.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/tag.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/tagmap.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/univ.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/__pycache__/useful.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/base.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/char.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/constraint.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/error.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/namedtype.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/namedval.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/opentype.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/tag.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/tagmap.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/univ.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/pyasn1/type/useful.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/DESCRIPTION.rst create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/INSTALLER create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/METADATA create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/RECORD create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/WHEEL create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/dependency_links.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/entry_points.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/metadata.json create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/top_level.txt create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools-33.1.1.dist-info/zip-safe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/py26compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/archive_util.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/cli-32.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/cli-64.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/cli.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/alias.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/build_ext.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/build_py.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/develop.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/easy_install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/egg_info.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/install.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/install_lib.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/install_scripts.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/py36compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/register.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/rotate.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/saveopts.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/sdist.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/setopt.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/test.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/upload.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/command/upload_docs.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/config.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/depends.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/dist.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/extension.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/extern/__init__.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/glob.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/gui-32.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/gui-64.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/gui.exe create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/launch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/monkey.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/msvc.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/namespaces.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/package_index.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/py26compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/py27compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/py31compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/py33compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/py36compat.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/sandbox.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/script (dev).tmpl create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/script.tmpl create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/site-patch.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/ssl_support.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/unicode_utils.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/version.py create mode 100644 install-soft-on-Astra-linux/lib/python3.7/site-packages/setuptools/windows_support.py create mode 120000 install-soft-on-Astra-linux/lib64 create mode 100644 install-soft-on-Astra-linux/pyvenv.cfg create mode 100644 install-soft-on-Astra-linux/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/appdirs-1.4.0-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/certifi-2016.2.28-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/colorama-0.3.7-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/distlib-0.2.4-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/distro-1.0.1-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/html5lib-0.999999999-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/idna-2.2-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/packaging-16.8-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/pip-18.1-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/progress-1.2-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/pyparsing-2.1.10-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/pytoml-0.1.2-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/requests-2.21.0-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/setuptools-33.1.1-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/six-1.10.0-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/urllib3-1.24.1-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/webencodings-0.5-py2.py3-none-any.whl create mode 100644 install-soft-on-Astra-linux/share/python-wheels/wheel-0.29.0-py2.py3-none-any.whl create mode 100644 requirements.txt create mode 100644 work-ad.py diff --git a/README.md b/README.md index 22573ea..aef21d9 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,26 @@ `git clone <тут вставь ссылку этого репозитория>` Когда все откопируется, выполняем команду: -`python3 ~/installSoft/install.py` \ No newline at end of file +`python3 ~/installSoft/install.py` + +Заметки: +Устанавливаем Python 3.7 + +В питон устанавливаем venv: +`sudo apt-get install python3.7-venv` + +После установки venv находясь в нужной папке с проектом мы восстанавливаем из фриза виртуальное окружение: +`pip3 install -r requirements.txt` + +а чтоб это было на месте нужно перед этим +1. создать виртуальное окружение +`python3.7 -m venv install-soft-on-Astra-linux` +2. активировать его в исполняемой среде +`source install-soft-on-Astra-linux/bin/activate` +3. установить в него нужное количество пакетов + просмотреть список пакетов можно командой: `pip3 list` + установить пакеты: + ldap3 командой `python3.7 -m pip install ldap3` + #ldap (python-ldap) командой `python3.7 -m pip install python-ldap` +4. Заморозить установленные пакеты: +`python3 -m pip freeze > requirements.txt` \ No newline at end of file diff --git a/install-soft-on-Astra-linux/bin/activate b/install-soft-on-Astra-linux/bin/activate new file mode 100644 index 0000000..2927a58 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "$1" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(install-soft-on-Astra-linux) " != x ] ; then + PS1="(install-soft-on-Astra-linux) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/install-soft-on-Astra-linux/bin/activate.csh b/install-soft-on-Astra-linux/bin/activate.csh new file mode 100644 index 0000000..c9a4aff --- /dev/null +++ b/install-soft-on-Astra-linux/bin/activate.csh @@ -0,0 +1,37 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if ("install-soft-on-Astra-linux" != "") then + set env_name = "install-soft-on-Astra-linux" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/install-soft-on-Astra-linux/bin/activate.fish b/install-soft-on-Astra-linux/bin/activate.fish new file mode 100644 index 0000000..fdfeb60 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/activate.fish @@ -0,0 +1,75 @@ +# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) +# you cannot run it directly + +function deactivate -d "Exit virtualenv and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + if test "$argv[1]" != "nondestructive" + # Self destruct! + functions -e deactivate + end +end + +# unset irrelevant variables +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# unset PYTHONHOME if set +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # save the current fish_prompt function as the function _old_fish_prompt + functions -c fish_prompt _old_fish_prompt + + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command + set -l old_status $status + + # Prompt override? + if test -n "(install-soft-on-Astra-linux) " + printf "%s%s" "(install-soft-on-Astra-linux) " (set_color normal) + else + # ...Otherwise, prepend env + set -l _checkbase (basename "$VIRTUAL_ENV") + if test $_checkbase = "__" + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) + else + printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) + end + end + + # Restore the return status of the previous command. + echo "exit $old_status" | . + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/install-soft-on-Astra-linux/bin/easy_install b/install-soft-on-Astra-linux/bin/easy_install new file mode 100755 index 0000000..d8c0354 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/easy_install @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/easy_install-3.5 b/install-soft-on-Astra-linux/bin/easy_install-3.5 new file mode 100755 index 0000000..34d1b0c --- /dev/null +++ b/install-soft-on-Astra-linux/bin/easy_install-3.5 @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/easy_install-3.7 b/install-soft-on-Astra-linux/bin/easy_install-3.7 new file mode 100755 index 0000000..d8c0354 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/easy_install-3.7 @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/pip b/install-soft-on-Astra-linux/bin/pip new file mode 100755 index 0000000..a28d5a3 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/pip @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/pip3 b/install-soft-on-Astra-linux/bin/pip3 new file mode 100755 index 0000000..a28d5a3 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/pip3 @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/pip3.5 b/install-soft-on-Astra-linux/bin/pip3.5 new file mode 100755 index 0000000..652bd59 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/pip3.5 @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/pip3.7 b/install-soft-on-Astra-linux/bin/pip3.7 new file mode 100755 index 0000000..a28d5a3 --- /dev/null +++ b/install-soft-on-Astra-linux/bin/pip3.7 @@ -0,0 +1,11 @@ +#!/home/admincsm/Projects/GIT-Python-Astra/install-soft-on-Astra-linux/install-soft-on-Astra-linux/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/install-soft-on-Astra-linux/bin/python b/install-soft-on-Astra-linux/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/install-soft-on-Astra-linux/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/install-soft-on-Astra-linux/bin/python3 b/install-soft-on-Astra-linux/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/install-soft-on-Astra-linux/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/install-soft-on-Astra-linux/bin/python3.7 b/install-soft-on-Astra-linux/bin/python3.7 new file mode 120000 index 0000000..f097b0e --- /dev/null +++ b/install-soft-on-Astra-linux/bin/python3.7 @@ -0,0 +1 @@ +/usr/bin/python3.7 \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/__pycache__/easy_install.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/__pycache__/easy_install.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82e04df9e9ced39cad4f6e26b7273c5f2f54c67e GIT binary patch literal 288 zcmYk!yGq1B6b9gblDNBw3)@*(m^MX{WFi-JdDwA&EB*e?_#nG3-&(DuQR9M0%hnKmL>Yw`v+2AqvT;tN?3QSH zF;X*8bM83|E?C?7>Ht(6QEGqGK8?m3`dJ*`?Q>lR?P}M$^6*k#@cL2(w)LM?|2HbP V9~W2Js-fd+5g|Wmv*bjq#1~9eO@06X literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/easy_install.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt new file mode 100644 index 0000000..f0156c5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.txt new file mode 100644 index 0000000..c8dcb1e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + _clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/INSTALLER b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..ef8a5c2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt @@ -0,0 +1,13 @@ +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program in the COPYING and COPYING.LESSER files. +If not, see . \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/METADATA b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/METADATA new file mode 100644 index 0000000..834b610 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/METADATA @@ -0,0 +1,165 @@ +Metadata-Version: 2.1 +Name: ldap3 +Version: 2.9.1 +Summary: A strictly RFC 4510 conforming LDAP V3 pure Python client library +Home-page: https://github.com/cannatag/ldap3 +Author: Giovanni Cannata +Author-email: cannatag@gmail.com +License: LGPL v3 +Keywords: python3 python2 ldap +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX :: Linux +Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3) +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP +Requires-Dist: pyasn1 (>=0.4.6) + +LDAP3 +===== + +.. image:: https://img.shields.io/pypi/v/ldap3.svg + :target: https://pypi.python.org/pypi/ldap3/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/l/ldap3.svg + :target: https://pypi.python.org/pypi/ldap3/ + :alt: License + +.. image:: https://img.shields.io/travis/cannatag/ldap3/master.svg + :target: https://travis-ci.org/cannatag/ldap3 + :alt: TRAVIS-CI build status for master branch + + +ldap3 is a strictly RFC 4510 conforming **LDAP V3 pure Python client** library. The same codebase runs in Python 2, Python 3, PyPy and PyPy3. + + +A more pythonic LDAP +-------------------- + +LDAP operations look clumsy and hard-to-use because they reflect the old-age idea that time-consuming operations should be performed client-side +to not hog the server with heavy elaborations. To alleviate this ldap3 includes a fully functional **Abstraction Layer** that lets you +interact with the LDAP server in a modern and *pythonic* way. With the Abstraction Layer you don't need to directly issue any LDAP operation at all. + + +Thread safe strategies +---------------------- + +In multithreaded programs you must use on of **SAFE_SYNC** (synchronous connection strategy), **SAFE_RESTARTABLE** (restartable syncronous connection strategy) or **ASYNC** (asynchronous connection strategy). + Each LDAP operation with SAFE_SYNC or SAFE_RESTARTABLE strategies returns a tuple of four elements: status, result, response and request. + + * status: states if the operation was successful + + * result: the LDAP result of the operation + + * response: the response of a LDAP Search Operation + + * request: the original request of the operation + + The SafeSync strategy can be used with the Abstract Layer, but the Abstract Layer currently is NOT thread safe. + For example, to use *SAFE_SYNC*:: + + from ldap3 import Server, Connection, SAFE_SYNC + server = Server('my_server') + conn = Connection(server, 'my_user', 'my_password', client_strategy=SAFE_SYNC, auto_bind=True) + status, result, response, _ = conn.search('o=test', '(objectclass=*)') # usually you don't need the original request (4th element of the returned tuple) + + + With *ASYNC* you must request the response with the *get_response()* method. + +Home Page +--------- + +The home page of the ldap3 project is https://github.com/cannatag/ldap3 + + +Documentation +------------- + +Documentation is available at http://ldap3.readthedocs.io + + +License +------- + +The ldap3 project is open source software released under the **LGPL v3 license**. +Copyright 2013 - 2020 Giovanni Cannata + + +PEP8 Compliance +--------------- + +ldap3 is PEP8 compliant, except for line length. + + +Download +-------- + +Package download is available at https://pypi.python.org/pypi/ldap3. + + +Install +------- + +Install with **pip install ldap3** + + +Git repository +-------------- + +You can download the latest source at https://github.com/cannatag/ldap3 + + +Continuous integration +---------------------- + +Continuous integration for testing is at https://travis-ci.org/cannatag/ldap3 + + +Support & Development +--------------------- + +You can submit support tickets on https://github.com/cannatag/ldap3/issues/new +You can submit pull request on the **dev** branch at https://github.com/cannatag/ldap3/tree/dev + + +Thanks to +--------- + +* **Ilya Etingof**, the author of the *pyasn1* package for his excellent work and support. + +* **Mark Lutz** for his *Learning Python* and *Programming Python* excellent books series and **John Goerzen** and **Brandon Rhodes** for their book *Foundations of Python Network Programming*. These books are wonderful tools for learning Python and this project owes a lot to them. + +* **JetBrains** for donating to this project the Open Source license of *PyCharm Professional*. + +* **GitHub** for providing the *free source repository space and the tools* I use to develop this project. + +* The **FreeIPA** team for letting me use their demo LDAP server in the ldap3 tutorial. + + +Contact me +---------- + +For information and suggestions you can contact me at cannatag@gmail.com. You can also open a support ticket on https://github.com/cannatag/ldap3/issues/new + + +Donate +------ + +If you want to keep this project up and running you can send me an Amazon gift card. I will use it to improve my skills in Information and Communication technologies. + + +Changelog +--------- + +Updated changelog at https://ldap3.readthedocs.io/changelog.html + + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/RECORD b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/RECORD new file mode 100644 index 0000000..742eb64 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/RECORD @@ -0,0 +1,230 @@ +ldap3-2.9.1.dist-info/COPYING.LESSER.txt,sha256=LPNKwDiu5awG-TPd0dqYJuC7k4PBPY4LCI_O0LSpW1s,7814 +ldap3-2.9.1.dist-info/COPYING.txt,sha256=mW-DoJmlCb8dVheH3WgTBXT6aRoPIPc8E4WnHWxpQtU,35820 +ldap3-2.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +ldap3-2.9.1.dist-info/LICENSE.txt,sha256=XX5XVJ8iam2PA7UJW3uo37L_x-X6eSIP5lo4VMdxWbA,683 +ldap3-2.9.1.dist-info/METADATA,sha256=SgBryFUSxtahPvaoldnKM2aVtoXdVh_D5CaaOpIXgMU,5408 +ldap3-2.9.1.dist-info/RECORD,, +ldap3-2.9.1.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110 +ldap3-2.9.1.dist-info/top_level.txt,sha256=Zg1GRSTgLedl2RfLDLI0W0OaUFdYc0H1zzRbrK96JBw,6 +ldap3/__init__.py,sha256=fDS0j-uC8aY5g6U2z98mYC8JM6xLEZmL1RTn3exUkuE,4333 +ldap3/__pycache__/__init__.cpython-35.pyc,, +ldap3/__pycache__/version.cpython-35.pyc,, +ldap3/abstract/__init__.py,sha256=mw1tDTTwjwK-KF67PDCxgVltT_UM3YLFJyJbz8swMxA,2166 +ldap3/abstract/__pycache__/__init__.cpython-35.pyc,, +ldap3/abstract/__pycache__/attrDef.cpython-35.pyc,, +ldap3/abstract/__pycache__/attribute.cpython-35.pyc,, +ldap3/abstract/__pycache__/cursor.cpython-35.pyc,, +ldap3/abstract/__pycache__/entry.cpython-35.pyc,, +ldap3/abstract/__pycache__/objectDef.cpython-35.pyc,, +ldap3/abstract/attrDef.py,sha256=Bw23WrEdkErJUTHBJe--ag1KRP7lDueB7XDhC9HuCvo,4983 +ldap3/abstract/attribute.py,sha256=w8S2uhznzygj_VStYH_NGCvosPD8k3gXAVuE87Pkwj4,12428 +ldap3/abstract/cursor.py,sha256=UMKVwBXzsLraAHDKQYzfJ6yIaNC_m8XzLr5CQEzX5Vk,43620 +ldap3/abstract/entry.py,sha256=XeKOH1UA0SU_dJaMVNHv2_AswoVo5L7ok0t6coznJGA,35603 +ldap3/abstract/objectDef.py,sha256=48ROgT4Q3C0asmo2iYFonB2B3qNrsCyeNg5cHgHTxqk,11809 +ldap3/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/core/__pycache__/__init__.cpython-35.pyc,, +ldap3/core/__pycache__/connection.cpython-35.pyc,, +ldap3/core/__pycache__/exceptions.cpython-35.pyc,, +ldap3/core/__pycache__/pooling.cpython-35.pyc,, +ldap3/core/__pycache__/rdns.cpython-35.pyc,, +ldap3/core/__pycache__/results.cpython-35.pyc,, +ldap3/core/__pycache__/server.cpython-35.pyc,, +ldap3/core/__pycache__/timezone.cpython-35.pyc,, +ldap3/core/__pycache__/tls.cpython-35.pyc,, +ldap3/core/__pycache__/usage.cpython-35.pyc,, +ldap3/core/connection.py,sha256=Fy26Xkv0ikFY05qUTtfDDJJieLvlHUsuKneNvJKk2Zg,82600 +ldap3/core/exceptions.py,sha256=jjyx8LCftsxoy4i_KrpcAUMW0rAwfu0UZnBBPwCYOrk,16670 +ldap3/core/pooling.py,sha256=KXfOKdYWaKLDe-bDZZdEhnJAVcPb5cRAc51XZFDNFtA,14881 +ldap3/core/rdns.py,sha256=GxK_0nw1F6-ep_uApxKOYSfwCkSsrjmPFUSWaPc3NUQ,2525 +ldap3/core/results.py,sha256=TtF3F4UR32nseJhEUHE40DJjnXVYdvjLwKDyBlv0Gdo,5564 +ldap3/core/server.py,sha256=wFWUsQOmNsylQ_Cp7hja6mRKwEdOKOM7rec3tWG6VSc,34112 +ldap3/core/timezone.py,sha256=URXtnURG_WpbBwgJNe5YGeQryXD9NDO9yTfenGDLQm4,1620 +ldap3/core/tls.py,sha256=iO8a3SOogZ3n01Yn_i-und3hg6dqLq1ciaUycJy-yYk,15389 +ldap3/core/usage.py,sha256=sXRrE6S5shv-RrjL9yjz5H77voXHnbparHuAYdslOWo,10690 +ldap3/extend/__init__.py,sha256=yRQfHDmqJ2CiZlF5y2mLQtO2Mna-4NnwWlw7ABUkZFk,14146 +ldap3/extend/__pycache__/__init__.cpython-35.pyc,, +ldap3/extend/__pycache__/operation.cpython-35.pyc,, +ldap3/extend/microsoft/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/extend/microsoft/__pycache__/__init__.cpython-35.pyc,, +ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-35.pyc,, +ldap3/extend/microsoft/__pycache__/dirSync.cpython-35.pyc,, +ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-35.pyc,, +ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-35.pyc,, +ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-35.pyc,, +ldap3/extend/microsoft/__pycache__/unlockAccount.cpython-35.pyc,, +ldap3/extend/microsoft/addMembersToGroups.py,sha256=Xktg2W-lyL-2AvNfgwQ67yI_Kd5mLN56JvptfbDFk9g,4220 +ldap3/extend/microsoft/dirSync.py,sha256=XKl1o8_JeVPiBAWQX19po4zQ5ET34AtR_Ncg1fBASwU,4238 +ldap3/extend/microsoft/modifyPassword.py,sha256=DTdm6w7x__-jfSsBrQDNF4ptWk8kZi7hLW6mWTNRAxc,3160 +ldap3/extend/microsoft/persistentSearch.py,sha256=EboAmUIeGkq_x0FsZUHUKqtjkbayRVTKNEnyL-1x8yo,4303 +ldap3/extend/microsoft/removeMembersFromGroups.py,sha256=IByzrBU5Buhb_EjRJgkAJE2eiLObKhWuR2gla8q38Jc,4112 +ldap3/extend/microsoft/unlockAccount.py,sha256=wYCae0gBhqZNloO_b5Dzey8DHHjZYruJdO3WaRFrMHs,2142 +ldap3/extend/novell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/extend/novell/__pycache__/__init__.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/addMembersToGroups.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/checkGroupsMemberships.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/endTransaction.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/getBindDn.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/listReplicas.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/nmasGetUniversalPassword.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/nmasSetUniversalPassword.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/partition_entry_count.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/removeMembersFromGroups.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/replicaInfo.cpython-35.pyc,, +ldap3/extend/novell/__pycache__/startTransaction.cpython-35.pyc,, +ldap3/extend/novell/addMembersToGroups.py,sha256=zKzjpgIsiB4AyhPxbS54kcA3IukUdmH00VKPbXrlZ8g,8209 +ldap3/extend/novell/checkGroupsMemberships.py,sha256=UpcDbMlDFitpUX3piTNijM9MVg4OgMI18nyYpaH7Dzw,8006 +ldap3/extend/novell/endTransaction.py,sha256=FJ_Fh5x4kSP8qnvHU8YWnDZHoj0GjRN8KLHslP-DWCs,2252 +ldap3/extend/novell/getBindDn.py,sha256=FmObH2gATugZHMqYFyvvV1zugqaI6SRylkblddp_TkI,1422 +ldap3/extend/novell/listReplicas.py,sha256=yHDgw0S3utZQaRehZxWsIGSONhvgKgDby5he4Qku4Qk,1851 +ldap3/extend/novell/nmasGetUniversalPassword.py,sha256=C3kBWt80qBox6anBULlnvzQB50NlENmWcLt5ttiROSU,2225 +ldap3/extend/novell/nmasSetUniversalPassword.py,sha256=n5X-P_8R9uiQWPhm4wzOnP0_Z63JTSgDDkL-uKbqYRE,2077 +ldap3/extend/novell/partition_entry_count.py,sha256=aoLUTylSGlDfKARQxTSwt0yokCgRjx-1Vz2JPIPR3Zo,2077 +ldap3/extend/novell/removeMembersFromGroups.py,sha256=Tadzd3iXhEYZ-M-v5SfapDpZ3xjVNcHUOWaY1G3lIHI,8299 +ldap3/extend/novell/replicaInfo.py,sha256=a315GB4ZEM_svqc252KTVijMX_W84gKId6sHx_hFhy0,3391 +ldap3/extend/novell/startTransaction.py,sha256=h1YeBByo2zC7UmLdhbX6L4pJ3ajTIdABvoRp-b6FyDg,2293 +ldap3/extend/operation.py,sha256=rm6hcH0JXiKHvlpQmaCZ-8Rw279bgff-268dw6hCZXo,3988 +ldap3/extend/standard/PagedSearch.py,sha256=QyORR5GTMcPvd5E7qMKmbBmi5K7HLHzaGiTsXUhpNhk,6385 +ldap3/extend/standard/PersistentSearch.py,sha256=5Dvlix29nsbMl0B7sm0dBoCOZFN4w58dhY5C-dsrbhU,5367 +ldap3/extend/standard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/extend/standard/__pycache__/PagedSearch.cpython-35.pyc,, +ldap3/extend/standard/__pycache__/PersistentSearch.cpython-35.pyc,, +ldap3/extend/standard/__pycache__/__init__.cpython-35.pyc,, +ldap3/extend/standard/__pycache__/modifyPassword.cpython-35.pyc,, +ldap3/extend/standard/__pycache__/whoAmI.cpython-35.pyc,, +ldap3/extend/standard/modifyPassword.py,sha256=unNRVqGMlyqohN3s1chgqmKFZNkX1MpKGJ2V1aC5f_U,3512 +ldap3/extend/standard/whoAmI.py,sha256=1lQK1wmfNzAgD7fNBJCCafrrLY4wK8U2vz2ERNQBUkg,1389 +ldap3/operation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/operation/__pycache__/__init__.cpython-35.pyc,, +ldap3/operation/__pycache__/abandon.cpython-35.pyc,, +ldap3/operation/__pycache__/add.cpython-35.pyc,, +ldap3/operation/__pycache__/bind.cpython-35.pyc,, +ldap3/operation/__pycache__/compare.cpython-35.pyc,, +ldap3/operation/__pycache__/delete.cpython-35.pyc,, +ldap3/operation/__pycache__/extended.cpython-35.pyc,, +ldap3/operation/__pycache__/modify.cpython-35.pyc,, +ldap3/operation/__pycache__/modifyDn.cpython-35.pyc,, +ldap3/operation/__pycache__/search.cpython-35.pyc,, +ldap3/operation/__pycache__/unbind.cpython-35.pyc,, +ldap3/operation/abandon.py,sha256=Mf5a4-UTdnHF-E9VWFvy98V4XkrvvydIt0wszVrjgd8,1139 +ldap3/operation/add.py,sha256=4XXYwAnKbVfS8IDe8mC1fzG9NPCYNpEl4y9t4FeSWls,2983 +ldap3/operation/bind.py,sha256=70pPGIUeLQUi7Y3t7PbODykHBKViKXDVsP0c4S7Ykwg,7802 +ldap3/operation/compare.py,sha256=1mvmuI_uJUh3-dVym6VkTjC9rVxBFYShQQthc-nwxjI,2467 +ldap3/operation/delete.py,sha256=_SF5tgIIUZP_q0RG2WIaUuZx9tK8C2mHYpHTa-fim3s,1527 +ldap3/operation/extended.py,sha256=EB47JGHjbgjAQEFaQcsG2PaLvvgK4sXYJXKKUj2_8Hs,4914 +ldap3/operation/modify.py,sha256=N8w-CD4i9-9AXB8lR7ZazXoa3NAMQCQgdmdaEHlFa1Y,3927 +ldap3/operation/modifyDn.py,sha256=ut5sY8sP_UTDCDq73Ct0Y8awk73qDJ0MHWghj3enCIQ,2358 +ldap3/operation/search.py,sha256=RjaA4_HxnMQeuE9pSWzL9bzy07fDPkOaCppyio13xi4,28197 +ldap3/operation/unbind.py,sha256=Ph5ww3NkEz8yX7dv4FC5zikJLUfya4otOlvFu_In9y4,1012 +ldap3/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/__pycache__/__init__.cpython-35.pyc,, +ldap3/protocol/__pycache__/controls.cpython-35.pyc,, +ldap3/protocol/__pycache__/convert.cpython-35.pyc,, +ldap3/protocol/__pycache__/microsoft.cpython-35.pyc,, +ldap3/protocol/__pycache__/novell.cpython-35.pyc,, +ldap3/protocol/__pycache__/oid.cpython-35.pyc,, +ldap3/protocol/__pycache__/persistentSearch.cpython-35.pyc,, +ldap3/protocol/__pycache__/rfc2696.cpython-35.pyc,, +ldap3/protocol/__pycache__/rfc2849.cpython-35.pyc,, +ldap3/protocol/__pycache__/rfc3062.cpython-35.pyc,, +ldap3/protocol/__pycache__/rfc4511.cpython-35.pyc,, +ldap3/protocol/__pycache__/rfc4512.cpython-35.pyc,, +ldap3/protocol/__pycache__/rfc4527.cpython-35.pyc,, +ldap3/protocol/controls.py,sha256=pty1PqVDiRB71jPPMbgiPpcjRbBTJRtP3_VRkbOPsXA,1392 +ldap3/protocol/convert.py,sha256=sQWsEfffAqRbKXEevL_zCDEGpQ6z_un1w_X40D-ZlJQ,9879 +ldap3/protocol/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/formatters/__pycache__/__init__.cpython-35.pyc,, +ldap3/protocol/formatters/__pycache__/formatters.cpython-35.pyc,, +ldap3/protocol/formatters/__pycache__/standard.cpython-35.pyc,, +ldap3/protocol/formatters/__pycache__/validators.cpython-35.pyc,, +ldap3/protocol/formatters/formatters.py,sha256=QNiIBtMbFh9X_mv0skKfeQcJ3xAEMpox5QWZWQ1VfyE,16175 +ldap3/protocol/formatters/standard.py,sha256=V0Gf9e80v2ALJbh6g6lc7iB4b1QOqQpGU64Kvjxxn9Y,15252 +ldap3/protocol/formatters/validators.py,sha256=XQunpPTqDESJVS_DR8gKR53U9-wsTtHw2GXOEEXY5RA,19777 +ldap3/protocol/microsoft.py,sha256=RPk9FxPYzMT9yvsV1hNnfQbCylydPM-G0g-g4t8aOMc,5416 +ldap3/protocol/novell.py,sha256=7yyZ2oFUuNlJ3pBawEhRkolTt_tTnvdPfGgXXcRwnlY,5157 +ldap3/protocol/oid.py,sha256=Y6BsJGLi9p8ncWgY46NAp4SChkZChvk_tNHibjf69Bs,127654 +ldap3/protocol/persistentSearch.py,sha256=3mNW7KFu57uLJmKZB3E26BMvuuyAbDMrIp5arJrKZ4s,3177 +ldap3/protocol/rfc2696.py,sha256=UY6UUYaG_qE1llceZFLYjkW5RyXrIhTGeYI9W2xVqEg,2267 +ldap3/protocol/rfc2849.py,sha256=E6otnGh4e3jU8Tzsftt1xQS95nwCeeNk_vgr6UkAe3M,11234 +ldap3/protocol/rfc3062.py,sha256=zxnQ3eP94PrL8Vy8HUD7umH9nXkJMHjEMrSEinJi7-E,2955 +ldap3/protocol/rfc4511.py,sha256=7QUoXYeKdtts7p7crxeeZduGAlk3HBWgun03SLKhMf4,42545 +ldap3/protocol/rfc4512.py,sha256=x6VQsUgOo3nUwN1x7A_aHOvWonqc1N3dOpghSm7IRMo,39009 +ldap3/protocol/rfc4527.py,sha256=piYI1zm1jJ-Wp65_t5QRGdvXv6gbYum7hmstNJSk344,2078 +ldap3/protocol/sasl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/sasl/__pycache__/__init__.cpython-35.pyc,, +ldap3/protocol/sasl/__pycache__/digestMd5.cpython-35.pyc,, +ldap3/protocol/sasl/__pycache__/external.cpython-35.pyc,, +ldap3/protocol/sasl/__pycache__/kerberos.cpython-35.pyc,, +ldap3/protocol/sasl/__pycache__/plain.cpython-35.pyc,, +ldap3/protocol/sasl/__pycache__/sasl.cpython-35.pyc,, +ldap3/protocol/sasl/digestMd5.py,sha256=y58cRTmAAVhrtBAWMCR1VsHR1qZLzUVGmJwyzdM2xrM,5829 +ldap3/protocol/sasl/external.py,sha256=rXeZI70yZQWrr_j0COysZURKWCVQ22pjMdyRj46mQpo,1051 +ldap3/protocol/sasl/kerberos.py,sha256=4ggxFknqHKwjgkB3I2vjFS9qNtTUhXyMAJ4yVdq3tZA,15290 +ldap3/protocol/sasl/plain.py,sha256=uwuoh6Z1P6U4fhyvKEXNjcPyhY2r-COewVjPlIWLK-g,2235 +ldap3/protocol/sasl/sasl.py,sha256=-iHpfJVO1tf1NhK5iM69Xcw7uJsGjFGi5ftUhPBVyxA,7309 +ldap3/protocol/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/schemas/__pycache__/__init__.cpython-35.pyc,, +ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-35.pyc,, +ldap3/protocol/schemas/__pycache__/ds389.cpython-35.pyc,, +ldap3/protocol/schemas/__pycache__/edir888.cpython-35.pyc,, +ldap3/protocol/schemas/__pycache__/edir914.cpython-35.pyc,, +ldap3/protocol/schemas/__pycache__/slapd24.cpython-35.pyc,, +ldap3/protocol/schemas/ad2012R2.py,sha256=ZhjzvBlnxbk4Xmh2a-yiwHdQYGs27N5cC7eeeasKlwM,333672 +ldap3/protocol/schemas/ds389.py,sha256=_vsGT8rTaMDX1h_aod1iL7hhvI12blFi3YqmWVHgj50,310500 +ldap3/protocol/schemas/edir888.py,sha256=2C-QL5KJYEHm7A-UAVSN0PJSNRkPX4A1OOOHWVBQwRw,177862 +ldap3/protocol/schemas/edir914.py,sha256=O0VcJUmSRxUy8GKoNR1Cuhipij1R3o7hKeFuwMJNqQI,182158 +ldap3/protocol/schemas/slapd24.py,sha256=uAPuP5GsEG01HFe0tAF0h10_C5iLDOtIvdprsMKUtsU,129245 +ldap3/strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/strategy/__pycache__/__init__.cpython-35.pyc,, +ldap3/strategy/__pycache__/asyncStream.cpython-35.pyc,, +ldap3/strategy/__pycache__/asynchronous.cpython-35.pyc,, +ldap3/strategy/__pycache__/base.cpython-35.pyc,, +ldap3/strategy/__pycache__/ldifProducer.cpython-35.pyc,, +ldap3/strategy/__pycache__/mockAsync.cpython-35.pyc,, +ldap3/strategy/__pycache__/mockBase.cpython-35.pyc,, +ldap3/strategy/__pycache__/mockSync.cpython-35.pyc,, +ldap3/strategy/__pycache__/restartable.cpython-35.pyc,, +ldap3/strategy/__pycache__/reusable.cpython-35.pyc,, +ldap3/strategy/__pycache__/safeRestartable.cpython-35.pyc,, +ldap3/strategy/__pycache__/safeSync.cpython-35.pyc,, +ldap3/strategy/__pycache__/sync.cpython-35.pyc,, +ldap3/strategy/asyncStream.py,sha256=L-Jcb_FGWeuXLkMl-wVKHxlQZOFzzo4wthuPm6NwDzk,4578 +ldap3/strategy/asynchronous.py,sha256=s7FhaxizhCPiWU4Dfxnc_Xh7F8DyFW3ELajDifYBxHI,15247 +ldap3/strategy/base.py,sha256=48stBVEx9WP13etYE7uOQkDqnUB8iIzu5HSKjd90FVc,51995 +ldap3/strategy/ldifProducer.py,sha256=V1hdqCUbetGq6nHPa8xucYn0G3lglRTAnlc4rV1bor4,5715 +ldap3/strategy/mockAsync.py,sha256=rZEbmE4vxWgGxHjt7Tr76diB-C2Q9G_Sj5wjBZjv2Rw,10259 +ldap3/strategy/mockBase.py,sha256=zvVBdJ7S3F7_w03-FHoaL4reJXqqOgai23ZauF0K0P8,46685 +ldap3/strategy/mockSync.py,sha256=hYGif2UHypzX1a5TT4gPn855ZO5VQveCe6oEQ4amYck,7315 +ldap3/strategy/restartable.py,sha256=wuetnY_XvnQ6dBkdIyBwDlvGAj7aWcet7hVf0OFrYXI,13209 +ldap3/strategy/reusable.py,sha256=hydBw6IQlB3pdPsilMh2Gb60KXoAhev88N4wcMnIUrs,25459 +ldap3/strategy/safeRestartable.py,sha256=sb9X7t8KgihhfVO1sqyZncOsb18_RnpEa8ifDnSOlmw,1079 +ldap3/strategy/safeSync.py,sha256=bs034mamY73coENS3B8BIPtpaSdCY6rHR3Fd515HGCQ,1044 +ldap3/strategy/sync.py,sha256=feeQyySWkkp_8aijZ77n4MNCEglfRpj2Bsm9gTA9T5o,13932 +ldap3/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/utils/__pycache__/__init__.cpython-35.pyc,, +ldap3/utils/__pycache__/asn1.cpython-35.pyc,, +ldap3/utils/__pycache__/ciDict.cpython-35.pyc,, +ldap3/utils/__pycache__/config.cpython-35.pyc,, +ldap3/utils/__pycache__/conv.cpython-35.pyc,, +ldap3/utils/__pycache__/dn.cpython-35.pyc,, +ldap3/utils/__pycache__/hashed.cpython-35.pyc,, +ldap3/utils/__pycache__/log.cpython-35.pyc,, +ldap3/utils/__pycache__/ntlm.cpython-35.pyc,, +ldap3/utils/__pycache__/ordDict.cpython-35.pyc,, +ldap3/utils/__pycache__/port_validators.cpython-35.pyc,, +ldap3/utils/__pycache__/repr.cpython-35.pyc,, +ldap3/utils/__pycache__/tls_backport.cpython-35.pyc,, +ldap3/utils/__pycache__/uri.cpython-35.pyc,, +ldap3/utils/asn1.py,sha256=FYZA1WCmnHWCIqDiyKx9QqRBK7lcNa7n4K-EiX_HbRU,9304 +ldap3/utils/ciDict.py,sha256=_X4k9lnqmJ8MP55CSO4ZSLmfWGXkFZHDtvtF1Z35aaQ,7893 +ldap3/utils/config.py,sha256=H8LzitQYyx1lJUycZa6jHlHVV5aIZ5JkwSUs5H_8xuU,14927 +ldap3/utils/conv.py,sha256=D-rhsIHaV152ZypCQvIqC7jccyKi6GHXERNKSwjk7EI,9741 +ldap3/utils/dn.py,sha256=vKB-BzIqxphfbtMkpr2s8sieosGcbghVblz0iPWCwKU,14441 +ldap3/utils/hashed.py,sha256=yhqSd9iLj2hsYqT1p9ZnBFQPaaB9pnkVrYb1H6dzFBA,3575 +ldap3/utils/log.py,sha256=ScJ5IS9zYuSWqXkP___KQ8mzdoGzocfMkMiTSG2870U,7252 +ldap3/utils/ntlm.py,sha256=XKoz2G8W4npLIyTjMDpqepb3Xjz10qH6HmBxilAsMy0,20125 +ldap3/utils/ordDict.py,sha256=mmMzSklrAxwRZprA1Lj5K1D-eD-HLWVHxQVQD0NiPnQ,4251 +ldap3/utils/port_validators.py,sha256=r23jlhWgU09Kq8X0TB4nUqHiO3iYNQ0kh4WMgcDoZzM,1396 +ldap3/utils/repr.py,sha256=vKhXotKmFD5sCYNUZOHV5ybR2LbSsjVeDtY0RCLFa5E,1700 +ldap3/utils/tls_backport.py,sha256=VC4irAJVmNnuTu3uccViLYJU7YL-OXsvVbQR3XJJh5c,5426 +ldap3/utils/uri.py,sha256=bGq6eNc063NSJOF9xYl3mqLnF1c-SqvUq3-rd4CdaEA,4795 +ldap3/version.py,sha256=QxpAi50y5ypa0THbj-RzN7f3GTCbWftJRbdWCGr9J4s,626 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/WHEEL b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/WHEEL new file mode 100644 index 0000000..01b8fc7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/top_level.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/top_level.txt new file mode 100644 index 0000000..a843647 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3-2.9.1.dist-info/top_level.txt @@ -0,0 +1 @@ +ldap3 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__init__.py new file mode 100644 index 0000000..19c206f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__init__.py @@ -0,0 +1,150 @@ +""" +""" + +# Created on 2013.05.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from types import GeneratorType + +# authentication +ANONYMOUS = 'ANONYMOUS' +SIMPLE = 'SIMPLE' +SASL = 'SASL' +NTLM = 'NTLM' + +# SASL MECHANISMS +EXTERNAL = 'EXTERNAL' +DIGEST_MD5 = 'DIGEST-MD5' +KERBEROS = GSSAPI = 'GSSAPI' +PLAIN = 'PLAIN' + +AUTO_BIND_DEFAULT = 'DEFAULT' # binds connection when using "with" context manager +AUTO_BIND_NONE = 'NONE' # same as False, no bind is performed +AUTO_BIND_NO_TLS = 'NO_TLS' # same as True, bind is performed without tls +AUTO_BIND_TLS_BEFORE_BIND = 'TLS_BEFORE_BIND' # start_tls is performed before bind +AUTO_BIND_TLS_AFTER_BIND = 'TLS_AFTER_BIND' # start_tls is performed after bind + +# server IP dual stack mode +IP_SYSTEM_DEFAULT = 'IP_SYSTEM_DEFAULT' +IP_V4_ONLY = 'IP_V4_ONLY' +IP_V6_ONLY = 'IP_V6_ONLY' +IP_V4_PREFERRED = 'IP_V4_PREFERRED' +IP_V6_PREFERRED = 'IP_V6_PREFERRED' + +# search scope +BASE = 'BASE' +LEVEL = 'LEVEL' +SUBTREE = 'SUBTREE' + +# search alias +DEREF_NEVER = 'NEVER' +DEREF_SEARCH = 'SEARCH' +DEREF_BASE = 'FINDING_BASE' +DEREF_ALWAYS = 'ALWAYS' + +# search attributes +ALL_ATTRIBUTES = '*' +NO_ATTRIBUTES = '1.1' # as per RFC 4511 +ALL_OPERATIONAL_ATTRIBUTES = '+' # as per RFC 3673 + +# modify type +MODIFY_ADD = 'MODIFY_ADD' +MODIFY_DELETE = 'MODIFY_DELETE' +MODIFY_REPLACE = 'MODIFY_REPLACE' +MODIFY_INCREMENT = 'MODIFY_INCREMENT' + +# client strategies +SYNC = 'SYNC' +SAFE_SYNC = 'SAFE_SYNC' +SAFE_RESTARTABLE = 'SAFE_RESTARTABLE' +ASYNC = 'ASYNC' +LDIF = 'LDIF' +RESTARTABLE = 'RESTARTABLE' +REUSABLE = 'REUSABLE' +MOCK_SYNC = 'MOCK_SYNC' +MOCK_ASYNC = 'MOCK_ASYNC' +ASYNC_STREAM = 'ASYNC_STREAM' + +# get rootDSE info +NONE = 'NO_INFO' +DSA = 'DSA' +SCHEMA = 'SCHEMA' +ALL = 'ALL' + +OFFLINE_EDIR_8_8_8 = 'EDIR_8_8_8' +OFFLINE_EDIR_9_1_4 = 'EDIR_9_1_4' +OFFLINE_AD_2012_R2 = 'AD_2012_R2' +OFFLINE_SLAPD_2_4 = 'SLAPD_2_4' +OFFLINE_DS389_1_3_3 = 'DS389_1_3_3' + +# server pooling +FIRST = 'FIRST' +ROUND_ROBIN = 'ROUND_ROBIN' +RANDOM = 'RANDOM' + +# Hashed password +HASHED_NONE = 'PLAIN' +HASHED_SHA = 'SHA' +HASHED_SHA256 = 'SHA256' +HASHED_SHA384 = 'SHA384' +HASHED_SHA512 = 'SHA512' +HASHED_MD5 = 'MD5' +HASHED_SALTED_SHA = 'SALTED_SHA' +HASHED_SALTED_SHA256 = 'SALTED_SHA256' +HASHED_SALTED_SHA384 = 'SALTED_SHA384' +HASHED_SALTED_SHA512 = 'SALTED_SHA512' +HASHED_SALTED_MD5 = 'SALTED_MD5' + +if str is not bytes: # Python 3 + NUMERIC_TYPES = (int, float) + INTEGER_TYPES = (int, ) +else: + NUMERIC_TYPES = (int, long, float) + INTEGER_TYPES = (int, long) + +# types for string and sequence +if str is not bytes: # Python 3 + STRING_TYPES = (str, ) + SEQUENCE_TYPES = (set, list, tuple, GeneratorType, type(dict().keys())) # dict.keys() is a iterable memoryview in Python 3 +else: # Python 2 + try: + from future.types.newstr import newstr + except ImportError: + pass + + STRING_TYPES = (str, unicode) + SEQUENCE_TYPES = (set, list, tuple, GeneratorType) + +# centralized imports # must be at the end of the __init__.py file +from .version import __author__, __version__, __email__, __description__, __status__, __license__, __url__ +from .utils.config import get_config_parameter, set_config_parameter +from .core.server import Server +from .core.connection import Connection +from .core.tls import Tls +from .core.pooling import ServerPool +from .core.rdns import ReverseDnsSetting +from .abstract.objectDef import ObjectDef +from .abstract.attrDef import AttrDef +from .abstract.attribute import Attribute, WritableAttribute, OperationalAttribute +from .abstract.entry import Entry, WritableEntry +from .abstract.cursor import Reader, Writer +from .protocol.rfc4512 import DsaInfo, SchemaInfo diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fb7a329e3ccc8f192a41f4e80df84d12bbaf7ea GIT binary patch literal 3470 zcmZuzNqgHy5`Ew%k)l>B-uGR0EL*Gh1tLL-HWwM7Y^$6EL$N`dHb8QkpdERVT=HAy zFn?jr^B3lV>zs0!KakT@1Edyv#7__PUUgMBy1R-zHa?#D_un1ozf-_}aNsY?_A~zP z{T2rVK#Uqh46X(*28uxwaZns00ZKq5K}m=dC3qgJvLRKt~{sfMy|PLEk}q2RaII6m$&Y80a{}anK2f z6QGk2CqbtmPJvECoCckNI0HHhaTatA;vDEa#CgyKhzp>L5Ent0ATEI}LtF-3fw%&? z3UL*54dNQ;I>dF*9K;;x2E+}}O^BPI?;*Yi-GaCUnunMN-G;agx&v_sv;eUHT7*~x zEkP`SmLZlwD-bK7Rftv4U5LA&dl2_P_rsle0C6Am5aI#o5yV5#V~9tfClHT8Pa&Rw zoK4Q!!4ZLP~JTa4K-BaAI&a;k?A}zz0*|?;4tX-WJ;H*yYpVdy#`%gSQ3Rg7&&S zgM{-6A2X1-n5JplZ4GbK8efMK9?sq5`(r`mAq=>0;BAAp;Sq@7y#>96_XFq$ct3)E zg!dEZCwMl<=KIGn1-O5KR|nPM?SOV7bscU4o&br6Z@_inH9^gY7va8x_a5{<;?Lo> z;C%pni1-V*AK|$mH{vC@9=tZF9q}^U4!ka?8}SOTteUXqtU$~Bp=xtZ3&z)-wj=9) zN7i<`PLS3s)yj6cx@83^t61JF89~C*tx}Mv)Jo-G)Ob@f%!*$6lF1j>4XbvmoL>o2 z>z1W&7K7wwNiSA{k-SmRw@NjRsa6b1RjPKaWYHvpy=D}ureUuYD|wnwf?nW+ArGdD zo3^!W)r_(|%#dN})v{f!l(vJ=UXAR@NZ&M#f?=9QJ_v6Q^BOU5gs6pUC~ zYctX-h8{{9bHMg{H~drkgc=jrTUG zhmJ&vX9>m*dPYrS%L>P&%hlYAC;=~r%_t@tK5UEMOE1$1Z*s9xs0Q)8rSs9{HjJ_! z#Pw2%GDf~=+V|9FVBfbF>}AU6d3*8B!lG?1Qrar%n@m|A%UetL)QBZ}DM%KIrd8vW zRktd6+pO}r1u0XnqvC>wdo%1-Y$;)9yJ;Mr^w;Ib<#t%)WDcyU}SkTkq^{UDiFvcVsZz z`#-8$mE}mDo2^W)({4KrH50RV&Fv{Ma&LAzF0*OVQR{T_?VjcMeyjbC#dLM&1Bd0E zCX*4}_oXu9T!U=3cKW^(Ouv>bzrN!-`_gQ+tLl{}tGjzDuRdwCeYqQq4RWzF=bcgep6c^It|{Fq|dFOC;5vSGNB-;Af;eL!6*X_ z8i1`1dh~^1t{G<4l4<47DF3v+RjY=DJ*;M$*q6f2Fm;fJJ>tZ^@^!a3e%Q6&H{`gQ zb3(zS0{-OzIjvwu!4UuR<+1vk``V;j1) z!L=M7TxLMR!rr&T!rrH0Veiwhum@CKn(3iyze&t~BdL_%sw(rhs+!=dq&!a$=iU({ zcXoZJ7sOj_KS(y+PTl8|+$tMpF=yAdH`T!wD>Y-Czl%Z|B-~E>9c8(_s_%zLi*qYr zN2|v<{C?MUf`qD+AR$@}c6@Ypdo*DgFSm?J&KRUU((LCA^EH6L{{d53p27%O_+ zj`R&FJ2DvQw_A;laDtIRKa-1U>z5QPD_Bvms^G4IdkmEA`z^OOAGIubU+E8&KGx{) zjJ>cw$%jgr3>6+Y=u`5MQb$A8cYE@&qS=skxnpsEl24SB4kantJ^57enfeazX1(Fh zcZR)7K2wgVJx4w2V^TjnUddrklWXjdIR$w&WMVJUQ4LHQ%2QCD$vsb_FMAy+*OhBS zxu&|Z<98YzcV0Fd%Y5*%sC>^E{sH+`*$Vz#xb1u0+uc_8R;$hZ-*s>82&cch{PW^% zSJb;p1GMc{yXD*Ve0Mh(edKjS-*ukEI6?2945{N&@st*R!e>TH#RgnU4Lw6^$fM_B z7UdY?(D!w&p*|cJJ!4soKe0(I8_#NK?OH6Z&1&OXlJ%MRvUXIPI`lcs%2Dlq8cBQt literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__pycache__/version.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/__pycache__/version.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60e0d2b961c87eb701858cce34b6c17668613687 GIT binary patch literal 448 zcmYk3PfNov7{=f3U*~ivf_RO`9oFveK@r)QxXX~@z(X$~ZDJQl(~_pc_WOA719{oi zZ{f+*O*A17Ka%%-c#>RpyPc0W##9a96aEd$@XV~tF+u@+qZarU&>HwPpmp%;KpWsU zfHuKz0&Ric0&2s$*DjkQ=h_*TXG@-JiIf~Ij1o=C^KcK*EQ$#iPME~y)kfrEb1d+u+UD=10F<$R7Zt$3(Kfu0@~XfhoRP?*SHZMR_qredMWx=Aq_^bk~{$f|d4a>8;Rq{MfU1#~5#!%FHRoyAH-AH%7|v z5yq^FYtY6xR~4LMOj#Bxo>q4IhD;NkXNHZF;31P4!}uLk+q~hAd<|S3r*6vAK9{Ci kh<-p>UQAv``=(z5>MHxxsK&Hw-a literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__init__.py new file mode 100644 index 0000000..29aabb3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__init__.py @@ -0,0 +1,50 @@ +""" +""" + +# Created on 2016.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +STATUS_INIT = 'Initialized' # The entry object is initialized +STATUS_VIRTUAL = 'Virtual' # The entry is a new writable entry, still empty +STATUS_MANDATORY_MISSING = 'Missing mandatory attributes' # The entry has some mandatory attributes missing +STATUS_READ = 'Read' # The entry has been read +STATUS_WRITABLE = 'Writable' # The entry has been made writable, still no changes +STATUS_PENDING_CHANGES = 'Pending changes' # The entry has some changes to commit, mandatory attributes are present +STATUS_COMMITTED = 'Committed' # The entry changes has been committed +STATUS_READY_FOR_DELETION = 'Ready for deletion' # The entry is set to be deleted +STATUS_READY_FOR_MOVING = 'Ready for moving' # The entry is set to be moved in the DIT +STATUS_READY_FOR_RENAMING = 'Ready for renaming' # The entry is set to be renamed +STATUS_DELETED = 'Deleted' # The entry has been deleted + +STATUSES = [STATUS_INIT, + STATUS_VIRTUAL, + STATUS_MANDATORY_MISSING, + STATUS_READ, + STATUS_WRITABLE, + STATUS_PENDING_CHANGES, + STATUS_COMMITTED, + STATUS_READY_FOR_DELETION, + STATUS_READY_FOR_MOVING, + STATUS_READY_FOR_RENAMING, + STATUS_DELETED] + +INITIAL_STATUSES = [STATUS_READ, STATUS_WRITABLE, STATUS_VIRTUAL] diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7afadaf56eec4369f2611e9e4f46571815180240 GIT binary patch literal 735 zcmZuvO>fgc5S=(5cH*Y3IM5<-$hC(y5^zEYVPaD(#ZKk8sXCX{raOd{{1MrkisZk(XCJVLV$>w<=%Ti{GLCQ11RbH$I zT&Y6NSBgq(MZ^VKH-%Jup3vs#iZW5D?>_Tvp#|Mho~BYM5}PNLc0Kr%7Xv{FDVb-R z<9}S5-|NK3s)90}Y7R}e(vt|!4!0&_BEMq{?P=`9*Hh+)evF5;GxMYP+8N_%?FUZi zI`JgBWr07P`r+l@w8(Q@JgQ|kksmwn#~wbdi7PL3wVI7SI^m@^#p9YEO@hFWW6#BB zHB;5OWgjLHbG@+_`;!n)_CmpAR`uS`iM-GWs?ctLha$SX^`}PFx*E`T#%#xYhoY(1 z<^g`a9;$RXT*~FS%u2l(iSZ|J|J literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/attrDef.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/attrDef.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e930ddc9606663bdcc708c4cae29431bda61859b GIT binary patch literal 4130 zcmbtXOLH5?5$;{QUnE4zq8~|V{&feTfNmT;uHhN}yrhB@-?ip;fTJ^8~ zF2wmd(Z6WvQw0ABUiD{?fT#~@QD9SK(a@&8O;%8#ph!`HhDGWZvv!H15)I4LFK6vC zMHL!Wsb8gGjruhj)~R2oVT1Y&8aAolq+yHtEwX+YR4Ay@7tm8Bu|k&x>aS8zqh6<; zTJ^7C26e2o5{0o)V)V70wO4uvzxnM!_tAlS{QJiTJxDY^-`{)uYjJTPWgpBGu!=tlFLCf$p z3RWmsH9Q2`6x=X;gH`l8YiVUqYq>85-isp9uaYQm^r>(HF$m*Ohe_-t1ILRU4^rXD zSc`hy!Dn~mNpI-H-canC2~v2`LdXncg8E`4W^xKk#Lt%JKNlC-^nnaT97GpJ($R@C zR>BEm=fzlHM8Sf~n>eHpk#&JRmx#XU!dU^h` zlSWdwM%S`gT6(b>Byz~w$MBF8dMsnud~)F^;Yt5=Nx`)xUek~${eP>tw#IcGv-s?0 z_AbmdQDt||W68erPLznX^W)hp#gXVH`m^CE5<`q+v4OLba|0ECw420OMCCx}ENy?T zI}7_}deS`EGH|0M`uQQLT3wfMM7Buxbg>Fid zw=+cP5Tz$@_Og1s>wJ7qKJ45~i(F*W;#m^LX-SQuP^Sgdue6$1jkGpT@3cOer(s%| z!9HENitV(q1c|gZk4)O+x*7@BU^uNNVc>@GAW0hupebFpL#6c)Qdt7X5~7qAl+dyY zPS%-JKswE|s6;f7tK7531Q!F6H<`S__mY#dN8A?7O025-eG_uMYl(Aj|<~N?YbXfA$1poteSNf z@AYrlYFexI8oo_y(w@10JD=`bJQbe;Uf!_5=Q(;2$1|9{GrQ3+IMHJh0H6&TF^bS{ z@EaQpV(=BDGC_k=^gIWedW2h0jDtGsEYb#!`;DJ1giEB$^t?*)m660TUM6ked{#0_ zmSl1Klac*0m#yTo)$6jj9%Qm#<+9aWwsu{%PU_oSs+LRDuS+3q?(m&1hK==H%H&D5 zAGoMVQduuQ$OoIe#952;3(Wr0H|Z6U1WtrM8nl6oH#1*6v7Vr}*J*Yq<-OzMqg`iW zZ#r@XF`3xTAHK1kPMXeEUjH$=g4P_}Xx~748RF<#HxsVb*h$-TF4adY?{rq>51>i5 znJ}c&ViW>)2I36obmi&+g~ZTuf$Sx;zr#!1V8WQ{6y$B5Zb@D-76$nld6)YEWGP0{ zbswXpSQA-4x3;WJ^Sy7~2cU0Tx2`}po8afro%2LSG;iDKSEHILC9LQ+V*5+VHOYnZ&tx4|II4736Pff52Gw_{y>NK^(;CsRb)Ubr> zMhk;#R?A*4aG8M50pm{*@4UdFcA4Or|7#q)9tRShnUyP(p|@TY*jyNi#FhJ8_P`_g zv(xwz|K>C*T7ifEg7X?DV2RF5Da2w(?D;uZ?3!&&ZsKHf-n*yXbG!&w_<--SdeXS3 z9NcwrBC3a-N?L*8Tl7z5v-`{U&EApO3Da)?Ig)1Y?||ZrXHl zt@fhX2vR9Xe5CVzUY*m!B%b^Ub6ZTdnf#QAF<@cT!ZJ<~Hc@dQYQ9mn-`{AqnuTVW zzb1jYownS?U}`7IR2Wkt&0*bN^%E(!#Y!LC~>(|CQjMO&%+-8n6r@8Sf7Yo^7 i!j6y+n3yE}4%5==$JxdoGO!g-Ex*;a+g97!F8mvhiRXR* literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/attribute.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/attribute.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90b2c73aaa9417c951bc356c2ab3691ab42c2964 GIT binary patch literal 9955 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/cursor.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/cursor.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ffe3783c2425cb68c11f4e687b752844f42720a GIT binary patch literal 29239 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 ad0>u)r|{pYb|*8b%*fPVn&jnprYQ|I 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/objectDef.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/__pycache__/objectDef.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20e5c3993513a4acbd41e7b975eb0f65f67dd74d GIT binary patch literal 9497 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 UhlOK}Ov88?zq1e&{$0%eA8hpK{{R30 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attrDef.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attrDef.py new file mode 100644 index 0000000..caffb53 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attrDef.py @@ -0,0 +1,121 @@ +""" +""" + +# Created on 2014.01.11 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata + +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .. import SEQUENCE_TYPES +from ..core.exceptions import LDAPKeyError +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +class AttrDef(object): + """Hold the definition of an attribute + + :param name: the real attribute name + :type name: string + :param key: the friendly name to use in queries and when accessing the attribute, default to the real attribute name + :type key: string + :param validate: called to check if the value in the query is valid, the callable is called with the value parameter + :type validate: callable + :param pre_query: called to transform values returned by search + :type pre_query: callable + :param post_query: called to transform values returned by search + :type post_query: callable + :param default: value returned when the attribute is absent (defaults to NotImplemented to allow use of None as default) + :type default: string, integer + :param dereference_dn: reference to an ObjectDef instance. When the attribute value contains a dn it will be searched and substituted in the entry + :type dereference_dn: ObjectDef + :param description: custom attribute description + :type description: string + :param mandatory: specify if attribute is defined as mandatory in LDAP schema + :type mandatory: boolean + """ + + def __init__(self, name, key=None, validate=None, pre_query=None, post_query=None, default=NotImplemented, dereference_dn=None, description=None, mandatory=False, single_value=None, alias=None): + self.name = name + self.key = ''.join(key.split()) if key else name # key set to name if not present + self.validate = validate + self.pre_query = pre_query + self.post_query = post_query + self.default = default + self.dereference_dn = dereference_dn + self.description = description + self.mandatory = mandatory + self.single_value = single_value + self.oid_info = None + if not alias: + self.other_names = None + elif isinstance(alias, SEQUENCE_TYPES): # multiple aliases + self.\ + other_names = set(alias) + else: # single alias + self.other_names = set([alias]) # python 2 compatibility + + if log_enabled(BASIC): + log(BASIC, 'instantiated AttrDef: <%r>', self) + + def __repr__(self): + r = 'ATTR: ' + ', '.join([self.key] + list(self.other_names)) if self.other_names else self.key + r += '' if self.name == self.key else ' [' + self.name + ']' + r += '' if self.default is NotImplemented else ' - default: ' + str(self.default) + r += '' if self.mandatory is None else ' - mandatory: ' + str(self.mandatory) + r += '' if self.single_value is None else ' - single_value: ' + str(self.single_value) + r += '' if not self.dereference_dn else ' - dereference_dn: ' + str(self.dereference_dn) + r += '' if not self.description else ' - description: ' + str(self.description) + if self.oid_info: + for line in str(self.oid_info).split(linesep): + r += linesep + ' ' + line + return r + + def __str__(self): + return self.__repr__() + + def __eq__(self, other): + if isinstance(other, AttrDef): + return self.key == other.key + + return False + + def __lt__(self, other): + if isinstance(other, AttrDef): + return self.key < other.key + + return False + + def __hash__(self): + if self.key: + return hash(self.key) + else: + return id(self) # unique for each instance + + def __setattr__(self, key, value): + if hasattr(self, 'key') and key == 'key': # key cannot be changed because is being used for __hash__ + error_message = 'key \'%s\' already set' % key + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + else: + object.__setattr__(self, key, value) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attribute.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attribute.py new file mode 100644 index 0000000..5d33cc7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/attribute.py @@ -0,0 +1,290 @@ +""" +""" + +# Created on 2014.01.06 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .. import MODIFY_ADD, MODIFY_REPLACE, MODIFY_DELETE, SEQUENCE_TYPES +from ..core.exceptions import LDAPCursorError +from ..utils.repr import to_stdout_encoding +from . import STATUS_PENDING_CHANGES, STATUS_VIRTUAL, STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +# noinspection PyUnresolvedReferences +class Attribute(object): + """Attribute/values object, it includes the search result (after post_query transformation) of each attribute in an entry + + Attribute object is read only + + - values: contain the processed attribute values + - raw_values': contain the unprocessed attribute values + + + """ + + def __init__(self, attr_def, entry, cursor): + self.key = attr_def.key + self.definition = attr_def + self.values = [] + self.raw_values = [] + self.response = None + self.entry = entry + self.cursor = cursor + other_names = [name for name in attr_def.oid_info.name if self.key.lower() != name.lower()] if attr_def.oid_info else None + self.other_names = set(other_names) if other_names else None # self.other_names is None if there are no short names, else is a set of secondary names + + def __repr__(self): + if len(self.values) == 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + elif len(self.values) > 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + filler = ' ' * (len(self.key) + 6) + for value in self.values[1:]: + r += linesep + filler + to_stdout_encoding(value) + else: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding('') + + return r + + def __str__(self): + if len(self.values) == 1: + return to_stdout_encoding(self.values[0]) + else: + return to_stdout_encoding(self.values) + + def __len__(self): + return len(self.values) + + def __iter__(self): + return self.values.__iter__() + + def __getitem__(self, item): + return self.values[item] + + def __getstate__(self): + cpy = dict(self.__dict__) + cpy['cursor'] = None + return cpy + + def __eq__(self, other): + try: + if self.value == other: + return True + except Exception: + return False + + def __ne__(self, other): + return not self == other + + @property + def value(self): + """ + :return: The single value or a list of values of the attribute. + """ + if not self.values: + return None + + return self.values[0] if len(self.values) == 1 else self.values + + +class OperationalAttribute(Attribute): + """Operational attribute/values object. Include the search result of an + operational attribute in an entry + + OperationalAttribute object is read only + + - values: contains the processed attribute values + - raw_values: contains the unprocessed attribute values + + It may not have an AttrDef + + """ + + def __repr__(self): + if len(self.values) == 1: + r = to_stdout_encoding(self.key) + ' [OPERATIONAL]: ' + to_stdout_encoding(self.values[0]) + elif len(self.values) > 1: + r = to_stdout_encoding(self.key) + ' [OPERATIONAL]: ' + to_stdout_encoding(self.values[0]) + filler = ' ' * (len(self.key) + 6) + for value in sorted(self.values[1:]): + r += linesep + filler + to_stdout_encoding(value) + else: + r = '' + + return r + + +class WritableAttribute(Attribute): + def __repr__(self): + filler = ' ' * (len(self.key) + 6) + if len(self.values) == 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + elif len(self.values) > 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + for value in self.values[1:]: + r += linesep + filler + to_stdout_encoding(value) + else: + r = to_stdout_encoding(self.key) + to_stdout_encoding(': ') + if self.definition.name in self.entry._changes: + r += linesep + filler + 'CHANGES: ' + str(self.entry._changes[self.definition.name]) + return r + + def __iadd__(self, other): + self.add(other) + return Ellipsis # hack to avoid calling set() in entry __setattr__ + + def __isub__(self, other): + self.delete(other) + return Ellipsis # hack to avoid calling set_value in entry __setattr__ + + def _update_changes(self, changes, remove_old=False): + # checks for friendly key in AttrDef and uses the real attribute name + if self.definition and self.definition.name: + key = self.definition.name + else: + key = self.key + + if key not in self.entry._changes or remove_old: # remove old changes (for removing attribute) + self.entry._changes[key] = [] + + self.entry._changes[key].append(changes) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'updated changes <%r> for <%s> attribute in <%s> entry', changes, self.key, self.entry.entry_dn) + self.entry._state.set_status(STATUS_PENDING_CHANGES) + + def add(self, values): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'adding %r to <%s> attribute in <%s> entry', values, self.key, self.entry.entry_dn) + # new value for attribute to commit with a MODIFY_ADD + if self.entry._state._initial_status == STATUS_VIRTUAL: + error_message = 'cannot perform a modify operation in a new entry' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot add attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is None: + error_message = 'value to add cannot be None' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is not None: + validated = self.definition.validate(values) # returns True, False or a value to substitute to the actual values + if validated is False: + error_message = 'value \'%s\' non valid for attribute \'%s\'' % (values, self.key) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif validated is not True: # a valid LDAP value equivalent to the actual values + values = validated + self._update_changes((MODIFY_ADD, values if isinstance(values, SEQUENCE_TYPES) else [values])) + + def set(self, values): + # new value for attribute to commit with a MODIFY_REPLACE, old values are deleted + if log_enabled(PROTOCOL): + log(PROTOCOL, 'setting %r to <%s> attribute in <%s> entry', values, self.key, self.entry.entry_dn) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot set attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is None: + error_message = 'new value cannot be None' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + validated = self.definition.validate(values) # returns True, False or a value to substitute to the actual values + if validated is False: + error_message = 'value \'%s\' non valid for attribute \'%s\'' % (values, self.key) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif validated is not True: # a valid LDAP value equivalent to the actual values + values = validated + self._update_changes((MODIFY_REPLACE, values if isinstance(values, SEQUENCE_TYPES) else [values]), remove_old=True) + + def delete(self, values): + # value for attribute to delete in commit with a MODIFY_DELETE + if log_enabled(PROTOCOL): + log(PROTOCOL, 'deleting %r from <%s> attribute in <%s> entry', values, self.key, self.entry.entry_dn) + if self.entry._state._initial_status == STATUS_VIRTUAL: + error_message = 'cannot delete an attribute value in a new entry' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot delete attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is None: + error_message = 'value to delete cannot be None' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if not isinstance(values, SEQUENCE_TYPES): + values = [values] + for single_value in values: + if single_value not in self.values: + error_message = 'value \'%s\' not present in \'%s\'' % (single_value, ', '.join(self.values)) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._update_changes((MODIFY_DELETE, values)) + + def remove(self): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'removing <%s> attribute in <%s> entry', self.key, self.entry.entry_dn) + if self.entry._state._initial_status == STATUS_VIRTUAL: + error_message = 'cannot remove an attribute in a new entry' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot remove attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._update_changes((MODIFY_REPLACE, []), True) + + def discard(self): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'discarding <%s> attribute in <%s> entry', self.key, self.entry.entry_dn) + del self.entry._changes[self.key] + if not self.entry._changes: + self.entry._state.set_status(self.entry._state._initial_status) + + @property + def virtual(self): + return False if len(self.values) else True + + @property + def changes(self): + if self.key in self.entry._changes: + return self.entry._changes[self.key] + return None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/cursor.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/cursor.py new file mode 100644 index 0000000..690e87d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/cursor.py @@ -0,0 +1,912 @@ +""" +""" + +# Created on 2014.01.06 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from collections import namedtuple +from copy import deepcopy +from datetime import datetime +from os import linesep +from time import sleep + +from . import STATUS_VIRTUAL, STATUS_READ, STATUS_WRITABLE +from .. import SUBTREE, LEVEL, DEREF_ALWAYS, DEREF_NEVER, BASE, SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from ..abstract import STATUS_PENDING_CHANGES +from .attribute import Attribute, OperationalAttribute, WritableAttribute +from .attrDef import AttrDef +from .objectDef import ObjectDef +from .entry import Entry, WritableEntry +from ..core.exceptions import LDAPCursorError, LDAPObjectDereferenceError +from ..core.results import RESULT_SUCCESS +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..utils.dn import safe_dn, safe_rdn +from ..utils.conv import to_raw +from ..utils.config import get_config_parameter +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED +from ..protocol.oid import ATTRIBUTE_DIRECTORY_OPERATION, ATTRIBUTE_DISTRIBUTED_OPERATION, ATTRIBUTE_DSA_OPERATION, CLASS_AUXILIARY + +Operation = namedtuple('Operation', ('request', 'result', 'response')) + + +def _ret_search_value(value): + return value[0] + '=' + value[1:] if value[0] in '<>~' and value[1] != '=' else value + + +def _create_query_dict(query_text): + """ + Create a dictionary with query key:value definitions + query_text is a comma delimited key:value sequence + """ + query_dict = dict() + if query_text: + for arg_value_str in query_text.split(','): + if ':' in arg_value_str: + arg_value_list = arg_value_str.split(':') + query_dict[arg_value_list[0].strip()] = arg_value_list[1].strip() + + return query_dict + + +class Cursor(object): + # entry_class and attribute_class define the type of entry and attribute used by the cursor + # entry_initial_status defines the initial status of a entry + # entry_class = Entry, must be defined in subclasses + # attribute_class = Attribute, must be defined in subclasses + # entry_initial_status = STATUS, must be defined in subclasses + + def __init__(self, connection, object_def, get_operational_attributes=False, attributes=None, controls=None, auxiliary_class=None): + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + self.connection = connection + self.get_operational_attributes = get_operational_attributes + if connection._deferred_bind or connection._deferred_open: # probably a lazy connection, tries to bind + connection._fire_deferred() + + if isinstance(object_def, (STRING_TYPES, SEQUENCE_TYPES)): + if connection.closed: # try to open connection if closed to read schema + connection.bind() + object_def = ObjectDef(object_def, connection.server.schema, auxiliary_class=auxiliary_class) + self.definition = object_def + if attributes: # checks if requested attributes are defined in ObjectDef + not_defined_attributes = [] + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + + for attribute in attributes: + if attribute not in self.definition._attributes and attribute.lower() not in conf_attributes_excluded_from_object_def: + not_defined_attributes.append(attribute) + + if not_defined_attributes: + error_message = 'Attributes \'%s\' non in definition' % ', '.join(not_defined_attributes) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + self.attributes = set(attributes) if attributes else set([attr.name for attr in self.definition]) + self.controls = controls + self.execution_time = None + self.entries = [] + self.schema = self.connection.server.schema + self._do_not_reset = False # used for refreshing entry in entry_refresh() without removing all entries from the Cursor + self._operation_history = list() # a list storing all the requests, results and responses for the last cursor operation + + def __repr__(self): + r = 'CURSOR : ' + self.__class__.__name__ + linesep + r += 'CONN : ' + str(self.connection) + linesep + r += 'DEFS : ' + ', '.join(self.definition._object_class) + if self.definition._auxiliary_class: + r += ' [AUX: ' + ', '.join(self.definition._auxiliary_class) + ']' + r += linesep + # for attr_def in sorted(self.definition): + # r += (attr_def.key if attr_def.key == attr_def.name else (attr_def.key + ' <' + attr_def.name + '>')) + ', ' + # if r[-2] == ',': + # r = r[:-2] + # r += ']' + linesep + if hasattr(self, 'attributes'): + r += 'ATTRS : ' + repr(sorted(self.attributes)) + (' [OPERATIONAL]' if self.get_operational_attributes else '') + linesep + if isinstance(self, Reader): + if hasattr(self, 'base'): + r += 'BASE : ' + repr(self.base) + (' [SUB]' if self.sub_tree else ' [LEVEL]') + linesep + if hasattr(self, '_query') and self._query: + r += 'QUERY : ' + repr(self._query) + ('' if '(' in self._query else (' [AND]' if self.components_in_and else ' [OR]')) + linesep + if hasattr(self, 'validated_query') and self.validated_query: + r += 'PARSED : ' + repr(self.validated_query) + ('' if '(' in self._query else (' [AND]' if self.components_in_and else ' [OR]')) + linesep + if hasattr(self, 'query_filter') and self.query_filter: + r += 'FILTER : ' + repr(self.query_filter) + linesep + + if hasattr(self, 'execution_time') and self.execution_time: + r += 'ENTRIES: ' + str(len(self.entries)) + r += ' [executed at: ' + str(self.execution_time.isoformat()) + ']' + linesep + + if self.failed: + r += 'LAST OPERATION FAILED [' + str(len(self.errors)) + ' failure' + ('s' if len(self.errors) > 1 else '') + ' at operation' + ('s ' if len(self.errors) > 1 else ' ') + ', '.join([str(i) for i, error in enumerate(self.operations) if error.result['result'] != RESULT_SUCCESS]) + ']' + + return r + + def __str__(self): + return self.__repr__() + + def __iter__(self): + return self.entries.__iter__() + + def __getitem__(self, item): + """Return indexed item, if index is not found then try to sequentially search in DN of entries. + If only one entry is found return it else raise a KeyError exception. The exception message + includes the number of entries that matches, if less than 10 entries match then show the DNs + in the exception message. + """ + try: + return self.entries[item] + except TypeError: + pass + + if isinstance(item, STRING_TYPES): + found = self.match_dn(item) + + if len(found) == 1: + return found[0] + elif len(found) > 1: + error_message = 'Multiple entries found: %d entries match the text in dn' % len(found) + ('' if len(found) > 10 else (' [' + '; '.join([e.entry_dn for e in found]) + ']')) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise KeyError(error_message) + + error_message = 'no entry found' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise KeyError(error_message) + + def __len__(self): + return len(self.entries) + + if str is not bytes: # Python 3 + def __bool__(self): # needed to make the cursor appears as existing in "if cursor:" even if there are no entries + return True + else: # Python 2 + def __nonzero__(self): + return True + + def _get_attributes(self, response, attr_defs, entry): + """Assign the result of the LDAP query to the Entry object dictionary. + + If the optional 'post_query' callable is present in the AttrDef it is called with each value of the attribute and the callable result is stored in the attribute. + + Returns the default value for missing attributes. + If the 'dereference_dn' in AttrDef is a ObjectDef then the attribute values are treated as distinguished name and the relevant entry is retrieved and stored in the attribute value. + + """ + conf_operational_attribute_prefix = get_config_parameter('ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX') + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + attributes = CaseInsensitiveWithAliasDict() + used_attribute_names = set() + for attr in attr_defs: + attr_def = attr_defs[attr] + attribute_name = None + for attr_name in response['attributes']: + if attr_def.name.lower() == attr_name.lower(): + attribute_name = attr_name + break + + if attribute_name or attr_def.default is not NotImplemented: # attribute value found in result or default value present - NotImplemented allows use of None as default + attribute = self.attribute_class(attr_def, entry, self) + attribute.response = response + attribute.raw_values = response['raw_attributes'][attribute_name] if attribute_name else None + if attr_def.post_query and attr_def.name in response['attributes'] and response['raw_attributes'] != list(): + attribute.values = attr_def.post_query(attr_def.key, response['attributes'][attribute_name]) + else: + if attr_def.default is NotImplemented or (attribute_name and response['raw_attributes'][attribute_name] != list()): + attribute.values = response['attributes'][attribute_name] + else: + attribute.values = attr_def.default if isinstance(attr_def.default, SEQUENCE_TYPES) else [attr_def.default] + if not isinstance(attribute.values, list): # force attribute values to list (if attribute is single-valued) + attribute.values = [attribute.values] + if attr_def.dereference_dn: # try to get object referenced in value + if attribute.values: + temp_reader = Reader(self.connection, attr_def.dereference_dn, base='', get_operational_attributes=self.get_operational_attributes, controls=self.controls) + temp_values = [] + for element in attribute.values: + if entry.entry_dn != element: + temp_values.append(temp_reader.search_object(element)) + else: + error_message = 'object %s is referencing itself in the \'%s\' attribute' % (entry.entry_dn, attribute.definition.name) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectDereferenceError(error_message) + del temp_reader # remove the temporary Reader + attribute.values = temp_values + attributes[attribute.key] = attribute + if attribute.other_names: + attributes.set_alias(attribute.key, attribute.other_names) + if attr_def.other_names: + attributes.set_alias(attribute.key, attr_def.other_names) + used_attribute_names.add(attribute_name) + + if self.attributes: + used_attribute_names.update(self.attributes) + + for attribute_name in response['attributes']: + if attribute_name not in used_attribute_names: + operational_attribute = False + # check if the type is an operational attribute + if attribute_name in self.schema.attribute_types: + if self.schema.attribute_types[attribute_name].no_user_modification or self.schema.attribute_types[attribute_name].usage in [ATTRIBUTE_DIRECTORY_OPERATION, ATTRIBUTE_DISTRIBUTED_OPERATION, ATTRIBUTE_DSA_OPERATION]: + operational_attribute = True + else: + operational_attribute = True + if not operational_attribute and attribute_name not in attr_defs and attribute_name.lower() not in conf_attributes_excluded_from_object_def: + error_message = 'attribute \'%s\' not in object class \'%s\' for entry %s' % (attribute_name, ', '.join(entry.entry_definition._object_class), entry.entry_dn) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + attribute = OperationalAttribute(AttrDef(conf_operational_attribute_prefix + attribute_name), entry, self) + attribute.raw_values = response['raw_attributes'][attribute_name] + attribute.values = response['attributes'][attribute_name] if isinstance(response['attributes'][attribute_name], SEQUENCE_TYPES) else [response['attributes'][attribute_name]] + if (conf_operational_attribute_prefix + attribute_name) not in attributes: + attributes[conf_operational_attribute_prefix + attribute_name] = attribute + + return attributes + + def match_dn(self, dn): + """Return entries with text in DN""" + matched = [] + for entry in self.entries: + if dn.lower() in entry.entry_dn.lower(): + matched.append(entry) + return matched + + def match(self, attributes, value): + """Return entries with text in one of the specified attributes""" + matched = [] + if not isinstance(attributes, SEQUENCE_TYPES): + attributes = [attributes] + + for entry in self.entries: + found = False + for attribute in attributes: + if attribute in entry: + for attr_value in entry[attribute].values: + if hasattr(attr_value, 'lower') and hasattr(value, 'lower') and value.lower() in attr_value.lower(): + found = True + elif value == attr_value: + found = True + if found: + matched.append(entry) + break + if found: + break + # checks raw values, tries to convert value to byte + raw_value = to_raw(value) + if isinstance(raw_value, (bytes, bytearray)): + for attr_value in entry[attribute].raw_values: + if hasattr(attr_value, 'lower') and hasattr(raw_value, 'lower') and raw_value.lower() in attr_value.lower(): + found = True + elif raw_value == attr_value: + found = True + if found: + matched.append(entry) + break + if found: + break + return matched + + def _create_entry(self, response): + if not response['type'] == 'searchResEntry': + return None + + entry = self.entry_class(response['dn'], self) # define an Entry (writable or readonly), as specified in the cursor definition + entry._state.attributes = self._get_attributes(response, self.definition._attributes, entry) + entry._state.raw_attributes = deepcopy(response['raw_attributes']) + + entry._state.response = response + entry._state.read_time = datetime.now() + entry._state.set_status(self.entry_initial_status) + for attr in entry: # returns the whole attribute object + entry.__dict__[attr.key] = attr + + return entry + + def _execute_query(self, query_scope, attributes): + if not self.connection: + error_message = 'no connection established' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + old_query_filter = None + if query_scope == BASE: # requesting a single object so an always-valid filter is set + if hasattr(self, 'query_filter'): # only Reader has a query filter + old_query_filter = self.query_filter + self.query_filter = '(objectclass=*)' + else: + self._create_query_filter() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'executing query - base: %s - filter: %s - scope: %s for <%s>', self.base, self.query_filter, query_scope, self) + with self.connection: + result = self.connection.search(search_base=self.base, + search_filter=self.query_filter, + search_scope=query_scope, + dereference_aliases=self.dereference_aliases, + attributes=attributes if attributes else list(self.attributes), + get_operational_attributes=self.get_operational_attributes, + controls=self.controls) + if not self.connection.strategy.sync: + response, result, request = self.connection.get_response(result, get_request=True) + else: + if self.connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = self.connection.response + result = self.connection.result + request = self.connection.request + + self._store_operation_in_history(request, result, response) + + if self._do_not_reset: # trick to not remove entries when using _refresh() + return self._create_entry(response[0]) + + self.entries = [] + for r in response: + entry = self._create_entry(r) + if entry is not None: + self.entries.append(entry) + if 'objectClass' in entry: + for object_class in entry.objectClass: + if self.schema and self.schema.object_classes[object_class].kind == CLASS_AUXILIARY and object_class not in self.definition._auxiliary_class: + # add auxiliary class to object definition + self.definition._auxiliary_class.append(object_class) + self.definition._populate_attr_defs(object_class) + self.execution_time = datetime.now() + + if old_query_filter: # requesting a single object so an always-valid filter is set + self.query_filter = old_query_filter + + def remove(self, entry): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'removing entry <%s> in <%s>', entry, self) + self.entries.remove(entry) + + def _reset_history(self): + self._operation_history = list() + + def _store_operation_in_history(self, request, result, response): + self._operation_history.append(Operation(request, result, response)) + + @property + def operations(self): + return self._operation_history + + @property + def errors(self): + return [error for error in self._operation_history if error.result['result'] != RESULT_SUCCESS] + + @property + def failed(self): + if hasattr(self, '_operation_history'): + return any([error.result['result'] != RESULT_SUCCESS for error in self._operation_history]) + + +class Reader(Cursor): + """Reader object to perform searches: + + :param connection: the LDAP connection object to use + :type connection: LDAPConnection + :param object_def: the ObjectDef of the LDAP object returned + :type object_def: ObjectDef + :param query: the simplified query (will be transformed in an LDAP filter) + :type query: str + :param base: starting base of the search + :type base: str + :param components_in_and: specify if assertions in the query must all be satisfied or not (AND/OR) + :type components_in_and: bool + :param sub_tree: specify if the search must be performed ad Single Level (False) or Whole SubTree (True) + :type sub_tree: bool + :param get_operational_attributes: specify if operational attributes are returned or not + :type get_operational_attributes: bool + :param controls: controls to be used in search + :type controls: tuple + + """ + entry_class = Entry # entries are read_only + attribute_class = Attribute # attributes are read_only + entry_initial_status = STATUS_READ + + def __init__(self, connection, object_def, base, query='', components_in_and=True, sub_tree=True, get_operational_attributes=False, attributes=None, controls=None, auxiliary_class=None): + Cursor.__init__(self, connection, object_def, get_operational_attributes, attributes, controls, auxiliary_class) + self._components_in_and = components_in_and + self.sub_tree = sub_tree + self._query = query + self.base = base + self.dereference_aliases = DEREF_ALWAYS + self.validated_query = None + self._query_dict = dict() + self._validated_query_dict = dict() + self.query_filter = None + self.reset() + + if log_enabled(BASIC): + log(BASIC, 'instantiated Reader Cursor: <%r>', self) + + @property + def query(self): + return self._query + + @query.setter + def query(self, value): + self._query = value + self.reset() + + @property + def components_in_and(self): + return self._components_in_and + + @components_in_and.setter + def components_in_and(self, value): + self._components_in_and = value + self.reset() + + def clear(self): + """Clear the Reader search parameters + + """ + self.dereference_aliases = DEREF_ALWAYS + self._reset_history() + + def reset(self): + """Clear all the Reader parameters + + """ + self.clear() + self.validated_query = None + self._query_dict = dict() + self._validated_query_dict = dict() + self.execution_time = None + self.query_filter = None + self.entries = [] + self._create_query_filter() + + def _validate_query(self): + """Processes the text query and verifies that the requested friendly names are in the Reader dictionary + If the AttrDef has a 'validate' property the callable is executed and if it returns False an Exception is raised + + """ + if not self._query_dict: + self._query_dict = _create_query_dict(self._query) + + query = '' + for d in sorted(self._query_dict): + attr = d[1:] if d[0] in '&|' else d + for attr_def in self.definition: + if ''.join(attr.split()).lower() == attr_def.key.lower(): + attr = attr_def.key + break + if attr in self.definition: + vals = sorted(self._query_dict[d].split(';')) + + query += (d[0] + attr if d[0] in '&|' else attr) + ': ' + for val in vals: + val = val.strip() + val_not = True if val[0] == '!' else False + val_search_operator = '=' # default + if val_not: + if val[1:].lstrip()[0] not in '=<>~': + value = val[1:].lstrip() + else: + val_search_operator = val[1:].lstrip()[0] + value = val[1:].lstrip()[1:] + else: + if val[0] not in '=<>~': + value = val.lstrip() + else: + val_search_operator = val[0] + value = val[1:].lstrip() + + if self.definition[attr].validate: + validated = self.definition[attr].validate(value) # returns True, False or a value to substitute to the actual values + if validated is False: + error_message = 'validation failed for attribute %s and value %s' % (d, val) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif validated is not True: # a valid LDAP value equivalent to the actual values + value = validated + if val_not: + query += '!' + val_search_operator + str(value) + else: + query += val_search_operator + str(value) + + query += ';' + query = query[:-1] + ', ' + else: + error_message = 'attribute \'%s\' not in definition' % attr + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self.validated_query = query[:-2] + self._validated_query_dict = _create_query_dict(self.validated_query) + + def _create_query_filter(self): + """Converts the query dictionary to the filter text""" + self.query_filter = '' + + if self.definition._object_class: + self.query_filter += '(&' + if isinstance(self.definition._object_class, SEQUENCE_TYPES) and len(self.definition._object_class) == 1: + self.query_filter += '(objectClass=' + self.definition._object_class[0] + ')' + elif isinstance(self.definition._object_class, SEQUENCE_TYPES): + self.query_filter += '(&' + for object_class in self.definition._object_class: + self.query_filter += '(objectClass=' + object_class + ')' + self.query_filter += ')' + else: + error_message = 'object class must be a string or a list' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + if self._query and self._query.startswith('(') and self._query.endswith(')'): # query is already an LDAP filter + if 'objectclass' not in self._query.lower(): + self.query_filter += self._query + ')' # if objectclass not in filter adds from definition + else: + self.query_filter = self._query + return + elif self._query: # if a simplified filter is present + if not self.components_in_and: + self.query_filter += '(|' + elif not self.definition._object_class: + self.query_filter += '(&' + + self._validate_query() + + attr_counter = 0 + for attr in sorted(self._validated_query_dict): + attr_counter += 1 + multi = True if ';' in self._validated_query_dict[attr] else False + vals = sorted(self._validated_query_dict[attr].split(';')) + attr_def = self.definition[attr[1:]] if attr[0] in '&|' else self.definition[attr] + if attr_def.pre_query: + modvals = [] + for val in vals: + modvals.append(val[0] + attr_def.pre_query(attr_def.key, val[1:])) + vals = modvals + if multi: + if attr[0] in '&|': + self.query_filter += '(' + attr[0] + else: + self.query_filter += '(|' + + for val in vals: + if val[0] == '!': + self.query_filter += '(!(' + attr_def.name + _ret_search_value(val[1:]) + '))' + else: + self.query_filter += '(' + attr_def.name + _ret_search_value(val) + ')' + if multi: + self.query_filter += ')' + + if not self.components_in_and: + self.query_filter += '))' + else: + self.query_filter += ')' + + if not self.definition._object_class and attr_counter == 1: # removes unneeded starting filter + self.query_filter = self.query_filter[2: -1] + + if self.query_filter == '(|)' or self.query_filter == '(&)': # removes empty filter + self.query_filter = '' + else: # no query, remove unneeded leading (& + self.query_filter = self.query_filter[2:] + + def search(self, attributes=None): + """Perform the LDAP search + + :return: Entries found in search + + """ + self.clear() + query_scope = SUBTREE if self.sub_tree else LEVEL + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing search in <%s>', self) + self._execute_query(query_scope, attributes) + + return self.entries + + def search_object(self, entry_dn=None, attributes=None): # base must be a single dn + """Perform the LDAP search operation SINGLE_OBJECT scope + + :return: Entry found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing object search in <%s>', self) + self.clear() + if entry_dn: + old_base = self.base + self.base = entry_dn + self._execute_query(BASE, attributes) + self.base = old_base + else: + self._execute_query(BASE, attributes) + + return self.entries[0] if len(self.entries) > 0 else None + + def search_level(self, attributes=None): + """Perform the LDAP search operation with SINGLE_LEVEL scope + + :return: Entries found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing single level search in <%s>', self) + self.clear() + self._execute_query(LEVEL, attributes) + + return self.entries + + def search_subtree(self, attributes=None): + """Perform the LDAP search operation WHOLE_SUBTREE scope + + :return: Entries found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing whole subtree search in <%s>', self) + self.clear() + self._execute_query(SUBTREE, attributes) + + return self.entries + + def _entries_generator(self, responses): + for response in responses: + yield self._create_entry(response) + + def search_paged(self, paged_size, paged_criticality=True, generator=True, attributes=None): + """Perform a paged search, can be called as an Iterator + + :param attributes: optional attributes to search + :param paged_size: number of entries returned in each search + :type paged_size: int + :param paged_criticality: specify if server must not execute the search if it is not capable of paging searches + :type paged_criticality: bool + :param generator: if True the paged searches are executed while generating the entries, + if False all the paged searches are execute before returning the generator + :type generator: bool + :return: Entries found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing paged search in <%s> with paged size %s', self, str(paged_size)) + if not self.connection: + error_message = 'no connection established' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + self.clear() + self._create_query_filter() + self.entries = [] + self.execution_time = datetime.now() + response = self.connection.extend.standard.paged_search(search_base=self.base, + search_filter=self.query_filter, + search_scope=SUBTREE if self.sub_tree else LEVEL, + dereference_aliases=self.dereference_aliases, + attributes=attributes if attributes else self.attributes, + get_operational_attributes=self.get_operational_attributes, + controls=self.controls, + paged_size=paged_size, + paged_criticality=paged_criticality, + generator=generator) + if generator: + return self._entries_generator(response) + else: + return list(self._entries_generator(response)) + + +class Writer(Cursor): + entry_class = WritableEntry + attribute_class = WritableAttribute + entry_initial_status = STATUS_WRITABLE + + @staticmethod + def from_cursor(cursor, connection=None, object_def=None, custom_validator=None): + if connection is None: + connection = cursor.connection + if object_def is None: + object_def = cursor.definition + writer = Writer(connection, object_def, attributes=cursor.attributes) + for entry in cursor.entries: + if isinstance(cursor, Reader): + entry.entry_writable(object_def, writer, custom_validator=custom_validator) + elif isinstance(cursor, Writer): + pass + else: + error_message = 'unknown cursor type %s' % str(type(cursor)) + if log_enabled(ERROR): + log(ERROR, '%s', error_message) + raise LDAPCursorError(error_message) + writer.execution_time = cursor.execution_time + if log_enabled(BASIC): + log(BASIC, 'instantiated Writer Cursor <%r> from cursor <%r>', writer, cursor) + return writer + + @staticmethod + def from_response(connection, object_def, response=None): + if response is None: + if not connection.strategy.sync: + error_message = 'with asynchronous strategies response must be specified' + if log_enabled(ERROR): + log(ERROR, '%s', error_message) + raise LDAPCursorError(error_message) + elif connection.response: + response = connection.response + else: + error_message = 'response not present' + if log_enabled(ERROR): + log(ERROR, '%s', error_message) + raise LDAPCursorError(error_message) + writer = Writer(connection, object_def) + + for resp in response: + if resp['type'] == 'searchResEntry': + entry = writer._create_entry(resp) + writer.entries.append(entry) + if log_enabled(BASIC): + log(BASIC, 'instantiated Writer Cursor <%r> from response', writer) + return writer + + def __init__(self, connection, object_def, get_operational_attributes=False, attributes=None, controls=None, auxiliary_class=None): + Cursor.__init__(self, connection, object_def, get_operational_attributes, attributes, controls, auxiliary_class) + self.dereference_aliases = DEREF_NEVER + + if log_enabled(BASIC): + log(BASIC, 'instantiated Writer Cursor: <%r>', self) + + def commit(self, refresh=True): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'committed changes for <%s>', self) + self._reset_history() + successful = True + for entry in self.entries: + if not entry.entry_commit_changes(refresh=refresh, controls=self.controls, clear_history=False): + successful = False + + self.execution_time = datetime.now() + + return successful + + def discard(self): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'discarded changes for <%s>', self) + for entry in self.entries: + entry.entry_discard_changes() + + def _refresh_object(self, entry_dn, attributes=None, tries=4, seconds=2, controls=None): # base must be a single dn + """Performs the LDAP search operation SINGLE_OBJECT scope + + :return: Entry found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'refreshing object <%s> for <%s>', entry_dn, self) + if not self.connection: + error_message = 'no connection established' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + response = [] + with self.connection: + counter = 0 + while counter < tries: + result = self.connection.search(search_base=entry_dn, + search_filter='(objectclass=*)', + search_scope=BASE, + dereference_aliases=DEREF_NEVER, + attributes=attributes if attributes else self.attributes, + get_operational_attributes=self.get_operational_attributes, + controls=controls) + if not self.connection.strategy.sync: + response, result, request = self.connection.get_response(result, get_request=True) + else: + if self.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.connection.response + result = self.connection.result + request = self.connection.request + + if result['result'] in [RESULT_SUCCESS]: + break + sleep(seconds) + counter += 1 + self._store_operation_in_history(request, result, response) + + if len(response) == 1: + return self._create_entry(response[0]) + elif len(response) == 0: + return None + + error_message = 'more than 1 entry returned for a single object search' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + def new(self, dn): + if log_enabled(BASIC): + log(BASIC, 'creating new entry <%s> for <%s>', dn, self) + dn = safe_dn(dn) + for entry in self.entries: # checks if dn is already used in an cursor entry + if entry.entry_dn == dn: + error_message = 'dn already present in cursor' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + rdns = safe_rdn(dn, decompose=True) + entry = self.entry_class(dn, self) # defines a new empty Entry + for attr in entry.entry_mandatory_attributes: # defines all mandatory attributes as virtual + entry._state.attributes[attr] = self.attribute_class(entry._state.definition[attr], entry, self) + entry.__dict__[attr] = entry._state.attributes[attr] + entry.objectclass.set(self.definition._object_class) + for rdn in rdns: # adds virtual attributes from rdns in entry name (should be more than one with + syntax) + if rdn[0] in entry._state.definition._attributes: + rdn_name = entry._state.definition._attributes[rdn[0]].name # normalize case folding + if rdn_name not in entry._state.attributes: + entry._state.attributes[rdn_name] = self.attribute_class(entry._state.definition[rdn_name], entry, self) + entry.__dict__[rdn_name] = entry._state.attributes[rdn_name] + entry.__dict__[rdn_name].set(rdn[1]) + else: + error_message = 'rdn type \'%s\' not in object class definition' % rdn[0] + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + entry._state.set_status(STATUS_VIRTUAL) # set intial status + entry._state.set_status(STATUS_PENDING_CHANGES) # tries to change status to PENDING_CHANGES. If mandatory attributes are missing status is reverted to MANDATORY_MISSING + self.entries.append(entry) + return entry + + def refresh_entry(self, entry, tries=4, seconds=2): + conf_operational_attribute_prefix = get_config_parameter('ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX') + + self._do_not_reset = True + attr_list = [] + if log_enabled(PROTOCOL): + log(PROTOCOL, 'refreshing entry <%s> for <%s>', entry, self) + for attr in entry._state.attributes: # check friendly attribute name in AttrDef, do not check operational attributes + if attr.lower().startswith(conf_operational_attribute_prefix.lower()): + continue + if entry._state.definition[attr].name: + attr_list.append(entry._state.definition[attr].name) + else: + attr_list.append(entry._state.definition[attr].key) + + temp_entry = self._refresh_object(entry.entry_dn, attr_list, tries, seconds=seconds) # if any attributes is added adds only to the entry not to the definition + self._do_not_reset = False + if temp_entry: + temp_entry._state.origin = entry._state.origin + entry.__dict__.clear() + entry.__dict__['_state'] = temp_entry._state + for attr in entry._state.attributes: # returns the attribute key + entry.__dict__[attr] = entry._state.attributes[attr] + + for attr in entry.entry_attributes: # if any attribute of the class was deleted makes it virtual + if attr not in entry._state.attributes and attr in entry.entry_definition._attributes: + entry._state.attributes[attr] = WritableAttribute(entry.entry_definition[attr], entry, self) + entry.__dict__[attr] = entry._state.attributes[attr] + entry._state.set_status(entry._state._initial_status) + return True + return False diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/entry.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/entry.py new file mode 100644 index 0000000..2375796 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/entry.py @@ -0,0 +1,712 @@ +""" +""" + +# Created on 2016.08.19 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +import json +try: + from collections import OrderedDict +except ImportError: + from ..utils.ordDict import OrderedDict # for Python 2.6 + +from os import linesep +from copy import deepcopy + +from .. import STRING_TYPES, SEQUENCE_TYPES, MODIFY_ADD, MODIFY_REPLACE +from .attribute import WritableAttribute +from .objectDef import ObjectDef +from .attrDef import AttrDef +from ..core.exceptions import LDAPKeyError, LDAPCursorError, LDAPCursorAttributeError +from ..utils.conv import check_json_dict, format_json, prepare_for_stream +from ..protocol.rfc2849 import operation_to_ldif, add_ldif_header +from ..utils.dn import safe_dn, safe_rdn, to_dn +from ..utils.repr import to_stdout_encoding +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..utils.config import get_config_parameter +from . import STATUS_VIRTUAL, STATUS_WRITABLE, STATUS_PENDING_CHANGES, STATUS_COMMITTED, STATUS_DELETED,\ + STATUS_INIT, STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING, STATUS_MANDATORY_MISSING, STATUSES, INITIAL_STATUSES +from ..core.results import RESULT_SUCCESS +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +class EntryState(object): + """Contains data on the status of the entry. Does not pollute the Entry __dict__. + + """ + + def __init__(self, dn, cursor): + self.dn = dn + self._initial_status = None + self._to = None # used for move and rename + self.status = STATUS_INIT + self.attributes = CaseInsensitiveWithAliasDict() + self.raw_attributes = CaseInsensitiveWithAliasDict() + self.response = None + self.cursor = cursor + self.origin = None # reference to the original read-only entry (set when made writable). Needed to update attributes in read-only when modified (only if both refer the same server) + self.read_time = None + self.changes = OrderedDict() # includes changes to commit in a writable entry + if cursor.definition: + self.definition = cursor.definition + else: + self.definition = None + + def __repr__(self): + if self.__dict__ and self.dn is not None: + r = 'DN: ' + to_stdout_encoding(self.dn) + ' - STATUS: ' + ((self._initial_status + ', ') if self._initial_status != self.status else '') + self.status + ' - READ TIME: ' + (self.read_time.isoformat() if self.read_time else '') + linesep + r += 'attributes: ' + ', '.join(sorted(self.attributes.keys())) + linesep + r += 'object def: ' + (', '.join(sorted(self.definition._object_class)) if self.definition._object_class else '') + linesep + r += 'attr defs: ' + ', '.join(sorted(self.definition._attributes.keys())) + linesep + r += 'response: ' + ('present' if self.response else '') + linesep + r += 'cursor: ' + (self.cursor.__class__.__name__ if self.cursor else '') + linesep + return r + else: + return object.__repr__(self) + + def __str__(self): + return self.__repr__() + + def __getstate__(self): + cpy = dict(self.__dict__) + cpy['cursor'] = None + return cpy + + def set_status(self, status): + conf_ignored_mandatory_attributes_in_object_def = [v.lower() for v in get_config_parameter('IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF')] + if status not in STATUSES: + error_message = 'invalid entry status ' + str(status) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if status in INITIAL_STATUSES: + self._initial_status = status + self.status = status + if status == STATUS_DELETED: + self._initial_status = STATUS_VIRTUAL + if status == STATUS_COMMITTED: + self._initial_status = STATUS_WRITABLE + if self.status == STATUS_VIRTUAL or (self.status == STATUS_PENDING_CHANGES and self._initial_status == STATUS_VIRTUAL): # checks if all mandatory attributes are present in new entries + for attr in self.definition._attributes: + if self.definition._attributes[attr].mandatory and attr.lower() not in conf_ignored_mandatory_attributes_in_object_def: + if (attr not in self.attributes or self.attributes[attr].virtual) and attr not in self.changes: + self.status = STATUS_MANDATORY_MISSING + break + + @property + def entry_raw_attributes(self): + return self.raw_attributes + + +class EntryBase(object): + """The Entry object contains a single LDAP entry. + Attributes can be accessed either by sequence, by assignment + or as dictionary keys. Keys are not case sensitive. + + The Entry object is read only + + - The DN is retrieved by entry_dn + - The cursor reference is in _cursor + - Raw attributes values are retrieved with _raw_attributes and the _raw_attribute() methods + """ + + def __init__(self, dn, cursor): + self._state = EntryState(dn, cursor) + + def __repr__(self): + if self.__dict__ and self.entry_dn is not None: + r = 'DN: ' + to_stdout_encoding(self.entry_dn) + ' - STATUS: ' + ((self._state._initial_status + ', ') if self._state._initial_status != self.entry_status else '') + self.entry_status + ' - READ TIME: ' + (self.entry_read_time.isoformat() if self.entry_read_time else '') + linesep + if self._state.attributes: + for attr in sorted(self._state.attributes): + if self._state.attributes[attr] or (hasattr(self._state.attributes[attr], 'changes') and self._state.attributes[attr].changes): + r += ' ' + repr(self._state.attributes[attr]) + linesep + return r + else: + return object.__repr__(self) + + def __str__(self): + return self.__repr__() + + def __iter__(self): + for attribute in self._state.attributes: + yield self._state.attributes[attribute] + # raise StopIteration # deprecated in PEP 479 + return + + def __contains__(self, item): + try: + self.__getitem__(item) + return True + except LDAPKeyError: + return False + + def __getattr__(self, item): + if isinstance(item, STRING_TYPES): + if item == '_state': + return object.__getattr__(self, item) + item = ''.join(item.split()).lower() + attr_found = None + for attr in self._state.attributes.keys(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.keys(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.keys(): + if item + ';range' in attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item + ';range' in attr.lower(): + attr_found = attr + break + if not attr_found: + error_message = 'attribute \'%s\' not found' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + return self._state.attributes[attr] + error_message = 'attribute name must be a string' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + def __setattr__(self, item, value): + if item == '_state': + object.__setattr__(self, item, value) + elif item in self._state.attributes: + error_message = 'attribute \'%s\' is read only' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + else: + error_message = 'entry is read only, cannot add \'%s\'' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + def __getitem__(self, item): + if isinstance(item, STRING_TYPES): + item = ''.join(item.split()).lower() + attr_found = None + for attr in self._state.attributes.keys(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.keys(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + error_message = 'key \'%s\' not found' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + return self._state.attributes[attr] + + error_message = 'key must be a string' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + + def __eq__(self, other): + if isinstance(other, EntryBase): + return self.entry_dn == other.entry_dn + + return False + + def __lt__(self, other): + if isinstance(other, EntryBase): + return self.entry_dn <= other.entry_dn + + return False + + @property + def entry_dn(self): + return self._state.dn + + @property + def entry_cursor(self): + return self._state.cursor + + @property + def entry_status(self): + return self._state.status + + @property + def entry_definition(self): + return self._state.definition + + @property + def entry_raw_attributes(self): + return self._state.raw_attributes + + def entry_raw_attribute(self, name): + """ + + :param name: name of the attribute + :return: raw (unencoded) value of the attribute, None if attribute is not found + """ + return self._state.raw_attributes[name] if name in self._state.raw_attributes else None + + @property + def entry_mandatory_attributes(self): + return [attribute for attribute in self.entry_definition._attributes if self.entry_definition._attributes[attribute].mandatory] + + @property + def entry_attributes(self): + return list(self._state.attributes.keys()) + + @property + def entry_attributes_as_dict(self): + return dict((attribute_key, deepcopy(attribute_value.values)) for (attribute_key, attribute_value) in self._state.attributes.items()) + + @property + def entry_read_time(self): + return self._state.read_time + + @property + def _changes(self): + return self._state.changes + + def entry_to_json(self, raw=False, indent=4, sort=True, stream=None, checked_attributes=True, include_empty=True): + json_entry = dict() + json_entry['dn'] = self.entry_dn + if checked_attributes: + if not include_empty: + # needed for python 2.6 compatibility + json_entry['attributes'] = dict((key, self.entry_attributes_as_dict[key]) for key in self.entry_attributes_as_dict if self.entry_attributes_as_dict[key]) + else: + json_entry['attributes'] = self.entry_attributes_as_dict + if raw: + if not include_empty: + # needed for python 2.6 compatibility + json_entry['raw'] = dict((key, self.entry_raw_attributes[key]) for key in self.entry_raw_attributes if self.entry_raw_attributes[key]) + else: + json_entry['raw'] = dict(self.entry_raw_attributes) + + if str is bytes: # Python 2 + check_json_dict(json_entry) + + json_output = json.dumps(json_entry, + ensure_ascii=True, + sort_keys=sort, + indent=indent, + check_circular=True, + default=format_json, + separators=(',', ': ')) + + if stream: + stream.write(json_output) + + return json_output + + def entry_to_ldif(self, all_base64=False, line_separator=None, sort_order=None, stream=None): + ldif_lines = operation_to_ldif('searchResponse', [self._state.response], all_base64, sort_order=sort_order) + ldif_lines = add_ldif_header(ldif_lines) + line_separator = line_separator or linesep + ldif_output = line_separator.join(ldif_lines) + if stream: + if stream.tell() == 0: + header = add_ldif_header(['-'])[0] + stream.write(prepare_for_stream(header + line_separator + line_separator)) + stream.write(prepare_for_stream(ldif_output + line_separator + line_separator)) + return ldif_output + + +class Entry(EntryBase): + """The Entry object contains a single LDAP entry. + Attributes can be accessed either by sequence, by assignment + or as dictionary keys. Keys are not case sensitive. + + The Entry object is read only + + - The DN is retrieved by entry_dn + - The Reader reference is in _cursor() + - Raw attributes values are retrieved by the _ra_attributes and + _raw_attribute() methods + + """ + def entry_writable(self, object_def=None, writer_cursor=None, attributes=None, custom_validator=None, auxiliary_class=None): + conf_operational_attribute_prefix = get_config_parameter('ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX') + if not self.entry_cursor.schema: + error_message = 'schema must be available to make an entry writable' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + # returns a new WritableEntry and its Writer cursor + if object_def is None: + if self.entry_cursor.definition._object_class: + object_def = self.entry_definition._object_class + auxiliary_class = self.entry_definition._auxiliary_class + (auxiliary_class if isinstance(auxiliary_class, SEQUENCE_TYPES) else []) + elif 'objectclass' in self: + object_def = self.objectclass.values + + if not object_def: + error_message = 'object class must be specified to make an entry writable' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + if not isinstance(object_def, ObjectDef): + object_def = ObjectDef(object_def, self.entry_cursor.schema, custom_validator, auxiliary_class) + + if attributes: + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + + if isinstance(attributes, SEQUENCE_TYPES): + for attribute in attributes: + if attribute not in object_def._attributes: + error_message = 'attribute \'%s\' not in schema for \'%s\'' % (attribute, object_def) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + else: + attributes = [] + + if not writer_cursor: + from .cursor import Writer # local import to avoid circular reference in import at startup + writable_cursor = Writer(self.entry_cursor.connection, object_def) + else: + writable_cursor = writer_cursor + + if attributes: # force reading of attributes + writable_entry = writable_cursor._refresh_object(self.entry_dn, list(attributes) + self.entry_attributes) + else: + writable_entry = writable_cursor._create_entry(self._state.response) + writable_cursor.entries.append(writable_entry) + writable_entry._state.read_time = self.entry_read_time + writable_entry._state.origin = self # reference to the original read-only entry + # checks original entry for custom definitions in AttrDefs + attr_to_add = [] + attr_to_remove = [] + object_def_to_add = [] + object_def_to_remove = [] + for attr in writable_entry._state.origin.entry_definition._attributes: + original_attr = writable_entry._state.origin.entry_definition._attributes[attr] + if attr != original_attr.name and (attr not in writable_entry._state.attributes or conf_operational_attribute_prefix + original_attr.name not in writable_entry._state.attributes): + old_attr_def = writable_entry.entry_definition._attributes[original_attr.name] + new_attr_def = AttrDef(original_attr.name, + key=attr, + validate=original_attr.validate, + pre_query=original_attr.pre_query, + post_query=original_attr.post_query, + default=original_attr.default, + dereference_dn=original_attr.dereference_dn, + description=original_attr.description, + mandatory=old_attr_def.mandatory, # keeps value read from schema + single_value=old_attr_def.single_value, # keeps value read from schema + alias=original_attr.other_names) + od = writable_entry.entry_definition + object_def_to_remove.append(old_attr_def) + object_def_to_add.append(new_attr_def) + # updates attribute name in entry attributes + new_attr = WritableAttribute(new_attr_def, writable_entry, writable_cursor) + if original_attr.name in writable_entry._state.attributes: + new_attr.other_names = writable_entry._state.attributes[original_attr.name].other_names + new_attr.raw_values = writable_entry._state.attributes[original_attr.name].raw_values + new_attr.values = writable_entry._state.attributes[original_attr.name].values + new_attr.response = writable_entry._state.attributes[original_attr.name].response + attr_to_add.append((attr, new_attr)) + attr_to_remove.append(original_attr.name) + # writable_entry._state.attributes[attr] = new_attr + ## writable_entry._state.attributes.set_alias(attr, new_attr.other_names) + # del writable_entry._state.attributes[original_attr.name] + for attr, new_attr in attr_to_add: + writable_entry._state.attributes[attr] = new_attr + for attr in attr_to_remove: + del writable_entry._state.attributes[attr] + for object_def in object_def_to_remove: + o = writable_entry.entry_definition + o -= object_def + for object_def in object_def_to_add: + o = writable_entry.entry_definition + o += object_def + + writable_entry._state.set_status(STATUS_WRITABLE) + return writable_entry + + +class WritableEntry(EntryBase): + def __setitem__(self, key, value): + if value is not Ellipsis: # hack for using implicit operators in writable attributes + self.__setattr__(key, value) + + def __setattr__(self, item, value): + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + if item == '_state' and isinstance(value, EntryState): + self.__dict__['_state'] = value + return + + if value is not Ellipsis: # hack for using implicit operators in writable attributes + # checks if using an alias + if item in self.entry_cursor.definition._attributes or item.lower() in conf_attributes_excluded_from_object_def: + if item not in self._state.attributes: # setting value to an attribute still without values + new_attribute = WritableAttribute(self.entry_cursor.definition._attributes[item], self, cursor=self.entry_cursor) + self._state.attributes[str(item)] = new_attribute # force item to a string for key in attributes dict + self._state.attributes[item].set(value) # try to add to new_values + else: + error_message = 'attribute \'%s\' not defined' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + def __getattr__(self, item): + if isinstance(item, STRING_TYPES): + if item == '_state': + return self.__dict__['_state'] + item = ''.join(item.split()).lower() + for attr in self._state.attributes.keys(): + if item == attr.lower(): + return self._state.attributes[attr] + for attr in self._state.attributes.aliases(): + if item == attr.lower(): + return self._state.attributes[attr] + if item in self.entry_definition._attributes: # item is a new attribute to commit, creates the AttrDef and add to the attributes to retrive + self._state.attributes[item] = WritableAttribute(self.entry_definition._attributes[item], self, self.entry_cursor) + self.entry_cursor.attributes.add(item) + return self._state.attributes[item] + error_message = 'attribute \'%s\' not defined' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + else: + error_message = 'attribute name must be a string' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + @property + def entry_virtual_attributes(self): + return [attr for attr in self.entry_attributes if self[attr].virtual] + + def entry_commit_changes(self, refresh=True, controls=None, clear_history=True): + if clear_history: + self.entry_cursor._reset_history() + + if self.entry_status == STATUS_READY_FOR_DELETION: + result = self.entry_cursor.connection.delete(self.entry_dn, controls) + if not self.entry_cursor.connection.strategy.sync: + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + if result['result'] == RESULT_SUCCESS: + dn = self.entry_dn + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # deletes original read-only Entry + cursor = self._state.origin.entry_cursor + self._state.origin.__dict__.clear() + self._state.origin.__dict__['_state'] = EntryState(dn, cursor) + self._state.origin._state.set_status(STATUS_DELETED) + cursor = self.entry_cursor + self.__dict__.clear() + self._state = EntryState(dn, cursor) + self._state.set_status(STATUS_DELETED) + return True + return False + elif self.entry_status == STATUS_READY_FOR_MOVING: + result = self.entry_cursor.connection.modify_dn(self.entry_dn, '+'.join(safe_rdn(self.entry_dn)), new_superior=self._state._to) + if not self.entry_cursor.connection.strategy.sync: + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + if result['result'] == RESULT_SUCCESS: + self._state.dn = safe_dn('+'.join(safe_rdn(self.entry_dn)) + ',' + self._state._to) + if refresh: + if self.entry_refresh(): + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # refresh dn of origin + self._state.origin._state.dn = self.entry_dn + self._state.set_status(STATUS_COMMITTED) + self._state._to = None + return True + return False + elif self.entry_status == STATUS_READY_FOR_RENAMING: + rdn = '+'.join(safe_rdn(self._state._to)) + result = self.entry_cursor.connection.modify_dn(self.entry_dn, rdn) + if not self.entry_cursor.connection.strategy.sync: + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + if result['result'] == RESULT_SUCCESS: + self._state.dn = rdn + ',' + ','.join(to_dn(self.entry_dn)[1:]) + if refresh: + if self.entry_refresh(): + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # refresh dn of origin + self._state.origin._state.dn = self.entry_dn + self._state.set_status(STATUS_COMMITTED) + self._state._to = None + return True + return False + elif self.entry_status in [STATUS_VIRTUAL, STATUS_MANDATORY_MISSING]: + missing_attributes = [] + for attr in self.entry_mandatory_attributes: + if (attr not in self._state.attributes or self._state.attributes[attr].virtual) and attr not in self._changes: + missing_attributes.append('\'' + attr + '\'') + error_message = 'mandatory attributes %s missing in entry %s' % (', '.join(missing_attributes), self.entry_dn) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif self.entry_status == STATUS_PENDING_CHANGES: + if self._changes: + if self.entry_definition._auxiliary_class: # checks if an attribute is from an auxiliary class and adds it to the objectClass attribute if not present + for attr in self._changes: + # checks schema to see if attribute is defined in one of the already present object classes + attr_classes = self.entry_cursor.schema.attribute_types[attr].mandatory_in + self.entry_cursor.schema.attribute_types[attr].optional_in + for object_class in self.objectclass: + if object_class in attr_classes: + break + else: # executed only if the attribute class is not present in the objectClass attribute + # checks if attribute is defined in one of the possible auxiliary classes + for aux_class in self.entry_definition._auxiliary_class: + if aux_class in attr_classes: + if self._state._initial_status == STATUS_VIRTUAL: # entry is new, there must be a pending objectClass MODIFY_REPLACE + self._changes['objectClass'][0][1].append(aux_class) + else: + self.objectclass += aux_class + if self._state._initial_status == STATUS_VIRTUAL: + new_attributes = dict() + for attr in self._changes: + new_attributes[attr] = self._changes[attr][0][1] + result = self.entry_cursor.connection.add(self.entry_dn, None, new_attributes, controls) + else: + result = self.entry_cursor.connection.modify(self.entry_dn, self._changes, controls) + + if not self.entry_cursor.connection.strategy.sync: # asynchronous request + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + + if result['result'] == RESULT_SUCCESS: + if refresh: + if self.entry_refresh(): + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # updates original read-only entry if present + for attr in self: # adds AttrDefs from writable entry to origin entry definition if some is missing + if attr.key in self.entry_definition._attributes and attr.key not in self._state.origin.entry_definition._attributes: + self._state.origin.entry_cursor.definition.add_attribute(self.entry_cursor.definition._attributes[attr.key]) # adds AttrDef from writable entry to original entry if missing + temp_entry = self._state.origin.entry_cursor._create_entry(self._state.response) + self._state.origin.__dict__.clear() + self._state.origin.__dict__['_state'] = temp_entry._state + for attr in self: # returns the whole attribute object + if not hasattr(attr,'virtual'): + self._state.origin.__dict__[attr.key] = self._state.origin._state.attributes[attr.key] + self._state.origin._state.read_time = self.entry_read_time + else: + self.entry_discard_changes() # if not refreshed remove committed changes + self._state.set_status(STATUS_COMMITTED) + return True + return False + + def entry_discard_changes(self): + self._changes.clear() + self._state.set_status(self._state._initial_status) + + def entry_delete(self): + if self.entry_status not in [STATUS_WRITABLE, STATUS_COMMITTED, STATUS_READY_FOR_DELETION]: + error_message = 'cannot delete entry, invalid status: ' + self.entry_status + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._state.set_status(STATUS_READY_FOR_DELETION) + + def entry_refresh(self, tries=4, seconds=2): + """ + + Refreshes the entry from the LDAP Server + """ + if self.entry_cursor.connection: + if self.entry_cursor.refresh_entry(self, tries, seconds): + return True + + return False + + def entry_move(self, destination_dn): + if self.entry_status not in [STATUS_WRITABLE, STATUS_COMMITTED, STATUS_READY_FOR_MOVING]: + error_message = 'cannot move entry, invalid status: ' + self.entry_status + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._state._to = safe_dn(destination_dn) + self._state.set_status(STATUS_READY_FOR_MOVING) + + def entry_rename(self, new_name): + if self.entry_status not in [STATUS_WRITABLE, STATUS_COMMITTED, STATUS_READY_FOR_RENAMING]: + error_message = 'cannot rename entry, invalid status: ' + self.entry_status + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._state._to = new_name + self._state.set_status(STATUS_READY_FOR_RENAMING) + + @property + def entry_changes(self): + return self._changes diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/objectDef.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/objectDef.py new file mode 100644 index 0000000..1f8609c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/abstract/objectDef.py @@ -0,0 +1,270 @@ +""" +""" + +# Created on 2014.02.02 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .attrDef import AttrDef +from ..core.exceptions import LDAPKeyError, LDAPObjectError, LDAPAttributeError, LDAPSchemaError +from .. import STRING_TYPES, SEQUENCE_TYPES, Server, Connection +from ..protocol.rfc4512 import SchemaInfo, constant_to_class_kind +from ..protocol.formatters.standard import find_attribute_validator +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..utils.config import get_config_parameter +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +class ObjectDef(object): + """Represent an object in the LDAP server. AttrDefs are stored in a dictionary; the key is the friendly name defined in AttrDef. + + AttrDefs can be added and removed using the += and -= operators + + ObjectDef can be accessed either as a sequence and a dictionary. When accessed the whole AttrDef instance is returned + + """ + def __init__(self, object_class=None, schema=None, custom_validator=None, auxiliary_class=None): + if object_class is None: + object_class = [] + + if not isinstance(object_class, SEQUENCE_TYPES): + object_class = [object_class] + + if auxiliary_class is None: + auxiliary_class = [] + + if not isinstance(auxiliary_class, SEQUENCE_TYPES): + auxiliary_class = [auxiliary_class] + + self.__dict__['_attributes'] = CaseInsensitiveWithAliasDict() + self.__dict__['_custom_validator'] = custom_validator + self.__dict__['_oid_info'] = [] + + if isinstance(schema, Connection) and (schema._deferred_bind or schema._deferred_open): # probably a lazy connection, tries to bind + schema._fire_deferred() + + if schema is not None: + if isinstance(schema, Server): + schema = schema.schema + elif isinstance(schema, Connection): + schema = schema.server.schema + elif isinstance(schema, SchemaInfo): + pass + elif schema: + error_message = 'unable to read schema' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPSchemaError(error_message) + if schema is None: + error_message = 'schema not present' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPSchemaError(error_message) + self.__dict__['_schema'] = schema + + if self._schema: + object_class = [schema.object_classes[name].name[0] for name in object_class] # uses object class names capitalized as in schema + auxiliary_class = [schema.object_classes[name].name[0] for name in auxiliary_class] + for object_name in object_class: + if object_name: + self._populate_attr_defs(object_name) + + for object_name in auxiliary_class: + if object_name: + self._populate_attr_defs(object_name) + + self.__dict__['_object_class'] = object_class + self.__dict__['_auxiliary_class'] = auxiliary_class + + if log_enabled(BASIC): + log(BASIC, 'instantiated ObjectDef: <%r>', self) + + def _populate_attr_defs(self, object_name): + if object_name in self._schema.object_classes: + object_schema = self._schema.object_classes[object_name] + self.__dict__['_oid_info'].append(object_name + " (" + constant_to_class_kind(object_schema.kind) + ") " + str(object_schema.oid)) + + if object_schema.superior: + for sup in object_schema.superior: + self._populate_attr_defs(sup) + for attribute_name in object_schema.must_contain: + self.add_from_schema(attribute_name, True) + for attribute_name in object_schema.may_contain: + if attribute_name not in self._attributes: # the attribute could already be defined as "mandatory" in a superclass + self.add_from_schema(attribute_name, False) + else: + error_message = 'object class \'%s\' not defined in schema' % object_name + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectError(error_message) + + def __repr__(self): + if self._object_class: + r = 'OBJ : ' + ', '.join(self._object_class) + linesep + else: + r = 'OBJ : ' + linesep + if self._auxiliary_class: + r += 'AUX : ' + ', '.join(self._auxiliary_class) + linesep + else: + r += 'AUX : ' + linesep + r += 'OID: ' + ', '.join([oid for oid in self._oid_info]) + linesep + r += 'MUST: ' + ', '.join(sorted([attr for attr in self._attributes if self._attributes[attr].mandatory])) + linesep + r += 'MAY : ' + ', '.join(sorted([attr for attr in self._attributes if not self._attributes[attr].mandatory])) + linesep + + return r + + def __str__(self): + return self.__repr__() + + def __getitem__(self, item): + return self.__getattr__(item) + + def __getattr__(self, item): + item = ''.join(item.split()).lower() + if '_attributes' in self.__dict__: + try: + return self._attributes[item] + except KeyError: + error_message = 'key \'%s\' not present' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + else: + error_message = 'internal _attributes property not defined' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + + def __setattr__(self, key, value): + error_message = 'object \'%s\' is read only' % key + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectError(error_message) + + def __iadd__(self, other): + self.add_attribute(other) + return self + + def __isub__(self, other): + if isinstance(other, AttrDef): + self.remove_attribute(other.key) + elif isinstance(other, STRING_TYPES): + self.remove_attribute(other) + + return self + + def __iter__(self): + for attribute in self._attributes: + yield self._attributes[attribute] + + def __len__(self): + return len(self._attributes) + + if str is not bytes: # Python 3 + def __bool__(self): # needed to make the objectDef appears as existing in "if cursor:" even if there are no entries + return True + else: # Python 2 + def __nonzero__(self): + return True + + def __contains__(self, item): + try: + self.__getitem__(item) + except KeyError: + return False + + return True + + def add_from_schema(self, attribute_name, mandatory=False): + attr_def = AttrDef(attribute_name) + attr_def.validate = find_attribute_validator(self._schema, attribute_name, self._custom_validator) + attr_def.mandatory = mandatory # in schema mandatory is specified in the object class, not in the attribute class + if self._schema and self._schema.attribute_types and attribute_name in self._schema.attribute_types: + attr_def.single_value = self._schema.attribute_types[attribute_name].single_value + attr_def.oid_info = self._schema.attribute_types[attribute_name] + self.add_attribute(attr_def) + + def add_attribute(self, definition=None): + """Add an AttrDef to the ObjectDef. Can be called with the += operator. + :param definition: the AttrDef object to add, can also be a string containing the name of attribute to add. Can be a list of both + + """ + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + if isinstance(definition, STRING_TYPES): + self.add_from_schema(definition) + elif isinstance(definition, AttrDef): + if definition.key.lower() not in conf_attributes_excluded_from_object_def: + if definition.key not in self._attributes: + self._attributes[definition.key] = definition + if definition.name and definition.name != definition.key: + self._attributes.set_alias(definition.key, definition.name) + other_names = [name for name in definition.oid_info.name if definition.key.lower() != name.lower()] if definition.oid_info else None + if other_names: + self._attributes.set_alias(definition.key, other_names) + + if not definition.validate: + validator = find_attribute_validator(self._schema, definition.key, self._custom_validator) + self._attributes[definition.key].validate = validator + elif isinstance(definition, SEQUENCE_TYPES): + for element in definition: + self.add_attribute(element) + else: + error_message = 'unable to add element to object definition' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectError(error_message) + + def remove_attribute(self, item): + """Remove an AttrDef from the ObjectDef. Can be called with the -= operator. + :param item: the AttrDef to remove, can also be a string containing the name of attribute to remove + + """ + key = None + if isinstance(item, STRING_TYPES): + key = ''.join(item.split()).lower() + elif isinstance(item, AttrDef): + key = item.key.lower() + + if key: + for attr in self._attributes: + if key == attr.lower(): + del self._attributes[attr] + break + else: + error_message = 'key \'%s\' not present' % key + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + else: + error_message = 'key type must be str or AttrDef not ' + str(type(item)) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPAttributeError(error_message) + + def clear_attributes(self): + """Empty the ObjectDef attribute list + + """ + self.__dict__['object_class'] = None + self.__dict__['auxiliary_class'] = None + self.__dict__['_attributes'] = dict() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11be703025cdf4c918dcb105b01970d21c97035c GIT binary patch literal 137 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CUuOCxxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!xajzbI8dK0Y%qvm`!Vub}c4hfQvNN@-529mu?5 HAZ7pnNhly@ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/connection.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/connection.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..162a3aff6a0a4929b3e28106f460ceb95094ccfe GIT binary patch literal 50389 zcmeIb37j0)c^~-tnES*GfWhEwTm*&$Kmfc!669cJKtcot;LLy^iv(MZ?jE3luI@oq z4+%5@nG&hPmMn;pWr;Fn%8IPZR(vE#(DZx3n9@r=&P`oL?NT!`Q3+ z|G%%Qx~kCwK#sG!zx)ES-&DQ#z5BiIeb@VHq_400+dp3{e)2%V{Go~b>&Ekg__<$A z8&fdGLYOdxq$wwioitX`*a>4LOoFi~Q%)H>ZLGAur%k!d*zLw@*Y`G4?l5+zu{!m= z-ITkG)ny7DrqF51-Nx=QR*$iJjn!-HK4bM6yWd#-#vU-%fUyUSHE8T*##(0VA!7|0 zd)QdR#$Il$<;GrNtQE#yX{?pT9x>L4u~!*um9a;SHEQhD##(LcHO5+F?6t;PYwUH# zT4(I_##(Re4aVAF?2NH8#@=YGjmF+&tWCz=Y^=@3-eRmR#@=eIt;W8|ST`Aao3XYT zd%Ll=8+*)HW5&MOST`H{7GvFF>>bA1VeFm8+G*@v#@c18tlNxzyRmLJ_8rE$18EqK9#g*4*moK0E`{wi<-3i2kFoC2_dZkJXY6~8 zb+5wroAQ0ezTa5)8+*U8_G|2bDL-KB2aWZhvB!-yuCarre8AWf#+oqpq_HM7c9|(p z8T+8I4jTI*V?Cs?L#F(&u@4#Rkg?xjtT$-vuqi)c?8C-7Z0sY(I-;@5O?lebM~!vV z*vE`@Ok-D=@}tI{G1iQ+XN@(hu`5k^&e+F|b==sG8S62P9Wmt-#(vybj~n|5V?Cj< zt4!H4_LIhXQr|~S`6*+cG}cLdUv0`y8#`;PtiG=?-jwH!ecD*3^?idWpD}jHSS5YWnDSX;pEK4uecx!xWn)&J}!ys@4)_M46MW@Ep_SZ^`* z3&wiE*e@FEMPt9!SZ_7<+l=)#W53;4Z#VWkjP(v<|G2S!+}J;1te?=<+-%D4H1@lU z^)6%oq_KX|*zY#hyN!LtSXYew9%H>n;chYImyG>hW4+hd?=#l>jQvx_`YB_--&pTA z_D>t@r;YsqV|~EbA2iknHO~%He%aU`GS-LmeWxk^jIm!a)+;7ayu}oEnBq=T++|J! ziG0`;SD4}^Q`~Hd%S~~$DXule^`^Mp6vs?)jXB+Ite-W7U8ZoWc@dcDRa4k)3VY=F zBj%yPUQ@V@F9?f2XI@Ad>!YU7Zf3`B_Y&PdAdVYLdYy%0aUow_xag%BjwQT~a;Z{u ziwk&cn>k#~pTk4DQ!Fgzi_v4@ciu z^Zn?tshRP)Lr15_V`+naBMwbZ%uF4bnx6C0htXiKSIW=MqO$QLUeC ztY_xv@#)Fz%+UjfroGOYspGQ}y=?sW+|exJCbN@M2gi>eozC=Ab(H`;igJ3N~` zFm>?g%#>vDx@N}@PGzMxgYp=yaaBCu_`$iU8O=7>NWmDOP_GwFJ~aJMcJ7H|9E#bg zM~_cUPfYpmT}O^iJfhWLX7K0_?^nYu%U5lz z&|;*-ks#`7=)pp7xi zKv?5$yo|o)h{2iSqT7^nxOIWc52HiJoGQ_u6RBvB6*aYMIH;$Xv!kGkmH0wKx0WyD zP8SPVe|UifYmO}Vfr)CRQp|Hl9CrZ%(9~Sn9qad29iALNcD!<~Qhl}(6h7rRRmbaN z$^k58ecciP9AB)RDOPHwyzH?f#oC#w54DL&dC`xS*80)M&G0&FQ! zV{Kk<(aq-;irG^aYem-^T5yW8z2~b=)~z|1J#Qd?rkFpMJ?jGF5T|%ONVIb`iSfFz z&<>+n+L>S?bBLAF@oqAGZ8Q!_J1XS}upzZ~t(M*R# z#p{WE&TjnuL0Vp(tS3+Idp+?04w_WCSn*Pr7q2T^MPmu86X(Z5wN$Bn$~Zs9Ja^w( zvlnh%C@t(PRe&1G<(;Pr#l?%aU)XzVxsY49%@6Zcr+6zioWILm_G z$ypTZ4k9p#Rf!CKTau|nf1)qpycu!fxTo+kjGv7A^LXI+T{0I3`Eb^l7mT@_FefUj zFcz2sjKyvli#A5fX!xK>0Zqn0LGfeQ+Rf#pf?^VDDRU`dFuo(0!V$h9Bi}HSvxPJU zwqv^9d0)Aj&z1LO>OGmA8K-DhYsGz;*Ax5eJ@-|r8SUx*vGg?l1)`w1+QBFJ1US%gV0XDh{3jQ@*iu46v58H@n`mv}xPCj4I`!z4T? zKs1Y{wv#D;5iBwukiFA@FL@C)f-~(Va|*f|TzsL|6#C>DTuZ+x49GJ822Ej^JolI) zV1`U#n6H>7@btw#a~8nM-cCPc-Dtarm)$(2vG!@ftW3( zuvN0J3IGs!6M3~4!C9brc-?LaV*;~UUT-#qTjUi@#Rvlc|L-t`oswm(yejvCVL@vZ z0HLxmD0aPMR7M6c=)&!$aEFXT#uV-}g}dY#UAWs6?vdwBQclDD)8kn)-k#JSgqlDp|%&;ehnzCYjI)Q=rnb0HF1ouiQ@Q*ZeNmt@xo3)*+oT*2pEizsl!K$6m9f;!(L<9vP|hik z)x}&TVTs#DPR1#dT0UI4tWxq)aw zHA~79DKc0WgZXA;=GjuY%+-Zq}Wb#;LD7;$1Z$8stTYX-6MVX zsqDz8NF{^CL<$|-@Or(0P;jy%6A@hSMWrLxZ?UWwV1lCKcPKZzVrUDc`i3nv| zq*=|?Hemrt&O_Elo=t`&^3rHo*x2ThBhXlrJS(DoRtAE23gZpTA7X8v4^fODP=d`| zSXTj2+294{#Vy)v96N`%TtV2rH$Xw8=Xch5N znkxZU2vHHZ+Or{Z|r$D5q z5QAkZ)mp|~%;$@)JHH4j0c+_XRx2=IAe(csDQk;P#g7L-JWmGPyhJtE7isdv>;>kBuXkZ&*z}+QYhw6dTFZwEHB*E!BhK_$Zt1y2WXxrZYl{E0^YrwNlu^ z;Pu9e4WQ+?&@L$H!F>*74^9@#JwzAiFJh$V)2^FaC`Ec5%|Urav@{ST5RNJi&E`Q_ zqSSNH3WSI?Adi5JffItY=|F}iRGb~Dr&U?a(vAiU%EZcLj9+fJ@s}#v&)r!bAZE9_%*3N9s6Q%|L2ooT#fmA5X@CBF&)H?ll0KElb zxDLtLMVStZ=r)%mL$=3UYB#;ks{#!X(yOM{D-eCAvcNR=S4^!xhE?~0m1|=3IYU$L7Tvpx0`b)`Nc$SwN$jmR5nUHM3IPpB~e=&#AB$m z8*9uZj28N~&RoK1;bFbG)MuQpCTbfvVQisR0nvdzKyIMTfY3l6Hk(U2h+E8Qg#r7o zNsx8u1NeP?0JEXyJRzC7s~C=8{Mfv$vT`UB-EDGB(<`o7x@BhG&X`LX zbTHLe;d@iMbPx}KMC||}{N(~!k1^-a`eUg}Yh@;6*=Hd}=`g3Y>60wo2YWt+=PYq^V6&Bw9Pjnw`(5Y7hAmQV3Z6q=zNxk5aWm0{I5Y^C;|r ztga17$p+*hf!vZtfh_zHhG!o!XAkoM{Ym)mNBnmJO`8g&a5{9zpgE@{XP2oR75Vvz zbnRFq%cG`JmZAVKBLElDwb?kpBLTpi0KA;89ghRt8~{8f0H06SPQ(Ga0)WQ_;5+Hs z6LEm=^Ytv+U0Q}{8i>Z7#fP7jYA8M;*V~~|g0l*st z;7nUB7YC54*_cxT@Z)W@d>jBcOSg6uwf^I_C2&>~YDGUEHD?PfF)JZoi}ETVU+3jj zLcX4sR|)xgMqVZ4Yst7<+Btk@iC+@j3g@^&oKx+!GNYWCb~f!C<-~-u83{v-L}gHp z10?h@fl(*0d>)-q#Yq3Ox7rt!Wal1+NdiY$f;QWbWJQ?ys*4GJt-Hh#|-vK_NJIP&6=}@!G*oK>K8M6fc~~LHJl73^Mwp z^u_u*QLd0ZCBN2?2<`K0x<<0If2`sR;6!zBpc<&yLU9r_V9+Qmn>c(378x|c7@wPZ z=n(7~x*;H~Wg#P|I?e)fo@Y>H@D$7F3)+>X1jb8)=yANxKqBVQc+cyPciQPmLHI3z{w-4D;X+j8wVfh!>vfTe5DLp{&zC{R6r6P| zvP)=HGH}jjzW2v@e{Zmv*>_-Ch$&Du)@xS{jn`8vyCC(Uzl2^<^OP#t1*dwNl&IGg z@{(RZjcIC7tP{Le#5;sq7&@>DBmtxEY?U|MNSE@ns0lz!laeTm22k-rF~3*?0U3gO zX>yZZSI9~EkK}^9?gppf^~G2quU}rtSwM4(Rn{xjvSilW6XEf_!Di;q>z3hks8)7v zmw{3<39l3CI*~1Sz4Kfwg(4XM#~W}|kDMj@Rb8xkgGGCxb}<{W08sp1&8>JnQjc;c z!HX~j)?wzpEwZwW(B3;) z@+wXGbBaSt3k$`<*haRfJny{5Oz&mzJ_a9V@O}nAg}@qU5`H>A&7^OOE3wn(xgROBmW3c<5UW$TH0=3ib!=xg%Y~B7vV8Y%5SUDFqBqfvUl)EW z69dUEJar`p@z##tszfhhf|M0Zi~PsD_)qfyHk#IWZqBtLG0+M!IUqImC3;h9(kyoX zzhT7kX$}5%K~21hb#)9Rh7i~4r_fahTw%~Oh`g&xT9ZO7)bvR!{byiR9j9_)zemEaQjPn5oY@hQogEWG%Hs?3-2OAv7 ze$f>;tFMMt749gj*MAl3xaK9X0*8p2z4!}KG<}N+bef#6!RQAwxhGMNobi4CoeKZSDTK@%b^32;$0xtoU8`0m+32u(lqxn)Dn3(^)o=;yx@FwoeeRwd5 z_1K$(f)xi6!-5ZolNsVn;B(@-L14(>ox3=AuCI#Xz36co+r6O;S-P=%SNT?5G-pyA zmf&{6X69N_`y)Q3xR0?*xoZ>$rj2`;JT@3)0<;33H^XD|tVU}T9)nl*2IOlAzyl2N&Ond2RsIu$rWH6v5;bC9zq`*{2;SNkJnSpv= zKyu4!)9HPMu#E%~MY3k<10Z{KSu1&89}07atEW!-A6%W#|IW`yQBrNdbjXoW@0o^4 zm#^fl4?+6JZs+3+Xp`mq z9D|QC_#^{1#p^heb4gE2BfPF`R`i0|EQoR;NU~WWe7y8o80rN}JmEGUMIBj^YT4}1 za*3}*!6vyz7V*Z!Ml9=%Sk4VV);&?n_DHD_|J4y8S?qZAHs$ zB0c0n`a%G=vL&1d*9rH%0B)ouoXFk@H<0qXzp5pih~^1*m%yQyqoyYE;?-4YqIC{Y1F$_`3);Q5WxH1gCI5$@ zWJsnl-m8t1NVjYYY!J0A8`B&Sv>xgK*<+7!pgmfi~ zmhGS((qVS~WxmlJnLsqg=-`=2YhYv)n2Rwjd|~3qj=)fgNxrCz30oysM55?tjl}q1 zO{_KHg7Zp5ca72_(zmc7fp*&U!Q!GcDUA0_Lc17(jlp1#kq!O08v;h+2)Y5rJ!0-J zwlRc?yb@p#08#Uh`@J-cXS_Bsd*I-OVmRgwUziv3KpKJZ{OdQZS-vINnyfJhilRko z#+DH#e2FGf@D?WWg^8Q}oPiNR2oOXN2ooqJhC;azDvTjmANn7f9Nb?Y*pZ2f+U{q% zEEo~b-Cu|4Ql6oyb+vko)WXewjs)zD3^U>c;)`6|%m;>_!b2?teWo zHnv`c%wNEM^4itVXi1@u^Aey`&=Z&Ocx_@TbRF4_2x%zb@zRt+shCG3MwIn9{|f_= z=1}e;5}vV?5c^dNwg5g&pWWP6MM_WE&m`G0pL_Ts48u0D^Uyw~e`a(8=&xQ_#NLeHTD{=lrPV|sA`h|ezxejggy8+yF zXruocz+Hzn+8od**P)HTv@1<^9oonZ;F@V83_uUH_mmg>`-D$wh9uCZCELAZa+Cl8 z6$EmKnovFsno*EK{y5@&NG|m(_fv=QmX=YiY!8Uou;g?=Q?w>+LXv7n0N0w92}!Cs zfm6P3z&QCNZU>N3TNRzwkg$47Q0i#Q6F(rVoKFXEt6Rc_l+^D8aBEt^1(cMVN^xwU zhF3zZ>)M1zNLcL&;MTP)J|wK32;kPYgaaL-WXYQYxD74gLgMRF0*6t{n3|~ZL4P$7 zY9SHzZGqJZ7&Xoxr3yD+Jpmypl?sTKO#vyjB8@vJI%82nFeIh!kQ^Z5H@9qaNI;$R zOXfg>dRj>HHpz&})?$kxB%rPYZP^+SP(RnYEov74lIx2>j+-RMdgJ_V>m0a5q9gvF zf*ji<#|GoHwO!R;+-V7kv|Ik)Aksi<1ccfB+n(Efd0YMF`vOHqW@`bI3hv71!QhK| zZg^u*%ue_J4@k$|+JcVT{@iYm4?8l??U6s*p4)pFG{aW8OWdsY3x5I! z+<#ws(D@FkfPe}0{7+)=|2M>-^M7(emNygcB;D)7O*AYc$1)Ad(fK!=QIU&@t`MlJ zSz*{rJKju?R~b-A=zN#K#~6rU?N|BKq#6v#N9W%%Rg{D`Og%ck&paX|mf(55{sw|? zk#wBILzHy9BSt(9B&;OK$z6VIgM8f8Og`>tFqzn#<=G?Zq<88^mUo&IWe!;>PKi z?YY>k=5P^<3T9mNIdm|i9tp(Qlb7xGDcb=_F4+gL7${H8a07KTtHnid+O|U~8{9q< zLtS6ax+^Sg8btjU(MK3R(;S!bPCD^fq8*QoEdwpes7F?PQaAvmfiDSo6|+^*V54?;H+d%zJ3cB-`E^ z#QAKODzuSOdmdl-ZMAEb=E40gDr&TUD3u0$Hc+XuD$D3t5UNyiow4g29w& zVXo%sW)z-l5cdX(Kmg1}P1%yu_5MY1i@+U51=(1yuEC#2b764?0}Uw6MD6ejVwyE> zn;G|I2H#*Hy0X^W3F-$Jz7(NH80JWd9svrmwW1QED!Us$8ZFe9N5(VEl;;BGKd$fP z_)XyF(t?A1Hs;E!kugQTpMn`c+FZscrD2y1`&}7k7v{Dy($I3j6#}1O1b~4%0gY7} zT7O>ux1gg=$i;uyQTO@^Z0NmIlijHU4ILE7RG7?u%+z2JiLnOm{0PSy&lqm(50w4_ zJFxiXFw(ASi5Q_J8>yUt?XbO zn9l-7ccZ=>!sh zYkK`BsAj-Vz=R&Lc!n}wcTGX^(j;Gt!m8I8*x5sHq7}c~=2tA*Pg*fl5^ZW(fSi6K z#D^fb3cCoup5ffaxLd%`bA z1_qIpbE54)!$$>)+?{OH^ogJ*v4M>@d~>p8!`T9`rAxIvne^M<_xIBFUy_A@wy%-4 z|ABM`3uv8OnfUogSDc_?+1c@~yhpM@ryz@k1NB{ri4PP;PgPe~h#Vr^Ou)AOrj!fD zR9%M1s^ZSBWn?~O=xIx$OBOBNC@uYr%*1l+Sb2c%Vt?5SJ5D z!{u~;${#~nGV!iFDaCDxbmh}6=A2#8TMW^z{EU>_qASYChh5o6Zx@*7*f{*&jb-NY zz_8wg9eX70zjTH#GLaY|oOLuYQV6j4B2#<{SQ~yzff(Cx+ zs3FvYqkO^)q=FR2=}h8Ga$c51m|^I{&A@6VaavB%>@5*Q`NaTHsuHm`L}^MCYVF%; zxPikhDW>uCtg$Ay6-3VgS_FZf5QiGGV&aOc#kj3TS`Vs-hyuzta+mA0Oro z<=?JVml47u=v7P6_#&5QP{Yen|Y>` z6I=c1x%!A2oX}WH8W5Oh9dy2qBQr$ ztl8^fZ8Pe%uf8E-GUofvkQN73)NhK$E?sJUU8Eqn!QWJjpA~GTq=wo;-?YqkeHNpg zUQawFBBWT^be3A;8?{7O57 zj0OMbU-kf+GG3dzP%hO3uu?1A+Tf>|lIGYuUm>^{+U{ZGFk}Q67+RNySit!#VSXC{ zjCOyM&)hIxXRuS%VwbkNULvby#i?N7X7-W*rd-JMs6k&hNM3y+zd|EuHNhPO55xH0 z#5Vj!6C0B>rPi36BQZhTP;!ND08NAF-9BU_HZYG)-U`B-M&2|NNzZkl2#wgANir6k>;y^?`{HXYS%i=cz^HKmHxUPl)oDfU9}ZE=iQ@xgZ1&*wZUd zfdIxCvft-!$b-VFSNR~A0V~~&)0SsXi9iU!xAOFXDK6*`Xb^>20-NMtdHqQtU;Qh-@e{v_%aIFx*^9RAbQ_zAiYW$DEomeHl2gTSn zpSUO#5={xw>JB~4&c7{@t_=$(m<1z9b)FudjdmOsnz=87@DjF!0ORH$i)iTdlaUW-~#Z z3o5{l4_KA3F6LGI@$lmSoeT^T=# zj=bo!hRc#Pl8YO6^hkuY4N@ZmKVx(=mf3#$uG@THV-dnJI12u51Ym=R+n_u3`1BI{ zboyX@t)CdsMsZ@RPp!@aa%+>E{LRJ1&i*;r28$5L!BW!OmU20XyT)3f#Wfk;sFnM> z3E!X&gb4UJ;=DH5*=jlb3V|MHAQXU{@p6*-mNBw}`v zeLf|N)ffJ?8Tb7>$#4Z8>}my!BIL7rndQ@b(0CkjjK`J(bN?kiYdqZqe2w7bC*3V^f`LIf00Pp}_DvPU13TRYfS zKoS6e1VOIFutROwbJ*+}r|3HPY!@lbk%5KA^=YRJc~o zUrjtw;2pI?Msxnv#0f}_IKLn-fb@XJfV$-LhqDZLm+%M2@#RHexYgyvS+y?30H`QQ z27v51jJ=f`MocES=KyI&PxA7RG*D;dccp=t6^!jhdYV9k(9&RyVaCyH2!%kPfE>YO z$e>@wjRz&dw#bAJ2NS+01=kdpmq#l2VTvPw3LvEtI)p`6zAoj$OU5!79;uw^sZ{MI zI=0aHIEUGLDutUB?8|Z%iQK);%OX-jz7-HaY~#x1@N4YqX!=T(F6dlnSAUqg06z!A zSPVzaWo!-@+pzW#5o17zq|JnN4AOK2&i`U6fKmzNF9uMU$SBl_#x7rzW6>9 z+nuq#+kBjM5lKTPB*udF5L5*V#X`Kkc$4|Hg~rzyAlN8J`$T_XtxNGeprbd^s0u_X zwG3{xgNLNf4x@(d1l}~Yi#mc~V=~OhyWc`?DtmhhFQtY6WhX8!2BU!zs|z_?hNNzn z=XuCZ`_AF$YygZp9J6CEI9idK$i)Z#SV1Ik>||IgxP~6fLnc}r1%#Ppj%fRvx&MB3 zy2m>}4gYR|PrUH<&m!C_U=VT72gGt%Oh#Q+hC(8C-j{eZPmm2d1=s2$^AyyK5?OO& zhD7)gOi-YI_vvy};5&Hb<)^SAx@>7JuGi$*5WN&@|)KRv(9}hteZ+&AyXQv*YIDDKAI1bJn zJ(9(TFeVAI^)8Ff1p?sKrJ#nwlIQ5Z|ddZJWw+Iwt%$wKci*Dd!<5w{F^^JbZ z0&-FckI|G?pLQ>xDQ{JwRhUmVKxRp?m6v8S8l||CSYL2MB0`tHLL1;MLnddY=uSb7 zda=Hvxon^{=i(AlF?f~;a?cd!>${utHjF-`Yatp4B%^huk^OAphKte2a^ZSxObv#b zh-Ho_%%$uO z3*cb_e3gOFa|jMVYnucfzEQ72h)j;(s^Gn30W846)IZ8@W~O_ z+GJ53GQe&kY_1DK6zmWFJ3 z2hOZZwTo7-A0y&yp7HwbYZ z#c;iewcu{LQV<3v*Ms+gY#`a5xJ{psldkon|E)qfYosKK57$e1EO}*e4@8QCD60=; zuf%WUYOYCJnTLK|{&gcjL6=DMNpne zn0Cg42m=W$sXjG_KUC50@L49P=>2CDw1Z!d1MN-T;8*#8JHv<}E!qj*0GcUrRe%0HYFHz*B`-sqiiU}SxdW{`S`J1F`~^sB8B(+&;4jpy4_bTl z5EFoQDu2-#@E2>O^PL6^6B)`kCczF}hOjoQ;7@}Jz+Z^!U-*l6N>^bR-rz6ZC9D&o zaGRmFUWop8CBa&-Z!1_PviCZ_6^DYV-FG^n3AEY?L3|!V=Rvz0wg&oL@NL@B#)|F` z{sGJZh61KhzN{%DFCuGd6SklYY{6)KXGrseJONH_`KDBZcnD$so9H4r2ViZM!g1iF z88k^z+7P!Gp@?pZP(*&4T9HIfJMz^*IpZdJ#{b4wqwS&8c)EUDp|S+Qvve+}gAFAa zcw;0>eYK#~Og?m4ngaz2${vQCPAAI}LS|D?<25K57%Ry<1feL*>o@heIfYK^bHQ z=b0b`fe;^C`3jobSMT)@TtW_obdm54Gvf*dBI^@BH!JxXU$0(=Ke9I0>iFF{7c^H zpML{9Eg1)|Mm$63@GPeulwo@6?M>V)r{1uhc2UOyes$q-H-s7o@teTU{ne%AgSg_K zj+}$y`bPwZ^3f!S5pV**oq#V=kkf})gNGF)O~5>m5-G-%7`nyyfatcOXQIfs7!OPg z<1XN(n2e{(T@X_0Q}0hW4nA$!SvmNw+p_bW$rBe~ zm&9p!pSg^IK+F4t(D}tA9w-DA`54c|%W#2$Mb>BV0QsWdMx|_CO!^W>ZR09w7D@_7AsXbC7#HI& zM6JVS*y=~YAfdF|^9Lg7hYAgwqFg>F}P+iZ8OFk5cCpWUC0R?iCya)x- z5KL~W|7l2Fj28+S9MO(wfBp*GP84(Zx&H%1`O>ES>A70PUgBa?9UeZam$Oe5a{K=`R)n%Z5idRc3R>T!t(LK9ELZL` z8$xADU7Ec0t_Y-dn$h28H$WptNZ<9Gs%wzF-B_vt$-6^IUd?ema<{%Y2G^R9Rhqa* z>S#d^ZxAv!wwU51?zW{#TnxN_zb-Cdb9zWSHptmtzKTpNO$6k0FrU!9Z{*W!3`iPV z{n15Lbk!eLgI*RY`5r zIq!?JlG{RY)}sLdpIqq^@Tdb96;*TvC4YZ>7v{N2_^%zmUi>ETbCW;=Kr=Y&K|5Uk zh6q2|0Gd1`zmZeb_=pGP3^hLJ&KMB_HU7&gkMY&`pn@Qp`eomk#W!^qH8|X`hCd^0ua0f$U6a!5JMn3|plF$&TV#00dx%R^%5U;UChu>510sPXFv>v5XArj)Obiyvv#Ot!3Kbm zCo%Mr@Fa-p1u?YJj{+r6VyIv4Q1Kqr*W*w=F{H7nXu3MP@P|`p^WRB3Amal?2G+|L z#{j_#9~LwHSyrD4Nrg%IRJRZ%s!)LL3d*;6sucZiQB6*(nYU6)2O8H010|4t-oE8Y zx_8NwbjeJ0d|5m&M&}tpYxAA_E}fx0ee3Ym4cZL(3x7U1WY2O z0YH0Tn3KjG@*Um!;%_Y|C0u%of)uF*1)&so#&=~K%Rg~r`Pl@BLfXuQzodhm$&>#+ z;cEm2jk8H4$6~_kKSQsuDM?{Hn0&|qJ}JrqSi(q~iPaz}C%cXBG%NEfnIQvUeq17g z`3MM4e1iv6r^G0NhFv3IG?H?6_!&k*tUtpd8)z{e%0oxS1C@_Lrotgc2t!~X-Y-zd zE?5_AGkmzhxgR9-5Ujuq32u789m9t*I`oAkESms|gAwt(75qy{h%A~L^O2<*(=<7d z`Qu>3iP3KEJAW#1;VmqC@?>4){isOXxoSmjdkU}DYa)j2t4WGGnnq`jNCjGqPP{?q zznVOO7BpIP0!j#;-Fo<{>p)EWGa`)Pqw_c3E&ZhY*JY2na=ltO(k06U7^&aNo$o`GUwG5C!1{46!r{ zQVfp3I$y-q>wGp2c3&KZ!?~d=$>i<=5gMM) zNATsg`HKy%NqpYONgcJKQV$T<7B@U6;)N2vJ6PNUse@*LkHALsUPM2s@$?5srxGf2 zknnQYrk#EwPv`9s8U2$Yk=O%YiIhz2)x2YoY#}Uj?#^sKaul8^p2&g^LOWna?7!=A ziKx9{)XWsVBswvLxZA?GL(>y8Q%CTn5_~+s!;jo_ zlPQgU`f^FxM?flR4}U~bX~|4CNGh!jmPcT|6%|R<*H-xbIZih3^abDW^vS9l;kkEX zG$L+>2JKv#@+}aMT5NqdVCVH+?(ju8^^Jc2u0hH5>F_oYb78*g6LZa=*COWngUXhq z=b9%ZPS3SAiTRO;Iw9LKWJXVMa9?B4N{uDFxhSv5<2fXooPGwh=Y|(?1SFxFIrmA% zHBpLN7}tt(?`v@GR)@b(B8+>tMv380$Ua-`8fy*e--gM`b#z_rI`+47m%RfmGCj?z zt~im|P;==;68(%vpE!t*Da1gU-USXk;I{|CWAF3dh7+;u8VpZFiCu_}ryvrA| z*mwSjEcS~(3X4r{Ttwggg%Rb(QG{~ipgCc2-8g8$jeoQSH~t-;<&JUVzZG!fqL;f4 zH_mFnR)h4Co7@d{c}2hs!)yX3Um}9#LGcTRN>Yb6!73ZIQiALNg|HOpHX_{mCKY=7$csgzEd4xsVD~p&zhg;;{aX3z z`<)_uQsJ9c)U33&_Pl2P8{_%6G|ITfVbP2IIXNAi6?;{-8_jv$<6^7@^tDb59#5>X z#euO^B)yID!ZDAZ8UJlEfGJ=gl>r>&Qxj&twhW*vg5GiMPiHY(s95-5L%E3C%++#% zuf3Jxvsrf$OQr-X$s3RsbSaud-j|5YdFBMy{)mMszm!l66hg5KqMS!|WEMO}<`^QZvd3+4)PLa7|N$Q3olX)=%`f~OMZ zOganvC2U#@W%bt|2$9YBDJXONI|1P;2SpkAvb~M#gScFfEfvCCfkD;yf${0dqb+fg zewDzHPQ6LhB05ybn=&m5Y};MlbE?nCoSa6|!>hZa$X~=Px8#KApv9#C%U;V0z?}3;3Rrn$ii7n@pfRv1Y6f znxTxGzY&o~xH=rIF&7m+!9F`TJ~Nk@J3QNBOX0(DYa1?%8jzvuAf-PW39VP|)z{tS z_>m*!HB6|N!biB^&=D)Eak>4IeElecR~USm!8aLvk->ju@HY(P{PC~0f1MF6j9evS zABZ=XMznO>I|#ZEJUtGT0qDwk#L#e6{lRp@OG~>boA9YlHDHZWg~I3Xle*!e#4_ivJncFpjKpud!je$Q2?DX=H%yAJ(Saq32QY9pSViC2|pw zM8t+@Gmkeq+7_%m97duLr`jjB#AO8ROGo2BbcmM;P3Kz*>oKKi8`G9L+8^U>E$)o+>(3 z7uQt)aRdHe|EB&qlb zU;hA`07VSsEJ<<4DxYB`MT9v{iz*U}DWG&-Fe%@sfuK9y(-8>_NFJ^dHLUpOLb5=z zqUsVKLkSK%3sONSBCbWyOCq@8S`>AWt8D@<6YA(GEPuJ(q885-ozR{d1z{tANBUrr zO0Rx13iTgo5ERC~;8qYy1s(^t0mEv*{cMsZ)!JZ`eRYGYvaHeIm>b6%Y4ESeNMGIH zosr@AS3&8}b%9t?+DfQ6ebcKpa)W=lP;Sxo!jczwUb~4rv2nghf%P0c(}zfEe>2&J83*P))PVHEY#}JMItN4*(EXJ!%n}i79o89Z`LG3I^dS_ zrSiq>LN0#};)mw1Z#u67@(nx*p2C9(PXajy;BIP7Vttx4@t|lGR)H?*g-`8Xp_79+ zrgp$-GyT-jdan^bg6pc?OPn2{^SwO!A^*|{d49;*L3>N0KK!3B?mOiS*J}DEMIj;uc@1&aa$cHdwR)pj_rEwg z^C<<`jylC>O7QL3_;mO{Gz#YS)?gSx1O~5IO}5cO?7p4LXgw-5_|m$Xcj`SYe!-m! zO72@Fq8~8CHzls}t{BrTQL88GfpRWRAzZQlh0Ga7nO=tU>IV)^*garI5aM(OY4{&G zWn2&VA2b1yASFrB%m?!bfdtQ55Q-_Y@FXXc>jK|`#UjuoJizMb>kP4cFsq_#LE`NeWgx_@R9KPnSx55=x9G;cVwUDX>z1Mgj!SAZKvUqL=<5 zJIj^CBMNI!7FGMS)o_gepo?GBXj9Z^cMEhZwwp0p`*;zlQ+c8j9tz*Y>Of#}m#uM#q=km`c$--zx-H z5tmFiT)~KEfIDxu`pfu)20UoesV@Bt?8Rg{e}bZ{ZhpiAcl|3x*XogHZLQa?-|T2w zXZ(7&o+G?12IPgnDf*$GM0iLN}H~ zLv+HB!q5F=W9fYmGC1MXV@nTWWvnlRy7WGrz|zB#!OEa&4<=X%bKeDz5R)f=$Nac4 z@4$LWLI$R5>R~Qb!gonR8Zs=9hm{DGi!~e|E zVeYHIWm8&;K~f_cy8tp|mh_(^C81^Q#xDt;vmzyRMN2}GUs5;PB;6T>e1L=zR`~gc z%?V;(y<>R02=+z4mw-$kGDc>A+#ahNrfJxcAoE1Q$QWG6LJ}^Q@oTf~w4>?`Xz{o4 z?mV^y4XuQ0ls$nx`LgUOXj8?Kn*PROTV&<5*Ad_--pzHo8PLizkDvS_C6vbRHvC*3 zwAgVcw-JMIUJQmGiVFt_Ar=9L;*TZHqv^O^g)1pE;Sa8h$aQNkb*^|3-+GZ9CG6Jo zDEjrT`%V|(C1}Cf{|&BG*4=LEyOvmqXWeQgVn-8XmD>KU?MG+Wp|Jh*qn)bvJGp1~ zHLg#2e2-i*h;_}`ht6KrHRoQ$e!I~r=RUl9DU{>&7Ax)|{GAAWIp=i=j>7P`UOO}n zm>#cRzpv7KJ9V*!W2}q_e4re|?zI&b?FAQKsR2kF!#Q`bSf3iZpY>3-=RAl2 zPJ@Ae6_*W3pWr*BF|1Z!sUi+V^b@C67i-GOl@$8tw0h)Sd!%=d`~~zp+Z980g!~*w z`%Wa8t^nDAZHGAr&evo=5MF!o=H&A5?+TD}-O1Y!4kNB_X#~i!LnQ_3Fm#VNfu9SU z6CAtGD(MAGaw&e)?jcIS62s1*;0H%AZV|{a3W)^p0-lwd7fuh%E>1}y#(@8bO_3Sf z3J8T*Fh!h#!hkt|5)&t4r(Zq!>@D?;Jc)R?1t^@i8R2!N7#?np%n_%@IfMW+ClbBJ zS+@nfQkh+RqP=c8<>WYW-oX3`=2!iZ*ADLopr)Eizvcc`6bRu48H;FoY6|azDaOAj+>A~E*;D43`M!0_{2_k9M1osbR-cTNVsC>eg zyy1C->Km9dQ~ryaD@x`3wzLCSAJZ>Q5sZ$!Ds-mJj7Wlg_a>n2f)8F`ouEEnmIE<~ zft(1-O$op|rP(m09>M^GFJePeTOm$AAV|*zKq~?CWbgtY7)D2dFkI&(RXjx|PE;Pk zXM5l>5QgucP4E*ciTbukmp+o34%dU45lHVLpvDRy<|P2kRTd%wZ1S zy?s6p_4E8kPONXD3r`WgxbFyZH1s4Dtv9)}%|mzrdW%?;zSs z6q|ON-23}0Zm``*=Xc2qJWD50F ztv?dy+=J?e+tIyFz!;Ivu1VCR4lDdZ@+kt~A2Ih3e$w7sL2hV!uWW!q274xH$_Zlw zOQ#H6YT!FH;-nQ9A&wA(PoA6-t_TPloDG&MS)QGO-Vp^;4v>8>h(d@L9q_+;6u=OO zx(G4E-sgAXYi)>tln}WPcA6KF33vqLFo@y{_Yi*ahfd1i0Fqpj*Q7ygNk;V)f1 zhUdu=fShk0!wb)|Ws@iG5=(mwD9VSN^&Iff#}a%2;RgKZGo`?g@biFf;Q9(`K6d_N zI3GbJBVI;cu8$1Ry2W=bv5X&B!ZX(ZC}vCoFc>}d$~(#cu04M~al$`kQTpuIz_jW( zl3v%*Q)i3$+GKIwYoEbIG;o*=idwF)k}k}1hwvZ&lDwV8&m{u|ku0lBm>$^x39-q= zLSF~S=6$>Yaa+02kq=*Mjqc0HR*8_t{#9(j9$xws9LnKq@8Wt+KT5)u)YpcTn7F8H zSgjE6jV)Jn_bxy>Gi=i=0xuRE<^}Xiz|(_s7WHgZd_0P{)trxq(QtmDZDoqr zc`x8*xgJJ>hTDldKeIqI~>%=K!;4C1CfBK*?i|=Cf7cIe z>|NV?fA7iwdLVp~^jjqC9auNiA^jQq2ad)5ra3M=oxCLUlw>ZvuG$$M?4WiWEHS*# zFIMt3d{fiai~0{SpKQx6X6|M{gyQrv=wr~&fM=afmrNXwJzW~h`Lu!og*bX4U=^Q6 z8LVcohQV3}vZ6>~Lzajj!(bzWO$;_O*ur2dgPRy^W3ZjU7=xP`+`?c71EFk$p1BpT zUI(@;7+Y7}XYM7$Z4CY~gWC~U9sHaq2jdP#y~cn%9`5J|Hp;tvLo&5}yPJu9k;Fp5 zxre#-F`>VaKsr%15BD{d=exO5KVSQqIM~Rhwy%1*_Ccl%HPQl;7iSy^&Vi#hMYl7b-+TA%_cUaa)<~EpO7KDndX3tV!X2U~ zZ&s1B#rPCcS=8y)a6Icm86RsBy*d1s24D7-&j3xc5z88Jx%uKOKM!=2@vCC-GpHT( zdG1uX=p1A6P?&62^XJB;yhoX^B1{l-t}{-x0=c_06R*oD;xn%-Y?krM!#r3>VLfy4 z;wT9{<^XlV1Dpm*LjLbCmB4=Aj{y53~~%kF~~FE$>5XI$+BXgk6%L@Br!oltfyJ z5BWaj`@Zkkj_ufv?bvRTCTWt!ZjvT$5+rGoCY`Bg+L?ByooO@ewBP>&4_wLeRLe|A zyW&g98$pFF4aVn5OE$@tlc{SDZPE82+^Q4-cis*Z9#a_T5q zM?O_gs)2I#js$tH4|DcMX;3ng2~X{BTrpnNXZk)SwYDa7-;QIj2za6mm|bz(vY?Ya^gN(bNKF-Vs)w!z zI*rr`f}Y@^=L4NiYKEXQJoEyfGfB-7be4yH0qAT}a|E5^p%((3OKP5=^E~t-pz}#B z5OjfuZUDNF)FMF_d8i-gVp2;4UE-k|fp(BuD(F%V4FFw6YPq1xJv0dPL{cjRUE!f2 zpesq8BysKrbY9k)RiOXbk8EQhq`G9vTO_kyJp?fQKf421$hk4S8rE&@NJ& z1l{DJTYzpR6&5t?p<97oOzILrFY(ZAK)Xrx2-@SJ+kr+%MFov|XcA~IsY?aD)I%== z8Y2}KH146715J?X6SU7mcL3c&YOA1IJ@g8o+emE}bi0S9fF?;@Cg^1zx)bQ-q;?3p z!$Z?RuOO8YH07bYfbJxf7Bual8KApJWdzN5r~;};X+gDzYM}k31_T}O(0-tUq_To$ zJrv0eq|YVYNE$)XM0!2xX3_|acG4G+ZXu0;K!0)}={C{`1N0&rNKYe;%11A;k@OVO zsB-ipLDJ|UP|?##cacWFfa;w|dNXPC2B_58q%S6oJ^)oYmvlF2#5O7r?LR^q?Gn{? zGU;B@r;tWvokluFdOm4X(K6Br(kGHe#h|5aA-$F~ssp{mHqvP6sDw_^Nz!O>D0;M| z%SkUJjRNl=eFf>0NTZlnlio>s5or|e64JX!uON*gT}fJzM!Q5oo=&=-^kUKjltqU; zh_V|ZwOh(=x7W93f#yg#f;yzL(zgx)&66q!S|B|n=x(6Hr1l89$3t^KT~b9siyrC# zEs+`#bi_mRK=+c`C+I##b%74yt~rc^{iH@EVbnW(5704ER|JnP|y!O^Z}rMLF(&* ze%(VK1o{n9-xTzl9{Lc_za;f7LBHjp4+H%+sqYB-9S?m3=wFfguAtxb&_{uOkJR@C z{l14j2K28<{XozkkbX>Z{5a5$NPR5m#~%6w(7z$|LqUJYs6La1o|G2$6w-b~>c^7y z<0I3aM%v$!`iZ3d#Jk!vKz~Z=6G1=m&}V`E9jTuQ`ZEuG4(QKG{X)=Rc+1K_d z9vP_9SFSJW;ZJ?Me|mXNEEMnSPNbr}p_o4rjz;3CP%IXWm1k8GdSlTIz3f!IVFdh=n)yB|@ph_TEr=ZuNjj6lVoCk0+NG zR#W2scz0@JI1)@jCkks5@ObUQfoP;F91KMgVSjfxv3)$lUU`Hg{$8Bb8w>lv+2cSdN4aeOc&)fb8ckcHaWUQ~Ez2T~C?h5W(oUe*>@DZ2xGy{UL8(1&{8ZWN9eNdbQ( z5bDO&yc0q!I)EDJ!WE3rJGzQ%Euofgq4MMh{Rw}0c~wNE*iwORe>|S*i3X+2HitKc zIU8Qniue)2n+%Cdt7nHJ@xHFEa3G9~ru=~b0w)yUdGu`j;8R_gw)E>uIR2faeL7Y!?j2ro~s z9%;0=+SQrR-`ySEisloIpoO8mhWuT%3-(2}hP%7D2olj0x|yzMtf$=Wm0)6XC{{aE zgvLVMQGal}sd(jxG7iPKi%NB&(Hn8XT}d<+PD<-Q7)8QJ^qO|{lJRI?3SI+t6uOX-o(Gxx7ulT+#8byb@wxO$EDh>EL+N8PhGK)h3mvS z+sZSzSfaz)O>?otba5nCie#Ea4N(jJZ@^ZMt#}X20iqJo?iOVJ%fezHkP9q(tmz^d$01!zy1|W7?=m0?Mv{HU<^}-;p zT$Fbz7i>l*e38yJ_k4&ePpuVus+8W9)8)qE2(nggMosH|sN5!3GFYCZbTQ**B^1ha zDqn7Pbg`Ho(B+2G=&&xg;JD#JzNkA}%JrFC(Y*+lcQ>%XOdz=%Vak)egHn8s8)U2= z3UGgKO{Frqbg`I9RpMtopL8M2I&8(+Fyve8o8g=6YpwmZ*Uj~fEjUJXtgfoB)e6@R zM^XS=kuS~VN|eG5$`w0sQLfm5i*m&dT$C$z;G$fygJ|FgK;bnVD|aqmT=LY}Ty7}p zT>mkT>hg{nZznD*;>MNDXG^IRmsb&!q{#7jUdI+5JD-(PGTfH=hyUlyO8C8r9SBDY z8ItS{)sefDN|I6RBOvl<3zcIU$UR#QZZN<`axW3E(Et&*I|Xbqz-Dqs1Z*}y#QZG+ zwp77^X1bZU^$oRhYZ`BrL^lxyAqfBCoehz(`i@l{wM=o%ahsZft#~rbfN0*am=5~* zL}X!iE4fYFlu)s_#$9!^r>Rm`JajC%=+5d^pI&armb8Ot^A*RV?2m01qy zr_T-Z0o-R|Kf?PG4QPPE#HrFjb1*FM&8q$`sQbLYm$Pa`$ML|M1b!QKD)Dfr8puBP zQedWt@p9pSboDTDo4_$rD&+gTFsvNd*<8u}IXJ;RmkqaI_hL3o|60mhnUDZx;yJ+OML&VbVL4INw${*lsPk1h=sRHRUfj|>kN+>&KsYz6V4A%uM^ zA&Xf^yyO=01KMRlF}-Ib>srd-n9Lb6*te1~on^#yzjobp&MF+XgKF5IX5Wfh?p=Q6 zWb+e`$s|b8zt`e{eJc?wIsbk6^xkwf$3vZfn=NJ0iHG)=biOz~lsmp|;xf?hH{`Hy zC1)wi2^8}ES*7!(Y&w@MjZP>qxU)d7UMm>(t&~XZ@RY#DY+i-)=(+|lPAgi4$PSQR zZHQpsN`&;=kwSbVGw3gs-0ZHAlD1NC1sJb06tHilK>CZmywd&IyjC?435-;&gkVs~ zgOXZ(ux}+~2}edapB^4|3&UI@q_;v8WoM7*V9N`O=nb zA!k1F9A7(0gY~eXf_*C$m2TV%iKx3Jog2}i{TOxGMd&UN-)jhA-(E;KzZWfaJUZf| z`BHknRlP9jgN6|Ht%S_xdZ{#(=&m81DOu6;J@rw8o_%|Ie=eIYqNhMV>R8d^QJtPN z=-IcTmyV)Z4Z+9+%D*3s&l(EYw^Fd2%U=p0s9nCF>U;)`b0VdI2N`|05h!csPl6meshS)$|XGIxXKU4xc=E81C1Ym9WP*m;ck zfx*tc6}tpMUw&UUmqV*a6neGWUvTYu2?wO#FhsC#B|`eh?m}TWs7vS}Eyvn<(0$vW zXWxpxGMY(az&kLp+hzfb-!l}jZ>2yUIx4q^0MDyUOa_noKQd&nZzV&<5P0O8 zT1E5N@7C#ltB~9S)*l%v*tb$q9bAs9z=XM#0vC)wH59OKr9c`*C|`0%{W({s)#wC9 zFh!95+z`ROl?b_U88OjQP<#&`%rik`}=MM%i`&PU%rsbDB$Zlc8#qBAye=t2#w5^4G zApR#q2>Vt-h=>n8X?_@50O>|5!O2Fg0TfnBe50p>VB{%pZ~m5jD+MQTr;sQVy7Ay`6@y;{ zQ-i_Gz7?|!T2SoyLa9>tR`geauEn5d--=#}-d`+gmtSmlVVcac@~;MCyP<%6D+MxI z;0Kt3n;nzqm!QsPEmd3t)@g+(VA;|Nhm@zNpZE}ATxbSkl)*G{L#Vv2MdefQR_|(97q_xp-Gjkdm#0OUUK^kqq z_Id9VWo&Rn@%N@(dhRd^?q z@jF3??;mOzXWvS|d=9Y61LFA9rnV{j!=Sv{kifo`1StdbcIN9^8v%EL@Onc4`&I(v z*{u2)lE@X~!#b12M52sFY=qnm;+qX2>{|(u!BADm=5%q;pBuois5I!|2SEFB17Jr48$SV7bp=W#5WbMnlz# zh--JRU9W#X=pHiY*|(yX`D}hY+oLms>3p{6Otfu00P4pKDePNG@!kmLF>8Z?Ko~Ro zY0T;6tnNq;g7qmw1^ZSiD%~@RV!*0vdI&tv8NBRU@yal$5&*r0>Zd)&IU;`;TrU~i z>|1fmw1C0wO&8fTghxR7sv&}XD-kpK_E2pIz4(yEhWt^Gy1~6VeJf_kc7UIXkC_7$}o!GIGDzdDg_QvgqZ^Fu=e z`&Jqx_&g2aVoy4+(xrlH)#{%F={F4#?Awdz#hZ+M1y@Z_#8V*sjv<15D-q_cpeviR zd;oYFbl*4V*|(yX7kl2FC{q}=3dLu@_OZdvz7>1*#j1P&5yV^X%A0R3Z^AKy&0ks` zXLtB4sDEroVc$xMSrC;ELM+&y1KTGCJNs7b)3_hR^B_Lyt9;;joY{UJM87bI*|#FD zP6<`NSF%u1RR3jAvu{N$551V|mjyKZ>2_hn zYH;-$2>-_rz`m6LDfon&&KJ`%vbQPt*Fom18xMK*t;nTo3FrF@Hmq-erO{wz--@+5 z$L%;H`3XGTe+6`H20i;$^p%H+LT0xv;XRjCxV;IkDF!$DR@_qCap4Z+3Pr0?#9JVn zZjiHYMK0xDA&=>d&hE9Me;ahO4SM#i=#6rZYrBbruYzm7!OgxEcjZYQ-=g8!IiX#A z9fVgKYU8N=q{2I(UTjEV-%5)4ipA@AY?|M@AY5h$VBboBtdi-=%R3%^$*qf4J>GlZ zTWRpKZ^bWncyBd?P0qgtrc(@N_N|y@9Rfy=)kzedO5kU^2|m)i5BfER9QLi`cW$Npd~Ekl@kEX!5U=7 zDnLb-=Yf0AVcL2`)>=hp&{xe`n~}9vktUbOPp48V4YhG8fducRP#+gO&0 z6|=1xm*REUIK~~q=Tnu{m4}d4S#DU*d%ZB7jg@7V5$q>hhF!fkg=NQOU)J5khn!b4 z>v``|nDd~y*nu7LHDTrDbga8vjBPT!j)v*J3w_hzEv=hgHzscfk5N2WgbYQgRHU=v z=$H0PV2}#EFn@@IbD5b-42uuh&+tC~@c&$@67pAIrxM`2fL&S-LY`OkRujVYAd#BwN3#(gF= zEb}d^b3ejftu(n*Yr(Y)PDx&(BA^gf*spXG96IQ*DxuTq8!P?^0W#45Ky%_Ea(N!N z(y)GjJyh>8nsRvo{_KQXN|kcO&sHD0=So#mgZnXG;uZe02da?4pFOB66y17YU zgzr;}E*B1#n8P%)X<^gKrj5-cHtlRCvzfwXDw}C+PGB>g%?vg(+00@yo6Q_HbJ=hd zyYtyBV6%|TA~uWJEMe2ZW+@x4BzHNR6WOd_vy#n8Y))p=$>tO`r?NSX%_=sl*{or6 zI-4`ttYx!~&6zOerlLF`lv_hy*vlW`kQLdoC>nQ99NWic3!ANMwz1jHCduY9HkY&6 z!G=36H^pWrn>3qUY%**V8_lMl4Vp8#gKV;F(45KL%_hgjVUuT5U^C2S4;z}NB|W{l01Y!KSy9%S=HHdnE^n$0zAu4Qupn?r0cN+I`pHaD=jk)#O7r-udsQQ&6nA{#^!Z4Z?O3an>X3K1ygR+JUQ#W&A?aLyu;>QHt(_d z8k_goe8A>IHXpJ1n9X@dn)PtYEf-Y&_{@cM@QPhN3uFcEjwI*#4}) zO&A6I`F`8$XE%=PpVu(Eabd%}hK0xx?_+D2XB@%)(ZBO>Waanh6!_I^FO(}vIwOs< I=eM{0AEuvUFaQ7m literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/pooling.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/pooling.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e43ceeed5f04bb43946b70af47d714dfbee3e9 GIT binary patch literal 10625 zcmds7+m9SqT0hm->B~&d{o-57P8`x3dz{V1NxV*C#~vHAPLDHf<8?2gXm{7xJ?^d^ zpQ=g5y|KjNgm(mD;e{7KXoa*dyn$8-r2P|kDTD+<2pKK#9<5k@zwcC4ch8KIEbzpP z>ddKgzH|G|_x-+0&C=v#@$dfBb&sD@>YvrfPX_f1c>L!rrP@k0P+F>;Qe8{+EY(1n zQjL_d*qT<|wCZJ4BV*n(s+(24oNDCEdscPxsyCq;6L`<5c3yQ0s#jEvqUx1YqojIe z)hMgpq-sp6-jr%gsa{1jDxjWF?Skq~tKN)i%&6Y1YRszMoNCOOzM|^RtKNcYESQ-~ zs=KIqORBM?ddsS@ta>Y|v7&m1RO6899afFQ%5sa!Eh)FG?xj`Zh`QP?tM;V&3u~t;DU*p>p;dfJ23AwyM7tTdL8s@2`46tu z?yOzhs9IsZ+wolA-DXucy>`b7P|f;X*WG@a;=o*(y>e}%elsj>tlz3#b~e`Ezg7!# z8y9Pr*FOlS>T4g~TB}`Jb8gPbjdZ4kndym$%?(1-lJ#|-q?CKl+e%CY}+0(dtzq#WFZd-b> z=bRZ(&4%f2|6W)^;kaJ&Zr5#x*|m+0^^Gw5{>A#WOJTmYcJuc7#=pH@9Dl%2r>yXSTu5j(2Z$`%yUII32GO zIL=F$#LuBnRsp|*`H|zT#zZx20wX-!q2q)_$LaOkJ6+bxj`MJ**)=`d#x%06k%HXN zD=2;mk549*EqOoq2DU-)B{$H{P}HH-?W}^{vW`k#K`U8@CKpt@D0MWJ6f}wL(Ah}^ z{b3yh6$Pzfy-3}uS7*bDIW{HE+$=ZBAO6kYk(>PuRPNzU&CObB%iJ> z+3gHm5kkFyF1^HJ9z`{!kFw5t+5sOOJ)GV6(occHbtOP`~`qQS}%+0}0BM+Den1B!3h1509$b-V}Sm z*SL{yX(7i9xE4z-jdo>ZW|61|DWyN>P;W7&H+#sc6|<16f(h%@d~HxL?DWssVW!si z+(CsRWXHE~&K@k-r|s*|Z=2k=4f#1+S8&LuKgUlsr+IRH5=EHCK%?j{vW?1FO$*yY z%Lg*^lK1dF%saSz?KrTPG5?F;{;682NxCh!RRAE1&5`R@6M z>02rAeN{yl0xp7`U>o?JRRPov47Mo4;2cUY*m}6AZU<085KhP>ka3|}eqt~Yl23Wh z)Pxx~Me3_XVT1@-n2(qn=9=5vuGbdW5P{WHNln-S;Jcn-R3x8*lf*{DD8Zj9Ua#Qs zc}mLXoOR0D&zDFi624G8$s6Iz3@Q{rQ(6#*6n0M_H(Taq$=y{gqbTEh2xr9}?r80L zL8OJ(F+?CyS%VXMFKIvd*uKaC+1Kx5mu6pj%Q6~*odsz{QT}#(eHo?SlRBhaRO5*v zv6E8|&she6Q1|{brpF9N@Gy_+`ou}0jZZw%?*gAUQ5GVa38D~a#A|qyy z_nYzLSgs(;mE$8|xqp-1VvL=#)c}|d;!%l8t5~9NfK?TgRWM0W)2mi6#d_Q5H}G17 z(+Yt9SyKEK#23`lLVZW5;Z5bD-4c;`Cd1wwE*!REIQwtMv*$@q;$W6`$jmFEU8oU| zn>v8i74a5HAH1+*9G?gc?8q)Br~z#E-yJ;n6;y*4je6MH4R*8#aM{%TUSue2!VrxF zCOYQzqm_KSV=GD=5Bv)_x!slvw2EV4Gwf;PmM9Z_ZK-7{3GNF6czT?dta3I(-$)+(o#(`EU4 zB>e{eTC?dButkfgm7)DJs83siLkB6HnXnbxCMsHDn|_oi8w?S^aM!nhf%^LvOc7L$ zQuj>)BkEAING>QuP&-&Pr9Mxo6&SDGWeb)||2j*k5^>T^$ARSP2*C0Af}swuM;W-R<|c?ajWn zDUxh3(i>|c)Pr&_dNHD~Z$&ymb+X;vR(GcztDAW3oanCGLQLY?oxtw+c7Jn|!PVf{ z=t%9trE@jixoDxm$z=Q}AvYKW0G)0pcy#m1pbjN9s3=t1cSn@GLaODD^UHqSVH{+3s(P)i&U81ifLg z;~Ph}h1k?JfnAuni(4?3{u`WvVGrE_gp+MwjBGe7oO4Fm6lQU$?yeRnnZ=N5#`sS8 zR)2>Q&?p3MZ`LAMBUYWQa8c=00R_Zi0^-1c5fPvmNrYjk z2U&tG@Pl|{rJzarY|6N07^}ZabfJqTP(m$XPGm|w7VRdYh(r81t9HL?Q zhb{h;1wh+^)rPIbkSSmnbUq%y1$P-o;S@ZPPiGNnEb>E;n!{sb z(mEWrf5ByPhC`B-uyHfo9K}pJx>W}bMne6Qm>O`FY{AqBusFp(Sp=%QazK#-?g7!| z1&iJuo(bqCEb=FLnc)9hxb)#N)l{@8us(8VW~D}_`z$8HhUSD(b)lSN6pV9=ivp+= z=O{+UO06+}V}1QP^ETJl*KasCuYIt#e#>~{gA3!p8R3V(;MW9E#yNvGM#1f?@N)>B zm;Xn@1l~_F)DpD#zk}enKWQR92GsND!v%o+XmII<=|}7qpfp?e?bf4K*Bx93(2iT0 z{|#(k{qor&u6;FLYx+yo1wDm7Bgid|8}WKCh96}|#F zA^#>Z;v`;x+6H6*RT3YjjI|?2pW(+Mghv$XI6nqS91k84vTNo4#2I#%&W<^~KbmCNN^IbA+cw#%n9ds}#tA71DM zJpLb}aB)-OWSLB^bXbME0#D?eKo%j5kwt zah{v0x;VSdR2{;rIiW`k2pn6GItDJP_L9^Q>Mg7GiqtU)`F|)Z))PxyyLqL>h=V`; zo56Dlk3WrD1eW6J9^}cu02WsKZ^Sb&wW!mZkH8j3lRiKwjH2G8?^?#6;h;u52<|OD zNC1%AVq-BP%B+aX|3oB(wm_^o9b;Hd1m!Rbuwtm-poT_bTH1Zsn~K_mA;!e|Cn9O^ z^2JNAyb}xoNCj(y?thKCF~U$lA{lUS=2_XUF%xBrXM~xMMQJ9mYQ37P4UWb!DD{!p z7ALk$RPTnY+$q)8UZ4CWeJU($(RBp&)Ol7f9#?Vc5hVhZ-qSPB+`McS{If0dXo&Z08(6Bkr}pK506n2u?poS6}_ zYr;DO(QrH?DoNmsQ`M`*(TuEq8K>BvkWC{YJD4ychqP_>O0(;`gQ-|1c_T>MmOvHL z3})~$-XCXed5iiq3rUY8(h+5CHKEnm!y)(z?h>y55s%L}MZx?qV|y4G+a>Eo{0?Tv z?rJ<;o5qObs(y$UTvd{o)!(7A1EF{syC;RCYUIM8|8T$xggvQ=VsHy{-(nIreaKAua;}0QuvawrT#l#Sl=C_PT86v&==N6 z=H`x_63Ae78)@%*kKXy-E30w+xPClXI2GLxJIr0NdFfPqS8R{24IN)t)u;c(gnQa3 zH$G@-cN>ZGFb6d0HG?G69;M*-+}MZM+fVWM3~CkJivn(K+FG`jQblMOe~YQn(?Q3~ z0??>R{~5PIr$g-(6mbz4JIW9L@(~+XLWSyu63J`vOf2C<^kFB=bPyen zI0=+fpqqmv8+#n*=V*wRT^y6ogkIO0rdDL}$f`|@0xIFOu*|fF-(;QpNQs$WlbpD2;o&=%G(}Xm4v)#@jIh@eZhfa^4JL>4~lRPg#jg{KZ+__ z$SOjnypwA8gluXOM_Q7U14h8LNFxbuXdb?A-3DaTtJ&J%l-qTCh!pJ}KFZT{H%Ibm zMouIjZJdUaM(Ky?svAJuk)dY5;Ce(hoHLpU*{i0_6b|!Prp-6r0gNqul%T&q$Nlm% zXG5lK&urBx6Xei>i-PD^SraoZrd_^^N|I@w9WyMhv0xZteDGgJEy_NbDHs!lMZ`Rw z3%8~3?a?!QsDb2C%o&p@*lb$uinW4gGOkN-GACsjK@Kxc)2YFf;Q_h03JxT?kmihd zF5&V207WGH@NsjD9ukF&h5u!m)+jxEF;4!9*i(d%8lfMXc)kz_Ow*TX;4}YTR6)Au z$(RTgj0hRi4i6Xk?}+B%BV|M=T^pQ>w^esx7Ys|zMpX-_h0BrG$87a-e|n> z2~mJ0XQtTe;yv@W%y(8}tZ#!|dvEAFXgk3h;-&M3coTE@(vaN5%*aic#goe*3iCqb zGI-a9`v^5yv6O#2@@t^aXmO-OJ9{PJcix*Dqlj8X1@R3sGa`U5V0tYA7<~~v;510P zCLjA><)Mlgq~s_(*kEDgC_~Dz<0P`hPcLJ#Wk;t&<4OehL&6IDlO;=35D$aQXazG-r+RY4|bf{|BF5 zC$oM*K5@*Y1Nd}wM4rf}*4TIOYGrRqgW@=n*Z7dHms#9mL7zYn6V5JbcUVZmL$*Bh z+lFb5HIV!b9-mF+R2o?z{#I7Xq?sjr|wZtU(B%!&EG2vK|PeFV4?280vm&Hrq@OC%B( YHn+^+5WlHa>j?h7l&Yi`^NYXx-z*UD%m4rY literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/rdns.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/rdns.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40418620c025e34b5635fc9d9b3232f2f3355b9c GIT binary patch literal 1849 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/server.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/server.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c220103fb2a2c2cb1030f172fefcd6c3fde94a7d GIT binary patch literal 21057 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/tls.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/tls.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6ca4de1ee893623f0e9f33d6a06e51ff01f62a7 GIT binary patch literal 9075 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 P;hXnq%B*MS{_}qTHyMCf literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/usage.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/__pycache__/usage.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..474cbd03f366060bbb69a6b7a1c8d059918a5dfd GIT binary patch literal 7670 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 Uc$MCQPpwN^o5pHx)wrDhH}{Y!p8x;= literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/connection.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/connection.py new file mode 100644 index 0000000..c062d3a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/connection.py @@ -0,0 +1,1605 @@ +""" +""" + +# Created on 2014.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from copy import deepcopy, copy +from os import linesep +from threading import RLock +from functools import reduce +import json + +from .. import ANONYMOUS, SIMPLE, SASL, MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, get_config_parameter, DEREF_ALWAYS, \ + SUBTREE, ASYNC, SYNC, NO_ATTRIBUTES, ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, MODIFY_INCREMENT, LDIF, ASYNC_STREAM, \ + RESTARTABLE, ROUND_ROBIN, REUSABLE, AUTO_BIND_DEFAULT, AUTO_BIND_NONE, AUTO_BIND_TLS_BEFORE_BIND, SAFE_SYNC, SAFE_RESTARTABLE, \ + AUTO_BIND_TLS_AFTER_BIND, AUTO_BIND_NO_TLS, STRING_TYPES, SEQUENCE_TYPES, MOCK_SYNC, MOCK_ASYNC, NTLM, EXTERNAL,\ + DIGEST_MD5, GSSAPI, PLAIN, DSA, SCHEMA, ALL + +from .results import RESULT_SUCCESS, RESULT_COMPARE_TRUE, RESULT_COMPARE_FALSE +from ..extend import ExtendedOperationsRoot +from .pooling import ServerPool +from .server import Server +from ..operation.abandon import abandon_operation, abandon_request_to_dict +from ..operation.add import add_operation, add_request_to_dict +from ..operation.bind import bind_operation, bind_request_to_dict +from ..operation.compare import compare_operation, compare_request_to_dict +from ..operation.delete import delete_operation, delete_request_to_dict +from ..operation.extended import extended_operation, extended_request_to_dict +from ..operation.modify import modify_operation, modify_request_to_dict +from ..operation.modifyDn import modify_dn_operation, modify_dn_request_to_dict +from ..operation.search import search_operation, search_request_to_dict +from ..protocol.rfc2849 import operation_to_ldif, add_ldif_header +from ..protocol.sasl.digestMd5 import sasl_digest_md5 +from ..protocol.sasl.external import sasl_external +from ..protocol.sasl.plain import sasl_plain +from ..strategy.sync import SyncStrategy +from ..strategy.safeSync import SafeSyncStrategy +from ..strategy.safeRestartable import SafeRestartableStrategy +from ..strategy.mockAsync import MockAsyncStrategy +from ..strategy.asynchronous import AsyncStrategy +from ..strategy.reusable import ReusableStrategy +from ..strategy.restartable import RestartableStrategy +from ..strategy.ldifProducer import LdifProducerStrategy +from ..strategy.mockSync import MockSyncStrategy +from ..strategy.asyncStream import AsyncStreamStrategy +from ..operation.unbind import unbind_operation +from ..protocol.rfc2696 import paged_search_control +from .usage import ConnectionUsage +from .tls import Tls +from .exceptions import LDAPUnknownStrategyError, LDAPBindError, LDAPUnknownAuthenticationMethodError, \ + LDAPSASLMechanismNotSupportedError, LDAPObjectClassError, LDAPConnectionIsReadOnlyError, LDAPChangeError, LDAPExceptionError, \ + LDAPObjectError, LDAPSocketReceiveError, LDAPAttributeError, LDAPInvalidValueError, LDAPInvalidPortError, LDAPStartTLSError + +from ..utils.conv import escape_bytes, prepare_for_stream, check_json_dict, format_json, to_unicode +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED, get_library_log_hide_sensitive_data +from ..utils.dn import safe_dn +from ..utils.port_validators import check_port_and_port_list + + +SASL_AVAILABLE_MECHANISMS = [EXTERNAL, + DIGEST_MD5, + GSSAPI, + PLAIN] + +CLIENT_STRATEGIES = [SYNC, + SAFE_SYNC, + SAFE_RESTARTABLE, + ASYNC, + LDIF, + RESTARTABLE, + REUSABLE, + MOCK_SYNC, + MOCK_ASYNC, + ASYNC_STREAM] + + +def _format_socket_endpoint(endpoint): + if endpoint and len(endpoint) == 2: # IPv4 + return str(endpoint[0]) + ':' + str(endpoint[1]) + elif endpoint and len(endpoint) == 4: # IPv6 + return '[' + str(endpoint[0]) + ']:' + str(endpoint[1]) + + try: + return str(endpoint) + except Exception: + return '?' + + +def _format_socket_endpoints(sock): + if sock: + try: + local = sock.getsockname() + except Exception: + local = (None, None, None, None) + try: + remote = sock.getpeername() + except Exception: + remote = (None, None, None, None) + + return '' + return '' + + +class Connection(object): + """Main ldap connection class. + + Controls, if used, must be a list of tuples. Each tuple must have 3 + elements, the control OID, a boolean meaning if the control is + critical, a value. + + If the boolean is set to True the server must honor the control or + refuse the operation + + Mixing controls must be defined in controls specification (as per + RFC 4511) + + :param server: the Server object to connect to + :type server: Server, str + :param user: the user name for simple authentication + :type user: str + :param password: the password for simple authentication + :type password: str + :param auto_bind: specify if the bind will be performed automatically when defining the Connection object + :type auto_bind: int, can be one of AUTO_BIND_DEFAULT, AUTO_BIND_NONE, AUTO_BIND_NO_TLS, AUTO_BIND_TLS_BEFORE_BIND, AUTO_BIND_TLS_AFTER_BIND as specified in ldap3 + :param version: LDAP version, default to 3 + :type version: int + :param authentication: type of authentication + :type authentication: int, can be one of ANONYMOUS, SIMPLE or SASL, as specified in ldap3 + :param client_strategy: communication strategy used in the Connection + :type client_strategy: can be one of SYNC, ASYNC, LDIF, RESTARTABLE, REUSABLE as specified in ldap3 + :param auto_referrals: specify if the connection object must automatically follow referrals + :type auto_referrals: bool + :param sasl_mechanism: mechanism for SASL authentication, can be one of 'EXTERNAL', 'DIGEST-MD5', 'GSSAPI', 'PLAIN' + :type sasl_mechanism: str + :param sasl_credentials: credentials for SASL mechanism + :type sasl_credentials: tuple + :param check_names: if True the library will check names of attributes and object classes against the schema. Also values found in entries will be formatted as indicated by the schema + :type check_names: bool + :param collect_usage: collect usage metrics in the usage attribute + :type collect_usage: bool + :param read_only: disable operations that modify data in the LDAP server + :type read_only: bool + :param lazy: open and bind the connection only when an actual operation is performed + :type lazy: bool + :param raise_exceptions: raise exceptions when operations are not successful, if False operations return False if not successful but not raise exceptions + :type raise_exceptions: bool + :param pool_name: pool name for pooled strategies + :type pool_name: str + :param pool_size: pool size for pooled strategies + :type pool_size: int + :param pool_lifetime: pool lifetime for pooled strategies + :type pool_lifetime: int + :param cred_store: credential store for gssapi + :type cred_store: dict + :param use_referral_cache: keep referral connections open and reuse them + :type use_referral_cache: bool + :param auto_escape: automatic escaping of filter values + :type auto_escape: bool + :param auto_encode: automatic encoding of attribute values + :type auto_encode: bool + :param source_address: the ip address or hostname to use as the source when opening the connection to the server + :type source_address: str + :param source_port: the source port to use when opening the connection to the server. Cannot be specified with source_port_list + :type source_port: int + :param source_port_list: a list of source ports to choose from when opening the connection to the server. Cannot be specified with source_port + :type source_port_list: list + """ + def __init__(self, + server, + user=None, + password=None, + auto_bind=AUTO_BIND_DEFAULT, + version=3, + authentication=None, + client_strategy=SYNC, + auto_referrals=True, + auto_range=True, + sasl_mechanism=None, + sasl_credentials=None, + check_names=True, + collect_usage=False, + read_only=False, + lazy=False, + raise_exceptions=False, + pool_name=None, + pool_size=None, + pool_lifetime=None, + cred_store=None, + fast_decoder=True, + receive_timeout=None, + return_empty_attributes=True, + use_referral_cache=False, + auto_escape=True, + auto_encode=True, + pool_keepalive=None, + source_address=None, + source_port=None, + source_port_list=None): + + conf_default_pool_name = get_config_parameter('DEFAULT_THREADED_POOL_NAME') + self.connection_lock = RLock() # re-entrant lock to ensure that operations in the Connection object are executed atomically in the same thread + with self.connection_lock: + if client_strategy not in CLIENT_STRATEGIES: + self.last_error = 'unknown client connection strategy' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownStrategyError(self.last_error) + + self.strategy_type = client_strategy + self.user = user + self.password = password + + if not authentication and self.user: + self.authentication = SIMPLE + elif not authentication: + self.authentication = ANONYMOUS + elif authentication in [SIMPLE, ANONYMOUS, SASL, NTLM]: + self.authentication = authentication + else: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + + self.version = version + self.auto_referrals = True if auto_referrals else False + self.request = None + self.response = None + self.result = None + self.bound = False + self.listening = False + self.closed = True + self.last_error = None + if auto_bind is False: # compatibility with older version where auto_bind was a boolean + self.auto_bind = AUTO_BIND_DEFAULT + elif auto_bind is True: + self.auto_bind = AUTO_BIND_NO_TLS + else: + self.auto_bind = auto_bind + self.sasl_mechanism = sasl_mechanism + self.sasl_credentials = sasl_credentials + self._usage = ConnectionUsage() if collect_usage else None + self.socket = None + self.tls_started = False + self.sasl_in_progress = False + self.read_only = read_only + self._context_state = [] + self._deferred_open = False + self._deferred_bind = False + self._deferred_start_tls = False + self._bind_controls = None + self._executing_deferred = False + self.lazy = lazy + self.pool_name = pool_name if pool_name else conf_default_pool_name + self.pool_size = pool_size + self.cred_store = cred_store + self.pool_lifetime = pool_lifetime + self.pool_keepalive = pool_keepalive + self.starting_tls = False + self.check_names = check_names + self.raise_exceptions = raise_exceptions + self.auto_range = True if auto_range else False + self.extend = ExtendedOperationsRoot(self) + self._entries = [] + self.fast_decoder = fast_decoder + self.receive_timeout = receive_timeout + self.empty_attributes = return_empty_attributes + self.use_referral_cache = use_referral_cache + self.auto_escape = auto_escape + self.auto_encode = auto_encode + self._digest_md5_kic = None + self._digest_md5_kis = None + self._digest_md5_sec_num = 0 + + port_err = check_port_and_port_list(source_port, source_port_list) + if port_err: + if log_enabled(ERROR): + log(ERROR, port_err) + raise LDAPInvalidPortError(port_err) + # using an empty string to bind a socket means "use the default as if this wasn't provided" because socket + # binding requires that you pass something for the ip if you want to pass a specific port + self.source_address = source_address if source_address is not None else '' + # using 0 as the source port to bind a socket means "use the default behavior of picking a random port from + # all ports as if this wasn't provided" because socket binding requires that you pass something for the port + # if you want to pass a specific ip + self.source_port_list = [0] + if source_port is not None: + self.source_port_list = [source_port] + elif source_port_list is not None: + self.source_port_list = source_port_list[:] + + if isinstance(server, STRING_TYPES): + server = Server(server) + if isinstance(server, SEQUENCE_TYPES): + server = ServerPool(server, ROUND_ROBIN, active=True, exhaust=True) + + if isinstance(server, ServerPool): + self.server_pool = server + self.server_pool.initialize(self) + self.server = self.server_pool.get_current_server(self) + else: + self.server_pool = None + self.server = server + + # if self.authentication == SIMPLE and self.user and self.check_names: + # self.user = safe_dn(self.user) + # if log_enabled(EXTENDED): + # log(EXTENDED, 'user name sanitized to <%s> for simple authentication via <%s>', self.user, self) + + if self.strategy_type == SYNC: + self.strategy = SyncStrategy(self) + elif self.strategy_type == SAFE_SYNC: + self.strategy = SafeSyncStrategy(self) + elif self.strategy_type == SAFE_RESTARTABLE: + self.strategy = SafeRestartableStrategy(self) + elif self.strategy_type == ASYNC: + self.strategy = AsyncStrategy(self) + elif self.strategy_type == LDIF: + self.strategy = LdifProducerStrategy(self) + elif self.strategy_type == RESTARTABLE: + self.strategy = RestartableStrategy(self) + elif self.strategy_type == REUSABLE: + self.strategy = ReusableStrategy(self) + self.lazy = False + elif self.strategy_type == MOCK_SYNC: + self.strategy = MockSyncStrategy(self) + elif self.strategy_type == MOCK_ASYNC: + self.strategy = MockAsyncStrategy(self) + elif self.strategy_type == ASYNC_STREAM: + self.strategy = AsyncStreamStrategy(self) + else: + self.last_error = 'unknown strategy' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownStrategyError(self.last_error) + + # maps strategy functions to connection functions + self.send = self.strategy.send + self.open = self.strategy.open + self.get_response = self.strategy.get_response + self.post_send_single_response = self.strategy.post_send_single_response + self.post_send_search = self.strategy.post_send_search + + if not self.strategy.no_real_dsa: + self._do_auto_bind() + # else: # for strategies with a fake server set get_info to NONE if server hasn't a schema + # if self.server and not self.server.schema: + # self.server.get_info = NONE + if log_enabled(BASIC): + if get_library_log_hide_sensitive_data(): + log(BASIC, 'instantiated Connection: <%s>', self.repr_with_sensitive_data_stripped()) + else: + log(BASIC, 'instantiated Connection: <%r>', self) + + def _prepare_return_value(self, status, response=False): + if self.strategy.thread_safe: + temp_response = self.response + self.response = None + temp_request = self.request + self.request = None + return status, deepcopy(self.result), deepcopy(temp_response) if response else None, copy(temp_request) + return status + + def _do_auto_bind(self): + if self.auto_bind and self.auto_bind not in [AUTO_BIND_NONE, AUTO_BIND_DEFAULT]: + if log_enabled(BASIC): + log(BASIC, 'performing automatic bind for <%s>', self) + if self.closed: + self.open(read_server_info=False) + if self.auto_bind == AUTO_BIND_NO_TLS: + self.bind(read_server_info=True) + elif self.auto_bind == AUTO_BIND_TLS_BEFORE_BIND: + if self.start_tls(read_server_info=False): + self.bind(read_server_info=True) + else: + error = 'automatic start_tls befored bind not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() # unbind anyway to close connection + raise LDAPStartTLSError(error) + elif self.auto_bind == AUTO_BIND_TLS_AFTER_BIND: + self.bind(read_server_info=False) + if not self.start_tls(read_server_info=True): + error = 'automatic start_tls after bind not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPStartTLSError(error) + if not self.bound: + error = 'automatic bind not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPBindError(error) + + def __str__(self): + s = [ + str(self.server) if self.server else 'None', + 'user: ' + str(self.user), + 'lazy' if self.lazy else 'not lazy', + 'unbound' if not self.bound else ('deferred bind' if self._deferred_bind else 'bound'), + 'closed' if self.closed else ('deferred open' if self._deferred_open else 'open'), + _format_socket_endpoints(self.socket), + 'tls not started' if not self.tls_started else('deferred start_tls' if self._deferred_start_tls else 'tls started'), + 'listening' if self.listening else 'not listening', + self.strategy.__class__.__name__ if hasattr(self, 'strategy') else 'No strategy', + 'internal decoder' if self.fast_decoder else 'pyasn1 decoder' + ] + return ' - '.join(s) + + def __repr__(self): + conf_default_pool_name = get_config_parameter('DEFAULT_THREADED_POOL_NAME') + if self.server_pool: + r = 'Connection(server={0.server_pool!r}'.format(self) + else: + r = 'Connection(server={0.server!r}'.format(self) + r += '' if self.user is None else ', user={0.user!r}'.format(self) + r += '' if self.password is None else ', password={0.password!r}'.format(self) + r += '' if self.auto_bind is None else ', auto_bind={0.auto_bind!r}'.format(self) + r += '' if self.version is None else ', version={0.version!r}'.format(self) + r += '' if self.authentication is None else ', authentication={0.authentication!r}'.format(self) + r += '' if self.strategy_type is None else ', client_strategy={0.strategy_type!r}'.format(self) + r += '' if self.auto_referrals is None else ', auto_referrals={0.auto_referrals!r}'.format(self) + r += '' if self.sasl_mechanism is None else ', sasl_mechanism={0.sasl_mechanism!r}'.format(self) + r += '' if self.sasl_credentials is None else ', sasl_credentials={0.sasl_credentials!r}'.format(self) + r += '' if self.check_names is None else ', check_names={0.check_names!r}'.format(self) + r += '' if self.usage is None else (', collect_usage=' + ('True' if self.usage else 'False')) + r += '' if self.read_only is None else ', read_only={0.read_only!r}'.format(self) + r += '' if self.lazy is None else ', lazy={0.lazy!r}'.format(self) + r += '' if self.raise_exceptions is None else ', raise_exceptions={0.raise_exceptions!r}'.format(self) + r += '' if (self.pool_name is None or self.pool_name == conf_default_pool_name) else ', pool_name={0.pool_name!r}'.format(self) + r += '' if self.pool_size is None else ', pool_size={0.pool_size!r}'.format(self) + r += '' if self.pool_lifetime is None else ', pool_lifetime={0.pool_lifetime!r}'.format(self) + r += '' if self.pool_keepalive is None else ', pool_keepalive={0.pool_keepalive!r}'.format(self) + r += '' if self.cred_store is None else (', cred_store=' + repr(self.cred_store)) + r += '' if self.fast_decoder is None else (', fast_decoder=' + ('True' if self.fast_decoder else 'False')) + r += '' if self.auto_range is None else (', auto_range=' + ('True' if self.auto_range else 'False')) + r += '' if self.receive_timeout is None else ', receive_timeout={0.receive_timeout!r}'.format(self) + r += '' if self.empty_attributes is None else (', return_empty_attributes=' + ('True' if self.empty_attributes else 'False')) + r += '' if self.auto_encode is None else (', auto_encode=' + ('True' if self.auto_encode else 'False')) + r += '' if self.auto_escape is None else (', auto_escape=' + ('True' if self.auto_escape else 'False')) + r += '' if self.use_referral_cache is None else (', use_referral_cache=' + ('True' if self.use_referral_cache else 'False')) + r += ')' + + return r + + def repr_with_sensitive_data_stripped(self): + conf_default_pool_name = get_config_parameter('DEFAULT_THREADED_POOL_NAME') + if self.server_pool: + r = 'Connection(server={0.server_pool!r}'.format(self) + else: + r = 'Connection(server={0.server!r}'.format(self) + r += '' if self.user is None else ', user={0.user!r}'.format(self) + r += '' if self.password is None else ", password='{0}'".format('' % len(self.password)) + r += '' if self.auto_bind is None else ', auto_bind={0.auto_bind!r}'.format(self) + r += '' if self.version is None else ', version={0.version!r}'.format(self) + r += '' if self.authentication is None else ', authentication={0.authentication!r}'.format(self) + r += '' if self.strategy_type is None else ', client_strategy={0.strategy_type!r}'.format(self) + r += '' if self.auto_referrals is None else ', auto_referrals={0.auto_referrals!r}'.format(self) + r += '' if self.sasl_mechanism is None else ', sasl_mechanism={0.sasl_mechanism!r}'.format(self) + if self.sasl_mechanism == DIGEST_MD5: + r += '' if self.sasl_credentials is None else ", sasl_credentials=({0!r}, {1!r}, '{2}', {3!r})".format(self.sasl_credentials[0], self.sasl_credentials[1], '*' * len(self.sasl_credentials[2]), self.sasl_credentials[3]) + else: + r += '' if self.sasl_credentials is None else ', sasl_credentials={0.sasl_credentials!r}'.format(self) + r += '' if self.check_names is None else ', check_names={0.check_names!r}'.format(self) + r += '' if self.usage is None else (', collect_usage=' + 'True' if self.usage else 'False') + r += '' if self.read_only is None else ', read_only={0.read_only!r}'.format(self) + r += '' if self.lazy is None else ', lazy={0.lazy!r}'.format(self) + r += '' if self.raise_exceptions is None else ', raise_exceptions={0.raise_exceptions!r}'.format(self) + r += '' if (self.pool_name is None or self.pool_name == conf_default_pool_name) else ', pool_name={0.pool_name!r}'.format(self) + r += '' if self.pool_size is None else ', pool_size={0.pool_size!r}'.format(self) + r += '' if self.pool_lifetime is None else ', pool_lifetime={0.pool_lifetime!r}'.format(self) + r += '' if self.pool_keepalive is None else ', pool_keepalive={0.pool_keepalive!r}'.format(self) + r += '' if self.cred_store is None else (', cred_store=' + repr(self.cred_store)) + r += '' if self.fast_decoder is None else (', fast_decoder=' + 'True' if self.fast_decoder else 'False') + r += '' if self.auto_range is None else (', auto_range=' + ('True' if self.auto_range else 'False')) + r += '' if self.receive_timeout is None else ', receive_timeout={0.receive_timeout!r}'.format(self) + r += '' if self.empty_attributes is None else (', return_empty_attributes=' + 'True' if self.empty_attributes else 'False') + r += '' if self.auto_encode is None else (', auto_encode=' + ('True' if self.auto_encode else 'False')) + r += '' if self.auto_escape is None else (', auto_escape=' + ('True' if self.auto_escape else 'False')) + r += '' if self.use_referral_cache is None else (', use_referral_cache=' + ('True' if self.use_referral_cache else 'False')) + r += ')' + + return r + + @property + def stream(self): + """Used by the LDIFProducer strategy to accumulate the ldif-change operations with a single LDIF header + :return: reference to the response stream if defined in the strategy. + """ + return self.strategy.get_stream() if self.strategy.can_stream else None + + @stream.setter + def stream(self, value): + with self.connection_lock: + if self.strategy.can_stream: + self.strategy.set_stream(value) + + @property + def usage(self): + """Usage statistics for the connection. + :return: Usage object + """ + if not self._usage: + return None + if self.strategy.pooled: # update master connection usage from pooled connections + self._usage.reset() + for worker in self.strategy.pool.workers: + self._usage += worker.connection.usage + self._usage += self.strategy.pool.terminated_usage + return self._usage + + def __enter__(self): + with self.connection_lock: + self._context_state.append((self.bound, self.closed)) # save status out of context as a tuple in a list + if self.auto_bind != AUTO_BIND_NONE: + if self.auto_bind == AUTO_BIND_DEFAULT: + self.auto_bind = AUTO_BIND_NO_TLS + if self.closed: + self.open() + if not self.bound: + if not self.bind(): + raise LDAPBindError('unable to bind') + + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + with self.connection_lock: + context_bound, context_closed = self._context_state.pop() + if (not context_bound and self.bound) or self.stream: # restore status prior to entering context + try: + self.unbind() + except LDAPExceptionError: + pass + + if not context_closed and self.closed: + self.open() + + if exc_type is not None: + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', exc_type, self) + return False # re-raise LDAPExceptionError + + def bind(self, + read_server_info=True, + controls=None): + """Bind to ldap Server with the authentication method and the user defined in the connection + + :param read_server_info: reads info from server + :param controls: LDAP controls to send along with the bind operation + :type controls: list of tuple + :return: bool + + """ + if log_enabled(BASIC): + log(BASIC, 'start BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + if self.lazy and not self._executing_deferred: + if self.strategy.pooled: + self.strategy.validate_bind(controls) + self._deferred_bind = True + self._bind_controls = controls + self.bound = True + if log_enabled(BASIC): + log(BASIC, 'deferring bind for <%s>', self) + else: + self._deferred_bind = False + self._bind_controls = None + if self.closed: # try to open connection if closed + self.open(read_server_info=False) + if self.authentication == ANONYMOUS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing anonymous BIND for <%s>', self) + if not self.strategy.pooled: + request = bind_operation(self.version, self.authentication, self.user, '', auto_encode=self.auto_encode) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'anonymous BIND request <%s> sent via <%s>', bind_request_to_dict(request), self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + elif self.authentication == SIMPLE: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing simple BIND for <%s>', self) + if not self.strategy.pooled: + request = bind_operation(self.version, self.authentication, self.user, self.password, auto_encode=self.auto_encode) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'simple BIND request <%s> sent via <%s>', bind_request_to_dict(request), self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + elif self.authentication == SASL: + if self.sasl_mechanism in SASL_AVAILABLE_MECHANISMS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing SASL BIND for <%s>', self) + if not self.strategy.pooled: + response = self.do_sasl_bind(controls) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + else: + self.last_error = 'requested SASL mechanism not supported' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPSASLMechanismNotSupportedError(self.last_error) + elif self.authentication == NTLM: + if self.user and self.password and len(self.user.split('\\')) == 2: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing NTLM BIND for <%s>', self) + if not self.strategy.pooled: + response = self.do_ntlm_bind(controls) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + else: # user or password missing + self.last_error = 'NTLM needs domain\\username and a password' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + else: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + + if not self.strategy.sync and not self.strategy.pooled and self.authentication not in (SASL, NTLM): # get response if asynchronous except for SASL and NTLM that return the bind result even for asynchronous strategy + _, result = self.get_response(response) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async BIND response id <%s> received via <%s>', result, self) + elif self.strategy.sync: + result = self.result + if log_enabled(PROTOCOL): + log(PROTOCOL, 'BIND response <%s> received via <%s>', result, self) + elif self.strategy.pooled or self.authentication in (SASL, NTLM): # asynchronous SASL and NTLM or reusable strtegy get the bind result synchronously + result = response + else: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + + if result is None: + # self.bound = True if self.strategy_type == REUSABLE else False + self.bound = False + elif result is True: + self.bound = True + elif result is False: + self.bound = False + else: + self.bound = True if result['result'] == RESULT_SUCCESS else False + if not self.bound and result and result['description'] and not self.last_error: + self.last_error = result['description'] + + if read_server_info and self.bound: + self.refresh_server_info() + self._entries = [] + + if log_enabled(BASIC): + log(BASIC, 'done BIND operation, result <%s>', self.bound) + + return self._prepare_return_value(self.bound, self.result) + + def rebind(self, + user=None, + password=None, + authentication=None, + sasl_mechanism=None, + sasl_credentials=None, + read_server_info=True, + controls=None + ): + + if log_enabled(BASIC): + log(BASIC, 'start (RE)BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + if user: + self.user = user + if password is not None: + self.password = password + if not authentication and user: + self.authentication = SIMPLE + if authentication in [SIMPLE, ANONYMOUS, SASL, NTLM]: + self.authentication = authentication + elif authentication is not None: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + if sasl_mechanism: + self.sasl_mechanism = sasl_mechanism + if sasl_credentials: + self.sasl_credentials = sasl_credentials + + # if self.authentication == SIMPLE and self.user and self.check_names: + # self.user = safe_dn(self.user) + # if log_enabled(EXTENDED): + # log(EXTENDED, 'user name sanitized to <%s> for rebind via <%s>', self.user, self) + + if not self.strategy.pooled: + try: + return self.bind(read_server_info, controls) + except LDAPSocketReceiveError: + self.last_error = 'Unable to rebind as a different user, furthermore the server abruptly closed the connection' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPBindError(self.last_error) + else: + self.strategy.pool.rebind_pool() + return self._prepare_return_value(True, self.result) + + def unbind(self, + controls=None): + """Unbind the connected user. Unbind implies closing session as per RFC4511 (4.3) + + :param controls: LDAP controls to send along with the bind operation + + """ + if log_enabled(BASIC): + log(BASIC, 'start UNBIND operation via <%s>', self) + + if self.use_referral_cache: + self.strategy.unbind_referral_cache() + + self.last_error = None + with self.connection_lock: + if self.lazy and not self._executing_deferred and (self._deferred_bind or self._deferred_open): # _clear deferred status + self.strategy.close() + self._deferred_open = False + self._deferred_bind = False + self._deferred_start_tls = False + elif not self.closed: + request = unbind_operation() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'UNBIND request sent via <%s>', self) + self.send('unbindRequest', request, controls) + self.strategy.close() + + if log_enabled(BASIC): + log(BASIC, 'done UNBIND operation, result <%s>', True) + + return self._prepare_return_value(True) + + def search(self, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=None, + paged_criticality=False, + paged_cookie=None, + auto_escape=None): + """ + Perform an ldap search: + + - If attributes is empty noRFC2696 with the specified size + - If paged is 0 and cookie is present the search is abandoned on + server attribute is returned + - If attributes is ALL_ATTRIBUTES all attributes are returned + - If paged_size is an int greater than 0 a simple paged search + is tried as described in + - Cookie is an opaque string received in the last paged search + and must be used on the next paged search response + - If lazy == True open and bind will be deferred until another + LDAP operation is performed + - If mssing_attributes == True then an attribute not returned by the server is set to None + - If auto_escape is set it overrides the Connection auto_escape + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + if log_enabled(BASIC): + log(BASIC, 'start SEARCH operation via <%s>', self) + + if self.check_names and search_base: + search_base = safe_dn(search_base) + if log_enabled(EXTENDED): + log(EXTENDED, 'search base sanitized to <%s> for SEARCH operation via <%s>', search_base, self) + + with self.connection_lock: + self._fire_deferred() + if not attributes: + attributes = [NO_ATTRIBUTES] + elif attributes == ALL_ATTRIBUTES: + attributes = [ALL_ATTRIBUTES] + + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + + if get_operational_attributes and isinstance(attributes, list): + attributes.append(ALL_OPERATIONAL_ATTRIBUTES) + elif get_operational_attributes and isinstance(attributes, tuple): + attributes += (ALL_OPERATIONAL_ATTRIBUTES, ) # concatenate tuple + + if isinstance(paged_size, int): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing paged search for %d items with cookie <%s> for <%s>', paged_size, escape_bytes(paged_cookie), self) + + if controls is None: + controls = [] + else: + # Copy the controls to prevent modifying the original object + controls = list(controls) + controls.append(paged_search_control(paged_criticality, paged_size, paged_cookie)) + + if self.server and self.server.schema and self.check_names: + for attribute_name in attributes: + if ';' in attribute_name: # remove tags + attribute_name_to_check = attribute_name.split(';')[0] + else: + attribute_name_to_check = attribute_name + if self.server.schema and attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + + request = search_operation(search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + self.auto_escape if auto_escape is None else auto_escape, + self.auto_encode, + self.server.schema if self.server else None, + validator=self.server.custom_validator, + check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'SEARCH request <%s> sent via <%s>', search_request_to_dict(request), self) + response = self.post_send_search(self.send('searchRequest', request, controls)) + self._entries = [] + + if isinstance(response, int): # asynchronous strategy + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async SEARCH response id <%s> received via <%s>', return_value, self) + else: + return_value = True if self.result['type'] == 'searchResDone' and len(response) > 0 else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(PROTOCOL): + for entry in response: + if entry['type'] == 'searchResEntry': + log(PROTOCOL, 'SEARCH response entry <%s> received via <%s>', entry, self) + elif entry['type'] == 'searchResRef': + log(PROTOCOL, 'SEARCH response reference <%s> received via <%s>', entry, self) + + if log_enabled(BASIC): + log(BASIC, 'done SEARCH operation, result <%s>', return_value) + + return self._prepare_return_value(return_value, response=True) + + def compare(self, + dn, + attribute, + value, + controls=None): + """ + Perform a compare operation + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + + if log_enabled(BASIC): + log(BASIC, 'start COMPARE operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for COMPARE operation via <%s>', dn, self) + + if self.server and self.server.schema and self.check_names: + if ';' in attribute: # remove tags for checking + attribute_name_to_check = attribute.split(';')[0] + else: + attribute_name_to_check = attribute + + if self.server.schema.attribute_types and attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + + if isinstance(value, SEQUENCE_TYPES): # value can't be a sequence + self.last_error = 'value cannot be a sequence' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPInvalidValueError(self.last_error) + + with self.connection_lock: + self._fire_deferred() + request = compare_operation(dn, attribute, value, self.auto_encode, self.server.schema if self.server else None, validator=self.server.custom_validator if self.server else None, check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'COMPARE request <%s> sent via <%s>', compare_request_to_dict(request), self) + response = self.post_send_single_response(self.send('compareRequest', request, controls)) + self._entries = [] + if isinstance(response, int): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async COMPARE response id <%s> received via <%s>', return_value, self) + else: + return_value = True if self.result['type'] == 'compareResponse' and self.result['result'] == RESULT_COMPARE_TRUE else False + if not return_value and self.result['result'] not in [RESULT_COMPARE_TRUE, RESULT_COMPARE_FALSE] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(PROTOCOL): + log(PROTOCOL, 'COMPARE response <%s> received via <%s>', response, self) + + if log_enabled(BASIC): + log(BASIC, 'done COMPARE operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def add(self, + dn, + object_class=None, + attributes=None, + controls=None): + """ + Add dn to the DIT, object_class is None, a class name or a list + of class names. + + Attributes is a dictionary in the form 'attr': 'val' or 'attr': + ['val1', 'val2', ...] for multivalued attributes + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + conf_classes_excluded_from_check = [v.lower() for v in get_config_parameter('CLASSES_EXCLUDED_FROM_CHECK')] + if log_enabled(BASIC): + log(BASIC, 'start ADD operation via <%s>', self) + self.last_error = None + _attributes = deepcopy(attributes) # dict could change when adding objectClass values + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for ADD operation via <%s>', dn, self) + + with self.connection_lock: + self._fire_deferred() + attr_object_class = [] + if object_class is None: + parm_object_class = [] + else: + parm_object_class = list(object_class) if isinstance(object_class, SEQUENCE_TYPES) else [object_class] + + object_class_attr_name = '' + if _attributes: + for attr in _attributes: + if attr.lower() == 'objectclass': + object_class_attr_name = attr + attr_object_class = list(_attributes[object_class_attr_name]) if isinstance(_attributes[object_class_attr_name], SEQUENCE_TYPES) else [_attributes[object_class_attr_name]] + break + else: + _attributes = dict() + + if not object_class_attr_name: + object_class_attr_name = 'objectClass' + + attr_object_class = [to_unicode(object_class) for object_class in attr_object_class] # converts objectclass to unicode in case of bytes value + _attributes[object_class_attr_name] = reduce(lambda x, y: x + [y] if y not in x else x, parm_object_class + attr_object_class, []) # remove duplicate ObjectClasses + + if not _attributes[object_class_attr_name]: + self.last_error = 'objectClass attribute is mandatory' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPObjectClassError(self.last_error) + + if self.server and self.server.schema and self.check_names: + for object_class_name in _attributes[object_class_attr_name]: + if object_class_name.lower() not in conf_classes_excluded_from_check and object_class_name not in self.server.schema.object_classes: + self.last_error = 'invalid object class ' + str(object_class_name) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPObjectClassError(self.last_error) + + for attribute_name in _attributes: + if ';' in attribute_name: # remove tags for checking + attribute_name_to_check = attribute_name.split(';')[0] + else: + attribute_name_to_check = attribute_name + + if attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + + request = add_operation(dn, _attributes, self.auto_encode, self.server.schema if self.server else None, validator=self.server.custom_validator if self.server else None, check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'ADD request <%s> sent via <%s>', add_request_to_dict(request), self) + response = self.post_send_single_response(self.send('addRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async ADD response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'ADD response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'addResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done ADD operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def delete(self, + dn, + controls=None): + """ + Delete the entry identified by the DN from the DIB. + """ + if log_enabled(BASIC): + log(BASIC, 'start DELETE operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for DELETE operation via <%s>', dn, self) + + with self.connection_lock: + self._fire_deferred() + if self.read_only: + self.last_error = 'connection is read-only' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPConnectionIsReadOnlyError(self.last_error) + + request = delete_operation(dn) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'DELETE request <%s> sent via <%s>', delete_request_to_dict(request), self) + response = self.post_send_single_response(self.send('delRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async DELETE response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'DELETE response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'delResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done DELETE operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def modify(self, + dn, + changes, + controls=None): + """ + Modify attributes of entry + + - changes is a dictionary in the form {'attribute1': change), 'attribute2': [change, change, ...], ...} + - change is (operation, [value1, value2, ...]) + - operation is 0 (MODIFY_ADD), 1 (MODIFY_DELETE), 2 (MODIFY_REPLACE), 3 (MODIFY_INCREMENT) + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + + if log_enabled(BASIC): + log(BASIC, 'start MODIFY operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for MODIFY operation via <%s>', dn, self) + + with self.connection_lock: + self._fire_deferred() + if self.read_only: + self.last_error = 'connection is read-only' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPConnectionIsReadOnlyError(self.last_error) + + if not isinstance(changes, dict): + self.last_error = 'changes must be a dictionary' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + + if not changes: + self.last_error = 'no changes in modify request' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + + changelist = dict() + for attribute_name in changes: + if self.server and self.server.schema and self.check_names: + if ';' in attribute_name: # remove tags for checking + attribute_name_to_check = attribute_name.split(';')[0] + else: + attribute_name_to_check = attribute_name + + if self.server.schema.attribute_types and attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + change = changes[attribute_name] + if isinstance(change, SEQUENCE_TYPES) and change[0] in [MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, MODIFY_INCREMENT, 0, 1, 2, 3]: + if len(change) != 2: + self.last_error = 'malformed change' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + + changelist[attribute_name] = [change] # insert change in a list + else: + for change_operation in change: + if len(change_operation) != 2 or change_operation[0] not in [MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, MODIFY_INCREMENT, 0, 1, 2, 3]: + self.last_error = 'invalid change list' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + changelist[attribute_name] = change + request = modify_operation(dn, changelist, self.auto_encode, self.server.schema if self.server else None, validator=self.server.custom_validator if self.server else None, check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY request <%s> sent via <%s>', modify_request_to_dict(request), self) + response = self.post_send_single_response(self.send('modifyRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async MODIFY response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'modifyResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done MODIFY operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def modify_dn(self, + dn, + relative_dn, + delete_old_dn=True, + new_superior=None, + controls=None): + """ + Modify DN of the entry or performs a move of the entry in the + DIT. + """ + if log_enabled(BASIC): + log(BASIC, 'start MODIFY DN operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for MODIFY DN operation via <%s>', dn, self) + relative_dn = safe_dn(relative_dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'relative dn sanitized to <%s> for MODIFY DN operation via <%s>', relative_dn, self) + + with self.connection_lock: + self._fire_deferred() + if self.read_only: + self.last_error = 'connection is read-only' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPConnectionIsReadOnlyError(self.last_error) + + # if new_superior and not dn.startswith(relative_dn): # as per RFC4511 (4.9) + # self.last_error = 'DN cannot change while performing moving' + # if log_enabled(ERROR): + # log(ERROR, '%s for <%s>', self.last_error, self) + # raise LDAPChangeError(self.last_error) + + request = modify_dn_operation(dn, relative_dn, delete_old_dn, new_superior) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY DN request <%s> sent via <%s>', modify_dn_request_to_dict(request), self) + response = self.post_send_single_response(self.send('modDNRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async MODIFY DN response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY DN response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'modDNResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done MODIFY DN operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def abandon(self, + message_id, + controls=None): + """ + Abandon the operation indicated by message_id + """ + if log_enabled(BASIC): + log(BASIC, 'start ABANDON operation via <%s>', self) + self.last_error = None + with self.connection_lock: + self._fire_deferred() + return_value = False + if self.strategy._outstanding or message_id == 0: + # only current operation should be abandoned, abandon, bind and unbind cannot ever be abandoned, + # messagiId 0 is invalid and should be used as a "ping" to keep alive the connection + if (self.strategy._outstanding and message_id in self.strategy._outstanding and self.strategy._outstanding[message_id]['type'] not in ['abandonRequest', 'bindRequest', 'unbindRequest']) or message_id == 0: + request = abandon_operation(message_id) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'ABANDON request: <%s> sent via <%s>', abandon_request_to_dict(request), self) + self.send('abandonRequest', request, controls) + self.result = None + self.response = None + self._entries = [] + return_value = True + else: + if log_enabled(ERROR): + log(ERROR, 'cannot abandon a Bind, an Unbind or an Abandon operation or message ID %s not found via <%s>', str(message_id), self) + + if log_enabled(BASIC): + log(BASIC, 'done ABANDON operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def extended(self, + request_name, + request_value=None, + controls=None, + no_encode=None): + """ + Performs an extended operation + """ + if log_enabled(BASIC): + log(BASIC, 'start EXTENDED operation via <%s>', self) + self.last_error = None + with self.connection_lock: + self._fire_deferred() + request = extended_operation(request_name, request_value, no_encode=no_encode) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'EXTENDED request <%s> sent via <%s>', extended_request_to_dict(request), self) + response = self.post_send_single_response(self.send('extendedReq', request, controls)) + self._entries = [] + if isinstance(response, int): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async EXTENDED response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'EXTENDED response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'extendedResp' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done EXTENDED operation, result <%s>', return_value) + + return self._prepare_return_value(return_value, response=True) + + def start_tls(self, read_server_info=True): # as per RFC4511. Removal of TLS is defined as MAY in RFC4511 so the client can't implement a generic stop_tls method0 + if log_enabled(BASIC): + log(BASIC, 'start START TLS operation via <%s>', self) + + with self.connection_lock: + return_value = False + self.result = None + + if not self.server.tls: + self.server.tls = Tls() + + if self.lazy and not self._executing_deferred: + self._deferred_start_tls = True + self.tls_started = True + return_value = True + if log_enabled(BASIC): + log(BASIC, 'deferring START TLS for <%s>', self) + else: + self._deferred_start_tls = False + if self.closed: + self.open() + if self.server.tls.start_tls(self) and self.strategy.sync: # for asynchronous connections _start_tls is run by the strategy + if read_server_info: + self.refresh_server_info() # refresh server info as per RFC4515 (3.1.5) + return_value = True + elif not self.strategy.sync: + return_value = True + + if log_enabled(BASIC): + log(BASIC, 'done START TLS operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def do_sasl_bind(self, + controls): + if log_enabled(BASIC): + log(BASIC, 'start SASL BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + result = None + + if not self.sasl_in_progress: + self.sasl_in_progress = True + try: + if self.sasl_mechanism == EXTERNAL: + result = sasl_external(self, controls) + elif self.sasl_mechanism == DIGEST_MD5: + result = sasl_digest_md5(self, controls) + elif self.sasl_mechanism == GSSAPI: + from ..protocol.sasl.kerberos import sasl_gssapi # needs the gssapi package + result = sasl_gssapi(self, controls) + elif self.sasl_mechanism == 'PLAIN': + result = sasl_plain(self, controls) + finally: + self.sasl_in_progress = False + + if log_enabled(BASIC): + log(BASIC, 'done SASL BIND operation, result <%s>', result) + + return result + + def do_ntlm_bind(self, + controls): + if log_enabled(BASIC): + log(BASIC, 'start NTLM BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + if not self.sasl_in_progress: + self.sasl_in_progress = True # ntlm is same of sasl authentication + try: + # additional import for NTLM + from ..utils.ntlm import NtlmClient + domain_name, user_name = self.user.split('\\', 1) + ntlm_client = NtlmClient(user_name=user_name, domain=domain_name, password=self.password) + + # as per https://msdn.microsoft.com/en-us/library/cc223501.aspx + # send a sicilyPackageDiscovery request (in the bindRequest) + request = bind_operation(self.version, 'SICILY_PACKAGE_DISCOVERY', ntlm_client) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY PACKAGE DISCOVERY request sent via <%s>', self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + if not self.strategy.sync: + _, result = self.get_response(response) + else: + result = response[0] + if 'server_creds' in result: + sicily_packages = result['server_creds'].decode('ascii').split(';') + if 'NTLM' in sicily_packages: # NTLM available on server + request = bind_operation(self.version, 'SICILY_NEGOTIATE_NTLM', ntlm_client) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY NEGOTIATE request sent via <%s>', self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + if not self.strategy.sync: + _, result = self.get_response(response) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY NEGOTIATE response <%s> received via <%s>', response[0], + self) + result = response[0] + + if result['result'] == RESULT_SUCCESS: + request = bind_operation(self.version, 'SICILY_RESPONSE_NTLM', ntlm_client, + result['server_creds']) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY RESPONSE NTLM request sent via <%s>', self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + if not self.strategy.sync: + _, result = self.get_response(response) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM BIND response <%s> received via <%s>', response[0], self) + result = response[0] + else: + result = None + finally: + self.sasl_in_progress = False + + if log_enabled(BASIC): + log(BASIC, 'done SASL NTLM operation, result <%s>', result) + + return result + + def refresh_server_info(self): + # if self.strategy.no_real_dsa: # do not refresh for mock strategies + # return + + if not self.strategy.pooled: + with self.connection_lock: + if not self.closed: + if log_enabled(BASIC): + log(BASIC, 'refreshing server info for <%s>', self) + previous_response = self.response + previous_result = self.result + previous_entries = self._entries + self.server.get_info_from_server(self) + self.response = previous_response + self.result = previous_result + self._entries = previous_entries + else: + if log_enabled(BASIC): + log(BASIC, 'refreshing server info from pool for <%s>', self) + self.strategy.pool.get_info_from_server() + + def response_to_ldif(self, + search_result=None, + all_base64=False, + line_separator=None, + sort_order=None, + stream=None): + with self.connection_lock: + if search_result is None: + search_result = self.response + + if isinstance(search_result, SEQUENCE_TYPES): + ldif_lines = operation_to_ldif('searchResponse', search_result, all_base64, sort_order=sort_order) + ldif_lines = add_ldif_header(ldif_lines) + line_separator = line_separator or linesep + ldif_output = line_separator.join(ldif_lines) + if stream: + if stream.tell() == 0: + header = add_ldif_header(['-'])[0] + stream.write(prepare_for_stream(header + line_separator + line_separator)) + stream.write(prepare_for_stream(ldif_output + line_separator + line_separator)) + if log_enabled(BASIC): + log(BASIC, 'building LDIF output <%s> for <%s>', ldif_output, self) + return ldif_output + + return None + + def response_to_json(self, + raw=False, + search_result=None, + indent=4, + sort=True, + stream=None, + checked_attributes=True, + include_empty=True): + + with self.connection_lock: + if search_result is None: + search_result = self.response + + if isinstance(search_result, SEQUENCE_TYPES): + json_dict = dict() + json_dict['entries'] = [] + + for response in search_result: + if response['type'] == 'searchResEntry': + entry = dict() + + entry['dn'] = response['dn'] + if checked_attributes: + if not include_empty: + # needed for python 2.6 compatibility + entry['attributes'] = dict((key, response['attributes'][key]) for key in response['attributes'] if response['attributes'][key]) + else: + entry['attributes'] = dict(response['attributes']) + if raw: + if not include_empty: + # needed for python 2.6 compatibility + entry['raw_attributes'] = dict((key, response['raw_attributes'][key]) for key in response['raw_attributes'] if response['raw:attributes'][key]) + else: + entry['raw'] = dict(response['raw_attributes']) + json_dict['entries'].append(entry) + + if str is bytes: # Python 2 + check_json_dict(json_dict) + + json_output = json.dumps(json_dict, ensure_ascii=True, sort_keys=sort, indent=indent, check_circular=True, default=format_json, separators=(',', ': ')) + + if log_enabled(BASIC): + log(BASIC, 'building JSON output <%s> for <%s>', json_output, self) + if stream: + stream.write(json_output) + + return json_output + + def response_to_file(self, + target, + raw=False, + indent=4, + sort=True): + with self.connection_lock: + if self.response: + if isinstance(target, STRING_TYPES): + target = open(target, 'w+') + + if log_enabled(BASIC): + log(BASIC, 'writing response to file for <%s>', self) + + target.writelines(self.response_to_json(raw=raw, indent=indent, sort=sort)) + target.close() + + def _fire_deferred(self, read_info=None): + # if read_info is None reads the schema and server info if not present, if False doesn't read server info, if True reads always server info + with self.connection_lock: + if self.lazy and not self._executing_deferred: + self._executing_deferred = True + + if log_enabled(BASIC): + log(BASIC, 'executing deferred (open: %s, start_tls: %s, bind: %s) for <%s>', self._deferred_open, self._deferred_start_tls, self._deferred_bind, self) + try: + if self._deferred_open: + self.open(read_server_info=False) + if self._deferred_start_tls: + if not self.start_tls(read_server_info=False): + error = 'deferred start_tls not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPStartTLSError(error) + if self._deferred_bind: + self.bind(read_server_info=False, controls=self._bind_controls) + if (read_info is None and (not self.server.info and self.server.get_info in [DSA, ALL]) or (not self.server.schema and self.server.get_info in [SCHEMA, ALL])) or read_info: + self.refresh_server_info() + except LDAPExceptionError as e: + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', e, self) + raise # re-raise LDAPExceptionError + finally: + self._executing_deferred = False + + @property + def entries(self): + if self.response: + if not self._entries: + self._entries = self._get_entries(self.response, self.request) + return self._entries + + def _get_entries(self, search_response, search_request): + with self.connection_lock: + from .. import ObjectDef, Reader + + # build a table of ObjectDefs, grouping the entries found in search_response for their attributes set, subset will be included in superset + attr_sets = [] + for response in search_response: + if response['type'] == 'searchResEntry': + resp_attr_set = set(response['attributes'].keys()) + if resp_attr_set not in attr_sets: + attr_sets.append(resp_attr_set) + attr_sets.sort(key=lambda x: -len(x)) # sorts the list in descending length order + unique_attr_sets = [] + for attr_set in attr_sets: + for unique_set in unique_attr_sets: + if unique_set >= attr_set: # checks if unique set is a superset of attr_set + break + else: # the attr_set is not a subset of any element in unique_attr_sets + unique_attr_sets.append(attr_set) + object_defs = [] + for attr_set in unique_attr_sets: + object_def = ObjectDef(schema=self.server.schema) + object_def += list(attr_set) # converts the set in a list to be added to the object definition + object_defs.append((attr_set, + object_def, + Reader(self, object_def, search_request['base'], search_request['filter'], attributes=attr_set) if self.strategy.sync else Reader(self, object_def, '', '', attributes=attr_set)) + ) # objects_defs contains a tuple with the set, the ObjectDef and a cursor + + entries = [] + for response in search_response: + if response['type'] == 'searchResEntry': + resp_attr_set = set(response['attributes'].keys()) + for object_def in object_defs: + if resp_attr_set <= object_def[0]: # finds the ObjectDef for the attribute set of this entry + entry = object_def[2]._create_entry(response) + entries.append(entry) + break + else: + self.last_error = 'attribute set not found for ' + str(resp_attr_set) + if log_enabled(ERROR): + log(ERROR, self.last_error, self) + raise LDAPObjectError(self.last_error) + + return entries diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/exceptions.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/exceptions.py new file mode 100644 index 0000000..f5d1e86 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/exceptions.py @@ -0,0 +1,608 @@ +""" +""" + +# Created on 2014.05.14 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import sep +from .results import RESULT_OPERATIONS_ERROR, RESULT_PROTOCOL_ERROR, RESULT_TIME_LIMIT_EXCEEDED, RESULT_SIZE_LIMIT_EXCEEDED, \ + RESULT_STRONGER_AUTH_REQUIRED, RESULT_REFERRAL, RESULT_ADMIN_LIMIT_EXCEEDED, RESULT_UNAVAILABLE_CRITICAL_EXTENSION, \ + RESULT_AUTH_METHOD_NOT_SUPPORTED, RESULT_UNDEFINED_ATTRIBUTE_TYPE, RESULT_NO_SUCH_ATTRIBUTE, \ + RESULT_SASL_BIND_IN_PROGRESS, RESULT_CONFIDENTIALITY_REQUIRED, RESULT_INAPPROPRIATE_MATCHING, \ + RESULT_CONSTRAINT_VIOLATION, \ + RESULT_ATTRIBUTE_OR_VALUE_EXISTS, RESULT_INVALID_ATTRIBUTE_SYNTAX, RESULT_NO_SUCH_OBJECT, RESULT_ALIAS_PROBLEM, \ + RESULT_INVALID_DN_SYNTAX, RESULT_ALIAS_DEREFERENCING_PROBLEM, RESULT_INVALID_CREDENTIALS, RESULT_LOOP_DETECTED, \ + RESULT_ENTRY_ALREADY_EXISTS, RESULT_LCUP_SECURITY_VIOLATION, RESULT_CANCELED, RESULT_E_SYNC_REFRESH_REQUIRED, \ + RESULT_NO_SUCH_OPERATION, RESULT_LCUP_INVALID_DATA, RESULT_OBJECT_CLASS_MODS_PROHIBITED, RESULT_NAMING_VIOLATION, \ + RESULT_INSUFFICIENT_ACCESS_RIGHTS, RESULT_OBJECT_CLASS_VIOLATION, RESULT_TOO_LATE, RESULT_CANNOT_CANCEL, \ + RESULT_LCUP_UNSUPPORTED_SCHEME, RESULT_BUSY, RESULT_AFFECT_MULTIPLE_DSAS, RESULT_UNAVAILABLE, \ + RESULT_NOT_ALLOWED_ON_NON_LEAF, \ + RESULT_UNWILLING_TO_PERFORM, RESULT_OTHER, RESULT_LCUP_RELOAD_REQUIRED, RESULT_ASSERTION_FAILED, \ + RESULT_AUTHORIZATION_DENIED, RESULT_LCUP_RESOURCES_EXHAUSTED, RESULT_NOT_ALLOWED_ON_RDN, \ + RESULT_INAPPROPRIATE_AUTHENTICATION +import socket + + +# LDAPException hierarchy +class LDAPException(Exception): + pass + + +class LDAPOperationResult(LDAPException): + def __new__(cls, result=None, description=None, dn=None, message=None, response_type=None, response=None): + if cls is LDAPOperationResult and result and result in exception_table: + exc = super(LDAPOperationResult, exception_table[result]).__new__( + exception_table[result]) # create an exception of the required result error + exc.result = result + exc.description = description + exc.dn = dn + exc.message = message + exc.type = response_type + exc.response = response + else: + exc = super(LDAPOperationResult, cls).__new__(cls) + return exc + + def __init__(self, result=None, description=None, dn=None, message=None, response_type=None, response=None): + self.result = result + self.description = description + self.dn = dn + self.message = message + self.type = response_type + self.response = response + + def __str__(self): + s = [self.__class__.__name__, + str(self.result) if self.result else None, + self.description if self.description else None, + self.dn if self.dn else None, + self.message if self.message else None, + self.type if self.type else None, + self.response if self.response else None] + + return ' - '.join([str(item) for item in s if s is not None]) + + def __repr__(self): + return self.__str__() + + +class LDAPOperationsErrorResult(LDAPOperationResult): + pass + + +class LDAPProtocolErrorResult(LDAPOperationResult): + pass + + +class LDAPTimeLimitExceededResult(LDAPOperationResult): + pass + + +class LDAPSizeLimitExceededResult(LDAPOperationResult): + pass + + +class LDAPAuthMethodNotSupportedResult(LDAPOperationResult): + pass + + +class LDAPStrongerAuthRequiredResult(LDAPOperationResult): + pass + + +class LDAPReferralResult(LDAPOperationResult): + pass + + +class LDAPAdminLimitExceededResult(LDAPOperationResult): + pass + + +class LDAPUnavailableCriticalExtensionResult(LDAPOperationResult): + pass + + +class LDAPConfidentialityRequiredResult(LDAPOperationResult): + pass + + +class LDAPSASLBindInProgressResult(LDAPOperationResult): + pass + + +class LDAPNoSuchAttributeResult(LDAPOperationResult): + pass + + +class LDAPUndefinedAttributeTypeResult(LDAPOperationResult): + pass + + +class LDAPInappropriateMatchingResult(LDAPOperationResult): + pass + + +class LDAPConstraintViolationResult(LDAPOperationResult): + pass + + +class LDAPAttributeOrValueExistsResult(LDAPOperationResult): + pass + + +class LDAPInvalidAttributeSyntaxResult(LDAPOperationResult): + pass + + +class LDAPNoSuchObjectResult(LDAPOperationResult): + pass + + +class LDAPAliasProblemResult(LDAPOperationResult): + pass + + +class LDAPInvalidDNSyntaxResult(LDAPOperationResult): + pass + + +class LDAPAliasDereferencingProblemResult(LDAPOperationResult): + pass + + +class LDAPInappropriateAuthenticationResult(LDAPOperationResult): + pass + + +class LDAPInvalidCredentialsResult(LDAPOperationResult): + pass + + +class LDAPInsufficientAccessRightsResult(LDAPOperationResult): + pass + + +class LDAPBusyResult(LDAPOperationResult): + pass + + +class LDAPUnavailableResult(LDAPOperationResult): + pass + + +class LDAPUnwillingToPerformResult(LDAPOperationResult): + pass + + +class LDAPLoopDetectedResult(LDAPOperationResult): + pass + + +class LDAPNamingViolationResult(LDAPOperationResult): + pass + + +class LDAPObjectClassViolationResult(LDAPOperationResult): + pass + + +class LDAPNotAllowedOnNotLeafResult(LDAPOperationResult): + pass + + +class LDAPNotAllowedOnRDNResult(LDAPOperationResult): + pass + + +class LDAPEntryAlreadyExistsResult(LDAPOperationResult): + pass + + +class LDAPObjectClassModsProhibitedResult(LDAPOperationResult): + pass + + +class LDAPAffectMultipleDSASResult(LDAPOperationResult): + pass + + +class LDAPOtherResult(LDAPOperationResult): + pass + + +class LDAPLCUPResourcesExhaustedResult(LDAPOperationResult): + pass + + +class LDAPLCUPSecurityViolationResult(LDAPOperationResult): + pass + + +class LDAPLCUPInvalidDataResult(LDAPOperationResult): + pass + + +class LDAPLCUPUnsupportedSchemeResult(LDAPOperationResult): + pass + + +class LDAPLCUPReloadRequiredResult(LDAPOperationResult): + pass + + +class LDAPCanceledResult(LDAPOperationResult): + pass + + +class LDAPNoSuchOperationResult(LDAPOperationResult): + pass + + +class LDAPTooLateResult(LDAPOperationResult): + pass + + +class LDAPCannotCancelResult(LDAPOperationResult): + pass + + +class LDAPAssertionFailedResult(LDAPOperationResult): + pass + + +class LDAPAuthorizationDeniedResult(LDAPOperationResult): + pass + + +class LDAPESyncRefreshRequiredResult(LDAPOperationResult): + pass + + +exception_table = {RESULT_OPERATIONS_ERROR: LDAPOperationsErrorResult, + RESULT_PROTOCOL_ERROR: LDAPProtocolErrorResult, + RESULT_TIME_LIMIT_EXCEEDED: LDAPTimeLimitExceededResult, + RESULT_SIZE_LIMIT_EXCEEDED: LDAPSizeLimitExceededResult, + RESULT_AUTH_METHOD_NOT_SUPPORTED: LDAPAuthMethodNotSupportedResult, + RESULT_STRONGER_AUTH_REQUIRED: LDAPStrongerAuthRequiredResult, + RESULT_REFERRAL: LDAPReferralResult, + RESULT_ADMIN_LIMIT_EXCEEDED: LDAPAdminLimitExceededResult, + RESULT_UNAVAILABLE_CRITICAL_EXTENSION: LDAPUnavailableCriticalExtensionResult, + RESULT_CONFIDENTIALITY_REQUIRED: LDAPConfidentialityRequiredResult, + RESULT_SASL_BIND_IN_PROGRESS: LDAPSASLBindInProgressResult, + RESULT_NO_SUCH_ATTRIBUTE: LDAPNoSuchAttributeResult, + RESULT_UNDEFINED_ATTRIBUTE_TYPE: LDAPUndefinedAttributeTypeResult, + RESULT_INAPPROPRIATE_MATCHING: LDAPInappropriateMatchingResult, + RESULT_CONSTRAINT_VIOLATION: LDAPConstraintViolationResult, + RESULT_ATTRIBUTE_OR_VALUE_EXISTS: LDAPAttributeOrValueExistsResult, + RESULT_INVALID_ATTRIBUTE_SYNTAX: LDAPInvalidAttributeSyntaxResult, + RESULT_NO_SUCH_OBJECT: LDAPNoSuchObjectResult, + RESULT_ALIAS_PROBLEM: LDAPAliasProblemResult, + RESULT_INVALID_DN_SYNTAX: LDAPInvalidDNSyntaxResult, + RESULT_ALIAS_DEREFERENCING_PROBLEM: LDAPAliasDereferencingProblemResult, + RESULT_INAPPROPRIATE_AUTHENTICATION: LDAPInappropriateAuthenticationResult, + RESULT_INVALID_CREDENTIALS: LDAPInvalidCredentialsResult, + RESULT_INSUFFICIENT_ACCESS_RIGHTS: LDAPInsufficientAccessRightsResult, + RESULT_BUSY: LDAPBusyResult, + RESULT_UNAVAILABLE: LDAPUnavailableResult, + RESULT_UNWILLING_TO_PERFORM: LDAPUnwillingToPerformResult, + RESULT_LOOP_DETECTED: LDAPLoopDetectedResult, + RESULT_NAMING_VIOLATION: LDAPNamingViolationResult, + RESULT_OBJECT_CLASS_VIOLATION: LDAPObjectClassViolationResult, + RESULT_NOT_ALLOWED_ON_NON_LEAF: LDAPNotAllowedOnNotLeafResult, + RESULT_NOT_ALLOWED_ON_RDN: LDAPNotAllowedOnRDNResult, + RESULT_ENTRY_ALREADY_EXISTS: LDAPEntryAlreadyExistsResult, + RESULT_OBJECT_CLASS_MODS_PROHIBITED: LDAPObjectClassModsProhibitedResult, + RESULT_AFFECT_MULTIPLE_DSAS: LDAPAffectMultipleDSASResult, + RESULT_OTHER: LDAPOtherResult, + RESULT_LCUP_RESOURCES_EXHAUSTED: LDAPLCUPResourcesExhaustedResult, + RESULT_LCUP_SECURITY_VIOLATION: LDAPLCUPSecurityViolationResult, + RESULT_LCUP_INVALID_DATA: LDAPLCUPInvalidDataResult, + RESULT_LCUP_UNSUPPORTED_SCHEME: LDAPLCUPUnsupportedSchemeResult, + RESULT_LCUP_RELOAD_REQUIRED: LDAPLCUPReloadRequiredResult, + RESULT_CANCELED: LDAPCanceledResult, + RESULT_NO_SUCH_OPERATION: LDAPNoSuchOperationResult, + RESULT_TOO_LATE: LDAPTooLateResult, + RESULT_CANNOT_CANCEL: LDAPCannotCancelResult, + RESULT_ASSERTION_FAILED: LDAPAssertionFailedResult, + RESULT_AUTHORIZATION_DENIED: LDAPAuthorizationDeniedResult, + RESULT_E_SYNC_REFRESH_REQUIRED: LDAPESyncRefreshRequiredResult} + + +class LDAPExceptionError(LDAPException): + pass + + +# configuration exceptions +class LDAPConfigurationError(LDAPExceptionError): + pass + + +class LDAPUnknownStrategyError(LDAPConfigurationError): + pass + + +class LDAPUnknownAuthenticationMethodError(LDAPConfigurationError): + pass + + +class LDAPSSLConfigurationError(LDAPConfigurationError): + pass + + +class LDAPDefinitionError(LDAPConfigurationError): + pass + + +class LDAPPackageUnavailableError(LDAPConfigurationError, ImportError): + pass + + +class LDAPConfigurationParameterError(LDAPConfigurationError): + pass + + +# abstract layer exceptions +class LDAPKeyError(LDAPExceptionError, KeyError, AttributeError): + pass + + +class LDAPObjectError(LDAPExceptionError, ValueError): + pass + + +class LDAPAttributeError(LDAPExceptionError, ValueError, TypeError): + pass + + +class LDAPCursorError(LDAPExceptionError): + pass + + +class LDAPCursorAttributeError(LDAPCursorError, AttributeError): + pass + + +class LDAPObjectDereferenceError(LDAPExceptionError): + pass + + +# security exceptions +class LDAPSSLNotSupportedError(LDAPExceptionError, ImportError): + pass + + +class LDAPInvalidTlsSpecificationError(LDAPExceptionError): + pass + + +class LDAPInvalidHashAlgorithmError(LDAPExceptionError, ValueError): + pass + +class LDAPSignatureVerificationFailedError(LDAPExceptionError): + pass + + +# connection exceptions +class LDAPBindError(LDAPExceptionError): + pass + + +class LDAPInvalidServerError(LDAPExceptionError): + pass + + +class LDAPSASLMechanismNotSupportedError(LDAPExceptionError): + pass + + +class LDAPConnectionIsReadOnlyError(LDAPExceptionError): + pass + + +class LDAPChangeError(LDAPExceptionError, ValueError): + pass + + +class LDAPServerPoolError(LDAPExceptionError): + pass + + +class LDAPServerPoolExhaustedError(LDAPExceptionError): + pass + + +class LDAPInvalidPortError(LDAPExceptionError): + pass + + +class LDAPStartTLSError(LDAPExceptionError): + pass + + +class LDAPCertificateError(LDAPExceptionError): + pass + + +class LDAPUserNameNotAllowedError(LDAPExceptionError): + pass + + +class LDAPUserNameIsMandatoryError(LDAPExceptionError): + pass + + +class LDAPPasswordIsMandatoryError(LDAPExceptionError): + pass + + +class LDAPInvalidFilterError(LDAPExceptionError): + pass + + +class LDAPInvalidScopeError(LDAPExceptionError, ValueError): + pass + + +class LDAPInvalidDereferenceAliasesError(LDAPExceptionError, ValueError): + pass + + +class LDAPInvalidValueError(LDAPExceptionError, ValueError): + pass + + +class LDAPControlError(LDAPExceptionError, ValueError): + pass + + +class LDAPExtensionError(LDAPExceptionError, ValueError): + pass + + +class LDAPLDIFError(LDAPExceptionError): + pass + + +class LDAPSchemaError(LDAPExceptionError): + pass + + +class LDAPSASLPrepError(LDAPExceptionError): + pass + + +class LDAPSASLBindInProgressError(LDAPExceptionError): + pass + + +class LDAPMetricsError(LDAPExceptionError): + pass + + +class LDAPObjectClassError(LDAPExceptionError): + pass + + +class LDAPInvalidDnError(LDAPExceptionError): + pass + + +class LDAPResponseTimeoutError(LDAPExceptionError): + pass + + +class LDAPTransactionError(LDAPExceptionError): + pass + + +class LDAPInfoError(LDAPExceptionError): + pass + + +# communication exceptions +class LDAPCommunicationError(LDAPExceptionError): + pass + + +class LDAPSocketOpenError(LDAPCommunicationError): + pass + + +class LDAPSocketCloseError(LDAPCommunicationError): + pass + + +class LDAPSocketReceiveError(LDAPCommunicationError, socket.error): + pass + + +class LDAPSocketSendError(LDAPCommunicationError, socket.error): + pass + + +class LDAPSessionTerminatedByServerError(LDAPCommunicationError): + pass + + +class LDAPUnknownResponseError(LDAPCommunicationError): + pass + + +class LDAPUnknownRequestError(LDAPCommunicationError): + pass + + +class LDAPReferralError(LDAPCommunicationError): + pass + + +# pooling exceptions +class LDAPConnectionPoolNameIsMandatoryError(LDAPExceptionError): + pass + + +class LDAPConnectionPoolNotStartedError(LDAPExceptionError): + pass + + +# restartable strategy +class LDAPMaximumRetriesError(LDAPExceptionError): + def __str__(self): + s = [] + if self.args: + if isinstance(self.args, tuple): + if len(self.args) > 0: + s.append('LDAPMaximumRetriesError: ' + str(self.args[0])) + if len(self.args) > 1: + s.append('Exception history:') + prev_exc = '' + for i, exc in enumerate(self.args[1]): # args[1] contains exception history + # if str(exc[1]) != prev_exc: + # s.append((str(i).rjust(5) + ' ' + str(exc[0]) + ': ' + str(exc[1]) + ' - ' + str(exc[2]))) + # prev_exc = str(exc[1]) + if str(exc) != prev_exc: + s.append((str(i).rjust(5) + ' ' + str(type(exc)) + ': ' + str(exc))) + prev_exc = str(exc) + if len(self.args) > 2: + s.append('Maximum number of retries reached: ' + str(self.args[2])) + else: + s = [LDAPExceptionError.__str__(self)] + + return sep.join(s) + + +# exception factories +def communication_exception_factory(exc_to_raise, exc): + """ + Generates a new exception class of the requested type (subclass of LDAPCommunication) merged with the exception raised by the interpreter + """ + if exc_to_raise.__name__ in [cls.__name__ for cls in LDAPCommunicationError.__subclasses__()]: + return type(exc_to_raise.__name__, (exc_to_raise, type(exc)), dict()) + else: + raise LDAPExceptionError('unable to generate exception type ' + str(exc_to_raise)) + + +def start_tls_exception_factory(exc): + """ + Generates a new exception class of the requested type merged with the exception raised by the interpreter + """ + return type(LDAPStartTLSError.__name__, (LDAPStartTLSError, type(exc)), dict()) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/pooling.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/pooling.py new file mode 100644 index 0000000..24a5b0f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/pooling.py @@ -0,0 +1,329 @@ +""" +""" + +# Created on 2014.03.14 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime, MINYEAR +from os import linesep +from random import randint +from time import sleep + +from .. import FIRST, ROUND_ROBIN, RANDOM, SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from .exceptions import LDAPUnknownStrategyError, LDAPServerPoolError, LDAPServerPoolExhaustedError +from .server import Server +from ..utils.log import log, log_enabled, ERROR, BASIC, NETWORK + +POOLING_STRATEGIES = [FIRST, ROUND_ROBIN, RANDOM] + + +class ServerState(object): + def __init__(self, server, last_checked_time, available): + self.server = server + self.last_checked_time = last_checked_time + self.available = available + + +class ServerPoolState(object): + def __init__(self, server_pool): + self.server_states = [] # each element is a ServerState + self.strategy = server_pool.strategy + self.server_pool = server_pool + self.last_used_server = 0 + self.refresh() + self.initialize_time = datetime.now() + + if log_enabled(BASIC): + log(BASIC, 'instantiated ServerPoolState: <%r>', self) + + def __str__(self): + s = 'servers: ' + linesep + if self.server_states: + for state in self.server_states: + s += str(state.server) + linesep + else: + s += 'None' + linesep + s += 'Pool strategy: ' + str(self.strategy) + linesep + s += ' - Last used server: ' + ('None' if self.last_used_server == -1 else str(self.server_states[self.last_used_server].server)) + + return s + + def refresh(self): + self.server_states = [] + for server in self.server_pool.servers: + self.server_states.append(ServerState(server, datetime(MINYEAR, 1, 1), True)) # server, smallest date ever, supposed available + self.last_used_server = randint(0, len(self.server_states) - 1) + + def get_current_server(self): + return self.server_states[self.last_used_server].server + + def get_server(self): + if self.server_states: + if self.server_pool.strategy == FIRST: + if self.server_pool.active: + # returns the first active server + self.last_used_server = self.find_active_server(starting=0) + else: + # returns always the first server - no pooling + self.last_used_server = 0 + elif self.server_pool.strategy == ROUND_ROBIN: + if self.server_pool.active: + # returns the next active server in a circular range + self.last_used_server = self.find_active_server(self.last_used_server + 1) + else: + # returns the next server in a circular range + self.last_used_server = self.last_used_server + 1 if (self.last_used_server + 1) < len(self.server_states) else 0 + elif self.server_pool.strategy == RANDOM: + if self.server_pool.active: + self.last_used_server = self.find_active_random_server() + else: + # returns a random server in the pool + self.last_used_server = randint(0, len(self.server_states) - 1) + else: + if log_enabled(ERROR): + log(ERROR, 'unknown server pooling strategy <%s>', self.server_pool.strategy) + raise LDAPUnknownStrategyError('unknown server pooling strategy') + if log_enabled(BASIC): + log(BASIC, 'server returned from Server Pool: <%s>', self.last_used_server) + return self.server_states[self.last_used_server].server + else: + if log_enabled(ERROR): + log(ERROR, 'no servers in Server Pool <%s>', self) + raise LDAPServerPoolError('no servers in server pool') + + def find_active_random_server(self): + counter = self.server_pool.active # can be True for "forever" or the number of cycles to try + while counter: + if log_enabled(NETWORK): + log(NETWORK, 'entering loop for finding active server in pool <%s>', self) + temp_list = self.server_states[:] # copy + while temp_list: + # pops a random server from a temp list and checks its + # availability, if not available tries another one + server_state = temp_list.pop(randint(0, len(temp_list) - 1)) + if not server_state.available: # server is offline + if (isinstance(self.server_pool.exhaust, bool) and self.server_pool.exhaust) or (datetime.now() - server_state.last_checked_time).seconds < self.server_pool.exhaust: # keeps server offline + if log_enabled(NETWORK): + log(NETWORK, 'server <%s> excluded from checking because it is offline', server_state.server) + continue + if log_enabled(NETWORK): + log(NETWORK, 'server <%s> reinserted in pool', server_state.server) + server_state.last_checked_time = datetime.now() + if log_enabled(NETWORK): + log(NETWORK, 'checking server <%s> for availability', server_state.server) + if server_state.server.check_availability(): + # returns a random active server in the pool + server_state.available = True + return self.server_states.index(server_state) + else: + server_state.available = False + if not isinstance(self.server_pool.active, bool): + counter -= 1 + if log_enabled(ERROR): + log(ERROR, 'no random active server available in Server Pool <%s> after maximum number of tries', self) + raise LDAPServerPoolExhaustedError('no random active server available in server pool after maximum number of tries') + + def find_active_server(self, starting): + conf_pool_timeout = get_config_parameter('POOLING_LOOP_TIMEOUT') + counter = self.server_pool.active # can be True for "forever" or the number of cycles to try + if starting >= len(self.server_states): + starting = 0 + + while counter: + if log_enabled(NETWORK): + log(NETWORK, 'entering loop number <%s> for finding active server in pool <%s>', counter, self) + index = -1 + pool_size = len(self.server_states) + while index < pool_size - 1: + index += 1 + offset = index + starting if index + starting < pool_size else index + starting - pool_size + server_state = self.server_states[offset] + if not server_state.available: # server is offline + if (isinstance(self.server_pool.exhaust, bool) and self.server_pool.exhaust) or (datetime.now() - server_state.last_checked_time).seconds < self.server_pool.exhaust: # keeps server offline + if log_enabled(NETWORK): + if isinstance(self.server_pool.exhaust, bool): + log(NETWORK, 'server <%s> excluded from checking because is offline', server_state.server) + else: + log(NETWORK, 'server <%s> excluded from checking because is offline for %d seconds', server_state.server, (self.server_pool.exhaust - (datetime.now() - server_state.last_checked_time).seconds)) + continue + if log_enabled(NETWORK): + log(NETWORK, 'server <%s> reinserted in pool', server_state.server) + server_state.last_checked_time = datetime.now() + if log_enabled(NETWORK): + log(NETWORK, 'checking server <%s> for availability', server_state.server) + if server_state.server.check_availability(): + server_state.available = True + return offset + else: + server_state.available = False # sets server offline + + if not isinstance(self.server_pool.active, bool): + counter -= 1 + if log_enabled(NETWORK): + log(NETWORK, 'waiting for %d seconds before retrying pool servers cycle', conf_pool_timeout) + sleep(conf_pool_timeout) + + if log_enabled(ERROR): + log(ERROR, 'no active server available in Server Pool <%s> after maximum number of tries', self) + raise LDAPServerPoolExhaustedError('no active server available in server pool after maximum number of tries') + + def __len__(self): + return len(self.server_states) + + +class ServerPool(object): + def __init__(self, + servers=None, + pool_strategy=ROUND_ROBIN, + active=True, + exhaust=False, + single_state=True): + + if pool_strategy not in POOLING_STRATEGIES: + if log_enabled(ERROR): + log(ERROR, 'unknown pooling strategy <%s>', pool_strategy) + raise LDAPUnknownStrategyError('unknown pooling strategy') + if exhaust and not active: + if log_enabled(ERROR): + log(ERROR, 'cannot instantiate pool with exhaust and not active') + raise LDAPServerPoolError('pools can be exhausted only when checking for active servers') + self.servers = [] + self.pool_states = dict() + self.active = active + self.exhaust = exhaust + self.single = single_state + self._pool_state = None # used for storing the global state of the pool + if isinstance(servers, SEQUENCE_TYPES + (Server, )): + self.add(servers) + elif isinstance(servers, STRING_TYPES): + self.add(Server(servers)) + self.strategy = pool_strategy + + if log_enabled(BASIC): + log(BASIC, 'instantiated ServerPool: <%r>', self) + + def __str__(self): + s = 'servers: ' + linesep + if self.servers: + for server in self.servers: + s += str(server) + linesep + else: + s += 'None' + linesep + s += 'Pool strategy: ' + str(self.strategy) + s += ' - ' + 'active: ' + (str(self.active) if self.active else 'False') + s += ' - ' + 'exhaust pool: ' + (str(self.exhaust) if self.exhaust else 'False') + return s + + def __repr__(self): + r = 'ServerPool(servers=' + if self.servers: + r += '[' + for server in self.servers: + r += server.__repr__() + ', ' + r = r[:-2] + ']' + else: + r += 'None' + r += ', pool_strategy={0.strategy!r}'.format(self) + r += ', active={0.active!r}'.format(self) + r += ', exhaust={0.exhaust!r}'.format(self) + r += ')' + + return r + + def __len__(self): + return len(self.servers) + + def __getitem__(self, item): + return self.servers[item] + + def __iter__(self): + return self.servers.__iter__() + + def add(self, servers): + if isinstance(servers, Server): + if servers not in self.servers: + self.servers.append(servers) + elif isinstance(servers, STRING_TYPES): + self.servers.append(Server(servers)) + elif isinstance(servers, SEQUENCE_TYPES): + for server in servers: + if isinstance(server, Server): + self.servers.append(server) + elif isinstance(server, STRING_TYPES): + self.servers.append(Server(server)) + else: + if log_enabled(ERROR): + log(ERROR, 'element must be a server in Server Pool <%s>', self) + raise LDAPServerPoolError('server in ServerPool must be a Server') + else: + if log_enabled(ERROR): + log(ERROR, 'server must be a Server of a list of Servers when adding to Server Pool <%s>', self) + raise LDAPServerPoolError('server must be a Server or a list of Server') + + if self.single: + if self._pool_state: + self._pool_state.refresh() + else: + for connection in self.pool_states: + # notifies connections using this pool to refresh + self.pool_states[connection].refresh() + + def remove(self, server): + if server in self.servers: + self.servers.remove(server) + else: + if log_enabled(ERROR): + log(ERROR, 'server %s to be removed not in Server Pool <%s>', server, self) + raise LDAPServerPoolError('server not in server pool') + + if self.single: + if self._pool_state: + self._pool_state.refresh() + else: + for connection in self.pool_states: + # notifies connections using this pool to refresh + self.pool_states[connection].refresh() + + def initialize(self, connection): + # registers pool_state in ServerPool object + if self.single: + if not self._pool_state: + self._pool_state = ServerPoolState(self) + self.pool_states[connection] = self._pool_state + else: + self.pool_states[connection] = ServerPoolState(self) + + def get_server(self, connection): + if connection in self.pool_states: + return self.pool_states[connection].get_server() + else: + if log_enabled(ERROR): + log(ERROR, 'connection <%s> not in Server Pool State <%s>', connection, self) + raise LDAPServerPoolError('connection not in ServerPoolState') + + def get_current_server(self, connection): + if connection in self.pool_states: + return self.pool_states[connection].get_current_server() + else: + if log_enabled(ERROR): + log(ERROR, 'connection <%s> not in Server Pool State <%s>', connection, self) + raise LDAPServerPoolError('connection not in ServerPoolState') diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/rdns.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/rdns.py new file mode 100644 index 0000000..b3bbe6a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/rdns.py @@ -0,0 +1,68 @@ +""" Utilities and constants related to reverse dns lookup """ + +# Created on 2020.09.16 +# +# Author: Azaria Zornberg +# +# Copyright 2020 Giovanni Cannata +# Copyright 2020 Azaria Zornberg +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket + + +class ReverseDnsSetting(object): + OFF = 0, + REQUIRE_RESOLVE_ALL_ADDRESSES = 1, + REQUIRE_RESOLVE_IP_ADDRESSES_ONLY = 2, + OPTIONAL_RESOLVE_ALL_ADDRESSES = 3, + OPTIONAL_RESOLVE_IP_ADDRESSES_ONLY = 4, + SUPPORTED_VALUES = {OFF, REQUIRE_RESOLVE_ALL_ADDRESSES, REQUIRE_RESOLVE_IP_ADDRESSES_ONLY, + OPTIONAL_RESOLVE_ALL_ADDRESSES, OPTIONAL_RESOLVE_IP_ADDRESSES_ONLY} + + +def get_hostname_by_addr(addr, success_required=True): + """ Resolve the hostname for an ip address. If success is required, raise an exception if a hostname cannot + be resolved for the address. + Returns the hostname resolved for the address. + If success is not required, returns None for addresses that do not resolve to hostnames. + """ + try: + return socket.gethostbyaddr(addr)[0] + except Exception as ex: + # if we need to succeed, just re-raise + if success_required: + raise + return None + + +def is_ip_addr(addr): + """Returns True if an address is an ipv4 address or an ipv6 address based on format. False otherwise.""" + for addr_type in [socket.AF_INET, socket.AF_INET6]: + try: + socket.inet_pton(addr_type, addr) # not present on python 2.7 on Windows + return True + except AttributeError: # not present on Windows, always valid + if '.' in addr and any([c.isalpha() for c in addr.replace('.', '')]): # not an IPv4 address, probably an hostname + return False + else: # do not check for ipv6 + return True + except OSError: + pass + + return False diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/results.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/results.py new file mode 100644 index 0000000..14f8f73 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/results.py @@ -0,0 +1,137 @@ +""" +""" + +# Created on 2016.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +# result codes +RESULT_SUCCESS = 0 +RESULT_OPERATIONS_ERROR = 1 +RESULT_PROTOCOL_ERROR = 2 +RESULT_TIME_LIMIT_EXCEEDED = 3 +RESULT_SIZE_LIMIT_EXCEEDED = 4 +RESULT_COMPARE_FALSE = 5 +RESULT_COMPARE_TRUE = 6 +RESULT_AUTH_METHOD_NOT_SUPPORTED = 7 +RESULT_STRONGER_AUTH_REQUIRED = 8 +RESULT_RESERVED = 9 +RESULT_REFERRAL = 10 +RESULT_ADMIN_LIMIT_EXCEEDED = 11 +RESULT_UNAVAILABLE_CRITICAL_EXTENSION = 12 +RESULT_CONFIDENTIALITY_REQUIRED = 13 +RESULT_SASL_BIND_IN_PROGRESS = 14 +RESULT_NO_SUCH_ATTRIBUTE = 16 +RESULT_UNDEFINED_ATTRIBUTE_TYPE = 17 +RESULT_INAPPROPRIATE_MATCHING = 18 +RESULT_CONSTRAINT_VIOLATION = 19 +RESULT_ATTRIBUTE_OR_VALUE_EXISTS = 20 +RESULT_INVALID_ATTRIBUTE_SYNTAX = 21 +RESULT_NO_SUCH_OBJECT = 32 +RESULT_ALIAS_PROBLEM = 33 +RESULT_INVALID_DN_SYNTAX = 34 +RESULT_ALIAS_DEREFERENCING_PROBLEM = 36 +RESULT_INAPPROPRIATE_AUTHENTICATION = 48 +RESULT_INVALID_CREDENTIALS = 49 +RESULT_INSUFFICIENT_ACCESS_RIGHTS = 50 +RESULT_BUSY = 51 +RESULT_UNAVAILABLE = 52 +RESULT_UNWILLING_TO_PERFORM = 53 +RESULT_LOOP_DETECTED = 54 +RESULT_NAMING_VIOLATION = 64 +RESULT_OBJECT_CLASS_VIOLATION = 65 +RESULT_NOT_ALLOWED_ON_NON_LEAF = 66 +RESULT_NOT_ALLOWED_ON_RDN = 67 +RESULT_ENTRY_ALREADY_EXISTS = 68 +RESULT_OBJECT_CLASS_MODS_PROHIBITED = 69 +RESULT_AFFECT_MULTIPLE_DSAS = 71 +RESULT_OTHER = 80 +RESULT_LCUP_RESOURCES_EXHAUSTED = 113 +RESULT_LCUP_SECURITY_VIOLATION = 114 +RESULT_LCUP_INVALID_DATA = 115 +RESULT_LCUP_UNSUPPORTED_SCHEME = 116 +RESULT_LCUP_RELOAD_REQUIRED = 117 +RESULT_CANCELED = 118 +RESULT_NO_SUCH_OPERATION = 119 +RESULT_TOO_LATE = 120 +RESULT_CANNOT_CANCEL = 121 +RESULT_ASSERTION_FAILED = 122 +RESULT_AUTHORIZATION_DENIED = 123 +RESULT_E_SYNC_REFRESH_REQUIRED = 4096 + +RESULT_CODES = { + RESULT_SUCCESS: 'success', + RESULT_OPERATIONS_ERROR: 'operationsError', + RESULT_PROTOCOL_ERROR: 'protocolError', + RESULT_TIME_LIMIT_EXCEEDED: 'timeLimitExceeded', + RESULT_SIZE_LIMIT_EXCEEDED: 'sizeLimitExceeded', + RESULT_COMPARE_FALSE: 'compareFalse', + RESULT_COMPARE_TRUE: 'compareTrue', + RESULT_AUTH_METHOD_NOT_SUPPORTED: 'authMethodNotSupported', + RESULT_RESERVED: 'reserved', + RESULT_STRONGER_AUTH_REQUIRED: 'strongerAuthRequired', + RESULT_REFERRAL: 'referral', + RESULT_ADMIN_LIMIT_EXCEEDED: 'adminLimitExceeded', + RESULT_UNAVAILABLE_CRITICAL_EXTENSION: 'unavailableCriticalExtension', + RESULT_CONFIDENTIALITY_REQUIRED: 'confidentialityRequired', + RESULT_SASL_BIND_IN_PROGRESS: 'saslBindInProgress', + RESULT_NO_SUCH_ATTRIBUTE: 'noSuchAttribute', + RESULT_UNDEFINED_ATTRIBUTE_TYPE: 'undefinedAttributeType', + RESULT_INAPPROPRIATE_MATCHING: 'inappropriateMatching', + RESULT_CONSTRAINT_VIOLATION: 'constraintViolation', + RESULT_ATTRIBUTE_OR_VALUE_EXISTS: 'attributeOrValueExists', + RESULT_INVALID_ATTRIBUTE_SYNTAX: 'invalidAttributeSyntax', + RESULT_NO_SUCH_OBJECT: 'noSuchObject', + RESULT_ALIAS_PROBLEM: 'aliasProblem', + RESULT_INVALID_DN_SYNTAX: 'invalidDNSyntax', + RESULT_ALIAS_DEREFERENCING_PROBLEM: 'aliasDereferencingProblem', + RESULT_INAPPROPRIATE_AUTHENTICATION: 'inappropriateAuthentication', + RESULT_INVALID_CREDENTIALS: 'invalidCredentials', + RESULT_INSUFFICIENT_ACCESS_RIGHTS: 'insufficientAccessRights', + RESULT_BUSY: 'busy', + RESULT_UNAVAILABLE: 'unavailable', + RESULT_UNWILLING_TO_PERFORM: 'unwillingToPerform', + RESULT_LOOP_DETECTED: 'loopDetected', + RESULT_NAMING_VIOLATION: 'namingViolation', + RESULT_OBJECT_CLASS_VIOLATION: 'objectClassViolation', + RESULT_NOT_ALLOWED_ON_NON_LEAF: 'notAllowedOnNonLeaf', + RESULT_NOT_ALLOWED_ON_RDN: 'notAllowedOnRDN', + RESULT_ENTRY_ALREADY_EXISTS: 'entryAlreadyExists', + RESULT_OBJECT_CLASS_MODS_PROHIBITED: 'objectClassModsProhibited', + RESULT_AFFECT_MULTIPLE_DSAS: 'affectMultipleDSAs', + RESULT_OTHER: 'other', + RESULT_LCUP_RESOURCES_EXHAUSTED: 'lcupResourcesExhausted', + RESULT_LCUP_SECURITY_VIOLATION: 'lcupSecurityViolation', + RESULT_LCUP_INVALID_DATA: 'lcupInvalidData', + RESULT_LCUP_UNSUPPORTED_SCHEME: 'lcupUnsupportedScheme', + RESULT_LCUP_RELOAD_REQUIRED: 'lcupReloadRequired', + RESULT_CANCELED: 'canceled', + RESULT_NO_SUCH_OPERATION: 'noSuchOperation', + RESULT_TOO_LATE: 'tooLate', + RESULT_CANNOT_CANCEL: 'cannotCancel', + RESULT_ASSERTION_FAILED: 'assertionFailed', + RESULT_AUTHORIZATION_DENIED: 'authorizationDenied', + RESULT_E_SYNC_REFRESH_REQUIRED: 'e-syncRefreshRequired' +} + +# do not raise exception for (in raise_exceptions connection mode) +DO_NOT_RAISE_EXCEPTIONS = [RESULT_SUCCESS, RESULT_COMPARE_FALSE, RESULT_COMPARE_TRUE, RESULT_REFERRAL, RESULT_SASL_BIND_IN_PROGRESS, RESULT_SIZE_LIMIT_EXCEEDED, RESULT_TIME_LIMIT_EXCEEDED] diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/server.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/server.py new file mode 100644 index 0000000..41ff2af --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/server.py @@ -0,0 +1,682 @@ +""" +""" + +# Created on 2014.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket +from threading import Lock +from datetime import datetime, MINYEAR + +from .. import DSA, SCHEMA, ALL, BASE, get_config_parameter, OFFLINE_EDIR_8_8_8, OFFLINE_EDIR_9_1_4, OFFLINE_AD_2012_R2, OFFLINE_SLAPD_2_4, OFFLINE_DS389_1_3_3, SEQUENCE_TYPES, IP_SYSTEM_DEFAULT, IP_V4_ONLY, IP_V6_ONLY, IP_V4_PREFERRED, IP_V6_PREFERRED, STRING_TYPES +from .exceptions import LDAPInvalidServerError, LDAPDefinitionError, LDAPInvalidPortError, LDAPInvalidTlsSpecificationError, LDAPSocketOpenError, LDAPInfoError +from ..protocol.formatters.standard import format_attribute_values +from ..protocol.rfc4511 import LDAP_MAX_INT +from ..protocol.rfc4512 import SchemaInfo, DsaInfo +from .tls import Tls +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, NETWORK +from ..utils.conv import to_unicode +from ..utils.port_validators import check_port, check_port_and_port_list + +try: + from urllib.parse import unquote # Python 3 +except ImportError: + from urllib import unquote # Python 2 + +try: # try to discover if unix sockets are available for LDAP over IPC (ldapi:// scheme) + # noinspection PyUnresolvedReferences + from socket import AF_UNIX + unix_socket_available = True +except ImportError: + unix_socket_available = False + + +class Server(object): + """ + LDAP Server definition class + + Allowed_referral_hosts can be None (default), or a list of tuples of + allowed servers ip address or names to contact while redirecting + search to referrals. + + The second element of the tuple is a boolean to indicate if + authentication to that server is allowed; if False only anonymous + bind will be used. + + Per RFC 4516. Use [('*', False)] to allow any host with anonymous + bind, use [('*', True)] to allow any host with same authentication of + Server. + """ + + _message_counter = 0 + _message_id_lock = Lock() # global lock for message_id shared by all Server objects + + def __init__(self, + host, + port=None, + use_ssl=False, + allowed_referral_hosts=None, + get_info=SCHEMA, + tls=None, + formatter=None, + connect_timeout=None, + mode=IP_V6_PREFERRED, + validator=None): + + self.ipc = False + url_given = False + host = host.strip() + if host.lower().startswith('ldap://'): + self.host = host[7:] + use_ssl = False + url_given = True + elif host.lower().startswith('ldaps://'): + self.host = host[8:] + use_ssl = True + url_given = True + elif host.lower().startswith('ldapi://') and unix_socket_available: + self.ipc = True + use_ssl = False + url_given = True + elif host.lower().startswith('ldapi://') and not unix_socket_available: + raise LDAPSocketOpenError('LDAP over IPC not available - UNIX sockets non present') + else: + self.host = host + + if self.ipc: + if str is bytes: # Python 2 + self.host = unquote(host[7:]).decode('utf-8') + else: # Python 3 + self.host = unquote(host[7:]) # encoding defaults to utf-8 in python3 + self.port = None + elif ':' in self.host and self.host.count(':') == 1: + hostname, _, hostport = self.host.partition(':') + try: + port = int(hostport) or port + except ValueError: + if log_enabled(ERROR): + log(ERROR, 'port <%s> must be an integer', port) + raise LDAPInvalidPortError('port must be an integer') + self.host = hostname + elif url_given and self.host.startswith('['): + hostname, sep, hostport = self.host[1:].partition(']') + if sep != ']' or not self._is_ipv6(hostname): + if log_enabled(ERROR): + log(ERROR, 'invalid IPv6 server address for <%s>', self.host) + raise LDAPInvalidServerError() + if len(hostport): + if not hostport.startswith(':'): + if log_enabled(ERROR): + log(ERROR, 'invalid URL in server name for <%s>', self.host) + raise LDAPInvalidServerError('invalid URL in server name') + if not hostport[1:].isdecimal(): + if log_enabled(ERROR): + log(ERROR, 'port must be an integer for <%s>', self.host) + raise LDAPInvalidPortError('port must be an integer') + port = int(hostport[1:]) + self.host = hostname + elif not url_given and self._is_ipv6(self.host): + pass + elif self.host.count(':') > 1: + if log_enabled(ERROR): + log(ERROR, 'invalid server address for <%s>', self.host) + raise LDAPInvalidServerError() + + if not self.ipc: + self.host.rstrip('/') + if not use_ssl and not port: + port = 389 + elif use_ssl and not port: + port = 636 + + port_err = check_port(port) + if port_err: + if log_enabled(ERROR): + log(ERROR, port_err) + raise LDAPInvalidPortError(port_err) + self.port = port + + if allowed_referral_hosts is None: # defaults to any server with authentication + allowed_referral_hosts = [('*', True)] + + if isinstance(allowed_referral_hosts, SEQUENCE_TYPES): + self.allowed_referral_hosts = [] + for referral_host in allowed_referral_hosts: + if isinstance(referral_host, tuple): + if isinstance(referral_host[1], bool): + self.allowed_referral_hosts.append(referral_host) + elif isinstance(allowed_referral_hosts, tuple): + if isinstance(allowed_referral_hosts[1], bool): + self.allowed_referral_hosts = [allowed_referral_hosts] + else: + self.allowed_referral_hosts = [] + + self.ssl = True if use_ssl else False + if tls and not isinstance(tls, Tls): + if log_enabled(ERROR): + log(ERROR, 'invalid tls specification: <%s>', tls) + raise LDAPInvalidTlsSpecificationError('invalid Tls object') + + self.tls = Tls() if self.ssl and not tls else tls + + if not self.ipc: + if self._is_ipv6(self.host): + self.name = ('ldaps' if self.ssl else 'ldap') + '://[' + self.host + ']:' + str(self.port) + else: + self.name = ('ldaps' if self.ssl else 'ldap') + '://' + self.host + ':' + str(self.port) + else: + self.name = host + + self.get_info = get_info + self._dsa_info = None + self._schema_info = None + self.dit_lock = Lock() + self.custom_formatter = formatter + self.custom_validator = validator + self._address_info = [] # property self.address_info resolved at open time (or when check_availability is called) + self._address_info_resolved_time = datetime(MINYEAR, 1, 1) # smallest date ever + self.current_address = None + self.connect_timeout = connect_timeout + self.mode = mode + + self.get_info_from_server(None) # load offline schema if needed + + if log_enabled(BASIC): + log(BASIC, 'instantiated Server: <%r>', self) + + @staticmethod + def _is_ipv6(host): + try: + socket.inet_pton(socket.AF_INET6, host) + except (socket.error, AttributeError, ValueError): + return False + return True + + def __str__(self): + if self.host: + s = self.name + (' - ssl' if self.ssl else ' - cleartext') + (' - unix socket' if self.ipc else '') + else: + s = object.__str__(self) + return s + + def __repr__(self): + r = 'Server(host={0.host!r}, port={0.port!r}, use_ssl={0.ssl!r}'.format(self) + r += '' if not self.allowed_referral_hosts else ', allowed_referral_hosts={0.allowed_referral_hosts!r}'.format(self) + r += '' if self.tls is None else ', tls={0.tls!r}'.format(self) + r += '' if not self.get_info else ', get_info={0.get_info!r}'.format(self) + r += '' if not self.connect_timeout else ', connect_timeout={0.connect_timeout!r}'.format(self) + r += '' if not self.mode else ', mode={0.mode!r}'.format(self) + r += ')' + + return r + + @property + def address_info(self): + conf_refresh_interval = get_config_parameter('ADDRESS_INFO_REFRESH_TIME') + if not self._address_info or (datetime.now() - self._address_info_resolved_time).seconds > conf_refresh_interval: + # converts addresses tuple to list and adds a 6th parameter for availability (None = not checked, True = available, False=not available) and a 7th parameter for the checking time + addresses = None + try: + if self.ipc: + addresses = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, None, self.host, None)] + else: + if self.mode == IP_V4_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) + elif self.mode == IP_V6_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) + else: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) + except (socket.gaierror, AttributeError): + pass + + if not addresses: # if addresses not found or raised an exception (for example for bad flags) tries again without flags + try: + if self.mode == IP_V4_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) + elif self.mode == IP_V6_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP) + else: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP) + except socket.gaierror: + pass + + if addresses: + self._address_info = [list(address) + [None, None] for address in addresses] + self._address_info_resolved_time = datetime.now() + else: + self._address_info = [] + self._address_info_resolved_time = datetime(MINYEAR, 1, 1) # smallest date + + if log_enabled(BASIC): + for address in self._address_info: + log(BASIC, 'address for <%s> resolved as <%r>', self, address[:-2]) + return self._address_info + + def update_availability(self, address, available): + cont = 0 + while cont < len(self._address_info): + if self.address_info[cont] == address: + self._address_info[cont][5] = True if available else False + self._address_info[cont][6] = datetime.now() + break + cont += 1 + + def reset_availability(self): + for address in self._address_info: + address[5] = None + address[6] = None + + def check_availability(self, source_address=None, source_port=None, source_port_list=None): + """ + Tries to open, connect and close a socket to specified address and port to check availability. + Timeout in seconds is specified in CHECK_AVAILABITY_TIMEOUT if not specified in + the Server object. + If specified, use a specific address, port, or list of possible ports, when attempting to check availability. + NOTE: This will only consider multiple ports from the source port list if the first ones we try to bind to are + already in use. This will not attempt using different ports in the list if the server is unavailable, + as that could result in the runtime of check_availability significantly exceeding the connection timeout. + """ + source_port_err = check_port_and_port_list(source_port, source_port_list) + if source_port_err: + if log_enabled(ERROR): + log(ERROR, source_port_err) + raise LDAPInvalidPortError(source_port_err) + + # using an empty string to bind a socket means "use the default as if this wasn't provided" because socket + # binding requires that you pass something for the ip if you want to pass a specific port + bind_address = source_address if source_address is not None else '' + # using 0 as the source port to bind a socket means "use the default behavior of picking a random port from + # all ports as if this wasn't provided" because socket binding requires that you pass something for the port + # if you want to pass a specific ip + candidate_bind_ports = [0] + + # if we have either a source port or source port list, convert that into our candidate list + if source_port is not None: + candidate_bind_ports = [source_port] + elif source_port_list is not None: + candidate_bind_ports = source_port_list[:] + + conf_availability_timeout = get_config_parameter('CHECK_AVAILABILITY_TIMEOUT') + available = False + self.reset_availability() + for address in self.candidate_addresses(): + available = True + try: + temp_socket = socket.socket(*address[:3]) + + # Go through our candidate bind ports and try to bind our socket to our source address with them. + # if no source address or ports were specified, this will have the same success/fail result as if we + # tried to connect to the remote server without binding locally first. + # This is actually a little bit better, as it lets us distinguish the case of "issue binding the socket + # locally" from "remote server is unavailable" with more clarity, though this will only really be an + # issue when no source address/port is specified if the system checking server availability is running + # as a very unprivileged user. + last_bind_exc = None + socket_bind_succeeded = False + for bind_port in candidate_bind_ports: + try: + temp_socket.bind((bind_address, bind_port)) + socket_bind_succeeded = True + break + except Exception as bind_ex: + last_bind_exc = bind_ex + if log_enabled(NETWORK): + log(NETWORK, 'Unable to bind to local address <%s> with source port <%s> due to <%s>', + bind_address, bind_port, bind_ex) + if not socket_bind_succeeded: + if log_enabled(ERROR): + log(ERROR, 'Unable to locally bind to local address <%s> with any of the source ports <%s> due to <%s>', + bind_address, candidate_bind_ports, last_bind_exc) + raise LDAPSocketOpenError('Unable to bind socket locally to address {} with any of the source ports {} due to {}' + .format(bind_address, candidate_bind_ports, last_bind_exc)) + + if self.connect_timeout: + temp_socket.settimeout(self.connect_timeout) + else: + temp_socket.settimeout(conf_availability_timeout) # set timeout for checking availability to default + try: + temp_socket.connect(address[4]) + except socket.error: + available = False + finally: + try: + temp_socket.shutdown(socket.SHUT_RDWR) + except socket.error: + available = False + finally: + temp_socket.close() + except socket.gaierror: + available = False + + if available: + if log_enabled(BASIC): + log(BASIC, 'server <%s> available at <%r>', self, address) + self.update_availability(address, True) + break # if an available address is found exits immediately + else: + self.update_availability(address, False) + if log_enabled(ERROR): + log(ERROR, 'server <%s> not available at <%r>', self, address) + + return available + + @staticmethod + def next_message_id(): + """ + LDAP messageId is unique for all connections to same server + """ + with Server._message_id_lock: + Server._message_counter += 1 + if Server._message_counter >= LDAP_MAX_INT: + Server._message_counter = 1 + if log_enabled(PROTOCOL): + log(PROTOCOL, 'new message id <%d> generated', Server._message_counter) + + return Server._message_counter + + def _get_dsa_info(self, connection): + """ + Retrieve DSE operational attribute as per RFC4512 (5.1). + """ + if connection.strategy.no_real_dsa: # do not try for mock strategies + return + + if not connection.strategy.pooled: # in pooled strategies get_dsa_info is performed by the worker threads + result = connection.search(search_base='', + search_filter='(objectClass=*)', + search_scope=BASE, + attributes=['altServer', # requests specific dsa info attributes + 'namingContexts', + 'supportedControl', + 'supportedExtension', + 'supportedFeatures', + 'supportedCapabilities', + 'supportedLdapVersion', + 'supportedSASLMechanisms', + 'vendorName', + 'vendorVersion', + 'subschemaSubentry', + '*', + '+'], # requests all remaining attributes (other), + get_operational_attributes=True) + + if connection.strategy.thread_safe: + status, result, response, _ = result + else: + status = result + result = connection.result + response = connection.response + + with self.dit_lock: + if connection.strategy.sync: # sync request + self._dsa_info = DsaInfo(response[0]['attributes'], response[0]['raw_attributes']) if status else self._dsa_info + elif status: # asynchronous request, must check if attributes in response + results, _ = connection.get_response(status) + if len(results) == 1 and 'attributes' in results[0] and 'raw_attributes' in results[0]: + self._dsa_info = DsaInfo(results[0]['attributes'], results[0]['raw_attributes']) + + if log_enabled(BASIC): + log(BASIC, 'DSA info read for <%s> via <%s>', self, connection) + + def _get_schema_info(self, connection, entry=''): + """ + Retrieve schema from subschemaSubentry DSE attribute, per RFC + 4512 (4.4 and 5.1); entry = '' means DSE. + """ + if connection.strategy.no_real_dsa: # do not try for mock strategies + return + + schema_entry = None + if self._dsa_info and entry == '': # subschemaSubentry already present in dsaInfo + if isinstance(self._dsa_info.schema_entry, SEQUENCE_TYPES): + schema_entry = self._dsa_info.schema_entry[0] if self._dsa_info.schema_entry else None + else: + schema_entry = self._dsa_info.schema_entry if self._dsa_info.schema_entry else None + else: + result = connection.search(entry, '(objectClass=*)', BASE, attributes=['subschemaSubentry'], get_operational_attributes=True) + if connection.strategy.thread_safe: + status, result, response, _ = result + else: + status = result + result = connection.result + response = connection.response + if connection.strategy.sync: # sync request + if status and 'subschemaSubentry' in response[0]['raw_attributes']: + if len(response[0]['raw_attributes']['subschemaSubentry']) > 0: + schema_entry = response[0]['raw_attributes']['subschemaSubentry'][0] + else: # asynchronous request, must check if subschemaSubentry in attributes + results, _ = connection.get_response(status) + if len(results) == 1 and 'raw_attributes' in results[0] and 'subschemaSubentry' in results[0]['attributes']: + if len(results[0]['raw_attributes']['subschemaSubentry']) > 0: + schema_entry = results[0]['raw_attributes']['subschemaSubentry'][0] + + if schema_entry and not connection.strategy.pooled: # in pooled strategies get_schema_info is performed by the worker threads + if isinstance(schema_entry, bytes) and str is not bytes: # Python 3 + schema_entry = to_unicode(schema_entry, from_server=True) + result = connection.search(schema_entry, + search_filter='(objectClass=subschema)', + search_scope=BASE, + attributes=['objectClasses', # requests specific subschema attributes + 'attributeTypes', + 'ldapSyntaxes', + 'matchingRules', + 'matchingRuleUse', + 'dITContentRules', + 'dITStructureRules', + 'nameForms', + 'createTimestamp', + 'modifyTimestamp', + '*'], # requests all remaining attributes (other) + get_operational_attributes=True + ) + if connection.strategy.thread_safe: + status, result, response, _ = result + else: + status = result + result = connection.result + response = connection.response + with self.dit_lock: + self._schema_info = None + if status: + if connection.strategy.sync: # sync request + self._schema_info = SchemaInfo(schema_entry, response[0]['attributes'], response[0]['raw_attributes']) + else: # asynchronous request, must check if attributes in response + results, result = connection.get_response(status) + if len(results) == 1 and 'attributes' in results[0] and 'raw_attributes' in results[0]: + self._schema_info = SchemaInfo(schema_entry, results[0]['attributes'], results[0]['raw_attributes']) + if self._schema_info and not self._schema_info.is_valid(): # flaky servers can return an empty schema, checks if it is so and set schema to None + self._schema_info = None + if self._schema_info: # if schema is valid tries to apply formatter to the "other" dict with raw values for schema and info + for attribute in self._schema_info.other: + self._schema_info.other[attribute] = format_attribute_values(self._schema_info, attribute, self._schema_info.raw[attribute], self.custom_formatter) + if self._dsa_info: # try to apply formatter to the "other" dict with dsa info raw values + for attribute in self._dsa_info.other: + self._dsa_info.other[attribute] = format_attribute_values(self._schema_info, attribute, self._dsa_info.raw[attribute], self.custom_formatter) + if log_enabled(BASIC): + log(BASIC, 'schema read for <%s> via <%s>', self, connection) + + def get_info_from_server(self, connection): + """ + reads info from DSE and from subschema + """ + if connection and not connection.closed: + if self.get_info in [DSA, ALL]: + self._get_dsa_info(connection) + if self.get_info in [SCHEMA, ALL]: + self._get_schema_info(connection) + elif self.get_info == OFFLINE_EDIR_8_8_8: + from ..protocol.schemas.edir888 import edir_8_8_8_schema, edir_8_8_8_dsa_info + self.attach_schema_info(SchemaInfo.from_json(edir_8_8_8_schema)) + self.attach_dsa_info(DsaInfo.from_json(edir_8_8_8_dsa_info)) + elif self.get_info == OFFLINE_EDIR_9_1_4: + from ..protocol.schemas.edir914 import edir_9_1_4_schema, edir_9_1_4_dsa_info + self.attach_schema_info(SchemaInfo.from_json(edir_9_1_4_schema)) + self.attach_dsa_info(DsaInfo.from_json(edir_9_1_4_dsa_info)) + elif self.get_info == OFFLINE_AD_2012_R2: + from ..protocol.schemas.ad2012R2 import ad_2012_r2_schema, ad_2012_r2_dsa_info + self.attach_schema_info(SchemaInfo.from_json(ad_2012_r2_schema)) + self.attach_dsa_info(DsaInfo.from_json(ad_2012_r2_dsa_info)) + elif self.get_info == OFFLINE_SLAPD_2_4: + from ..protocol.schemas.slapd24 import slapd_2_4_schema, slapd_2_4_dsa_info + self.attach_schema_info(SchemaInfo.from_json(slapd_2_4_schema)) + self.attach_dsa_info(DsaInfo.from_json(slapd_2_4_dsa_info)) + elif self.get_info == OFFLINE_DS389_1_3_3: + from ..protocol.schemas.ds389 import ds389_1_3_3_schema, ds389_1_3_3_dsa_info + self.attach_schema_info(SchemaInfo.from_json(ds389_1_3_3_schema)) + self.attach_dsa_info(DsaInfo.from_json(ds389_1_3_3_dsa_info)) + + def attach_dsa_info(self, dsa_info=None): + if isinstance(dsa_info, DsaInfo): + self._dsa_info = dsa_info + if log_enabled(BASIC): + log(BASIC, 'attached DSA info to Server <%s>', self) + + def attach_schema_info(self, dsa_schema=None): + if isinstance(dsa_schema, SchemaInfo): + self._schema_info = dsa_schema + if log_enabled(BASIC): + log(BASIC, 'attached schema info to Server <%s>', self) + + @property + def info(self): + return self._dsa_info + + @property + def schema(self): + return self._schema_info + + @staticmethod + def from_definition(host, dsa_info, dsa_schema, port=None, use_ssl=False, formatter=None, validator=None): + """ + Define a dummy server with preloaded schema and info + :param host: host name + :param dsa_info: DsaInfo preloaded object or a json formatted string or a file name + :param dsa_schema: SchemaInfo preloaded object or a json formatted string or a file name + :param port: fake port + :param use_ssl: use_ssl + :param formatter: custom formatters + :return: Server object + """ + if isinstance(host, SEQUENCE_TYPES): + dummy = Server(host=host[0], port=port, use_ssl=use_ssl, formatter=formatter, validator=validator, get_info=ALL) # for ServerPool object + else: + dummy = Server(host=host, port=port, use_ssl=use_ssl, formatter=formatter, validator=validator, get_info=ALL) + if isinstance(dsa_info, DsaInfo): + dummy._dsa_info = dsa_info + elif isinstance(dsa_info, STRING_TYPES): + try: + dummy._dsa_info = DsaInfo.from_json(dsa_info) # tries to use dsa_info as a json configuration string + except Exception: + dummy._dsa_info = DsaInfo.from_file(dsa_info) # tries to use dsa_info as a file name + + if not dummy.info: + if log_enabled(ERROR): + log(ERROR, 'invalid DSA info for %s', host) + raise LDAPDefinitionError('invalid dsa info') + + if isinstance(dsa_schema, SchemaInfo): + dummy._schema_info = dsa_schema + elif isinstance(dsa_schema, STRING_TYPES): + try: + dummy._schema_info = SchemaInfo.from_json(dsa_schema) + except Exception: + dummy._schema_info = SchemaInfo.from_file(dsa_schema) + + if not dummy.schema: + if log_enabled(ERROR): + log(ERROR, 'invalid schema info for %s', host) + raise LDAPDefinitionError('invalid schema info') + + if log_enabled(BASIC): + log(BASIC, 'created server <%s> from definition', dummy) + + return dummy + + def candidate_addresses(self): + conf_reset_availability_timeout = get_config_parameter('RESET_AVAILABILITY_TIMEOUT') + if self.ipc: + candidates = self.address_info + if log_enabled(BASIC): + log(BASIC, 'candidate address for <%s>: <%s> with mode UNIX_SOCKET', self, self.name) + else: + # checks reset availability timeout + for address in self.address_info: + if address[6] and ((datetime.now() - address[6]).seconds > conf_reset_availability_timeout): + address[5] = None + address[6] = None + + # selects server address based on server mode and availability (in address[5]) + addresses = self.address_info[:] # copy to avoid refreshing while searching candidates + candidates = [] + if addresses: + if self.mode == IP_SYSTEM_DEFAULT: + candidates.append(addresses[0]) + elif self.mode == IP_V4_ONLY: + candidates = [address for address in addresses if address[0] == socket.AF_INET and (address[5] or address[5] is None)] + elif self.mode == IP_V6_ONLY: + candidates = [address for address in addresses if address[0] == socket.AF_INET6 and (address[5] or address[5] is None)] + elif self.mode == IP_V4_PREFERRED: + candidates = [address for address in addresses if address[0] == socket.AF_INET and (address[5] or address[5] is None)] + candidates += [address for address in addresses if address[0] == socket.AF_INET6 and (address[5] or address[5] is None)] + elif self.mode == IP_V6_PREFERRED: + candidates = [address for address in addresses if address[0] == socket.AF_INET6 and (address[5] or address[5] is None)] + candidates += [address for address in addresses if address[0] == socket.AF_INET and (address[5] or address[5] is None)] + else: + if log_enabled(ERROR): + log(ERROR, 'invalid server mode for <%s>', self) + raise LDAPInvalidServerError('invalid server mode') + + if log_enabled(BASIC): + for candidate in candidates: + log(BASIC, 'obtained candidate address for <%s>: <%r> with mode %s', self, candidate[:-2], self.mode) + return candidates + + def _check_info_property(self, kind, name): + if not self._dsa_info: + raise LDAPInfoError('server info not loaded') + + if kind == 'control': + properties = self.info.supported_controls + elif kind == 'extension': + properties = self.info.supported_extensions + elif kind == 'feature': + properties = self.info.supported_features + else: + raise LDAPInfoError('invalid info category') + + for prop in properties: + if name == prop[0] or (prop[2] and name.lower() == prop[2].lower()): # checks oid and description + return True + + return False + + def has_control(self, control): + return self._check_info_property('control', control) + + def has_extension(self, extension): + return self._check_info_property('extension', extension) + + def has_feature(self, feature): + return self._check_info_property('feature', feature) + + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/timezone.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/timezone.py new file mode 100644 index 0000000..0c24a77 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/timezone.py @@ -0,0 +1,56 @@ +""" +""" + +# Created on 2015.01.07 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import timedelta, tzinfo + + +# from python standard library docs +class OffsetTzInfo(tzinfo): + """Fixed offset in minutes east from UTC""" + + def __init__(self, offset, name): + self.offset = offset + self.name = name + self._offset = timedelta(minutes=offset) + + def __str__(self): + return self.name + + def __repr__(self): + + return 'OffsetTzInfo(offset={0.offset!r}, name={0.name!r})'.format(self) + + def utcoffset(self, dt): + return self._offset + + def tzname(self, dt): + return self.name + + # noinspection PyMethodMayBeStatic + def dst(self, dt): + return timedelta(0) + + def __getinitargs__(self): # for pickling/unpickling + return self.offset, self.name diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/tls.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/tls.py new file mode 100644 index 0000000..ca8592b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/tls.py @@ -0,0 +1,327 @@ +""" +""" + +# Created on 2013.08.05 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .exceptions import LDAPSSLNotSupportedError, LDAPSSLConfigurationError, LDAPCertificateError, start_tls_exception_factory, LDAPStartTLSError +from .. import SEQUENCE_TYPES +from ..utils.log import log, log_enabled, ERROR, BASIC, NETWORK + +try: + # noinspection PyUnresolvedReferences + import ssl +except ImportError: + if log_enabled(ERROR): + log(ERROR, 'SSL not supported in this Python interpreter') + raise LDAPSSLNotSupportedError('SSL not supported in this Python interpreter') + +try: + from ssl import match_hostname, CertificateError # backport for python2 missing ssl functionalities +except ImportError: + from ..utils.tls_backport import CertificateError + from ..utils.tls_backport import match_hostname + if log_enabled(BASIC): + log(BASIC, 'using tls_backport') + +try: # try to use SSLContext + # noinspection PyUnresolvedReferences + from ssl import create_default_context, Purpose # defined in Python 3.4 and Python 2.7.9 + use_ssl_context = True +except ImportError: + use_ssl_context = False + if log_enabled(BASIC): + log(BASIC, 'SSLContext unavailable') + +from os import path + + +# noinspection PyProtectedMember +class Tls(object): + """ + tls/ssl configuration for Server object + Starting from python 2.7.9 and python 3.4 uses the SSLContext object + that tries to read the CAs defined at system level + ca_certs_path and ca_certs_data are valid only when using SSLContext + local_private_key_password is valid only when using SSLContext + ssl_options is valid only when using SSLContext + sni is the server name for Server Name Indication (when available) + """ + + def __init__(self, + local_private_key_file=None, + local_certificate_file=None, + validate=ssl.CERT_NONE, + version=None, + ssl_options=None, + ca_certs_file=None, + valid_names=None, + ca_certs_path=None, + ca_certs_data=None, + local_private_key_password=None, + ciphers=None, + sni=None): + if ssl_options is None: + ssl_options = [] + self.ssl_options = ssl_options + if validate in [ssl.CERT_NONE, ssl.CERT_OPTIONAL, ssl.CERT_REQUIRED]: + self.validate = validate + elif validate: + if log_enabled(ERROR): + log(ERROR, 'invalid validate parameter <%s>', validate) + raise LDAPSSLConfigurationError('invalid validate parameter') + if ca_certs_file and path.exists(ca_certs_file): + self.ca_certs_file = ca_certs_file + elif ca_certs_file: + if log_enabled(ERROR): + log(ERROR, 'invalid CA public key file <%s>', ca_certs_file) + raise LDAPSSLConfigurationError('invalid CA public key file') + else: + self.ca_certs_file = None + + if ca_certs_path and use_ssl_context and path.exists(ca_certs_path): + self.ca_certs_path = ca_certs_path + elif ca_certs_path and not use_ssl_context: + if log_enabled(ERROR): + log(ERROR, 'cannot use CA public keys path, SSLContext not available') + raise LDAPSSLNotSupportedError('cannot use CA public keys path, SSLContext not available') + elif ca_certs_path: + if log_enabled(ERROR): + log(ERROR, 'invalid CA public keys path <%s>', ca_certs_path) + raise LDAPSSLConfigurationError('invalid CA public keys path') + else: + self.ca_certs_path = None + + if ca_certs_data and use_ssl_context: + self.ca_certs_data = ca_certs_data + elif ca_certs_data: + if log_enabled(ERROR): + log(ERROR, 'cannot use CA data, SSLContext not available') + raise LDAPSSLNotSupportedError('cannot use CA data, SSLContext not available') + else: + self.ca_certs_data = None + + if local_private_key_password and use_ssl_context: + self.private_key_password = local_private_key_password + elif local_private_key_password: + if log_enabled(ERROR): + log(ERROR, 'cannot use local private key password, SSLContext not available') + raise LDAPSSLNotSupportedError('cannot use local private key password, SSLContext is not available') + else: + self.private_key_password = None + + self.version = version + self.private_key_file = local_private_key_file + self.certificate_file = local_certificate_file + self.valid_names = valid_names + self.ciphers = ciphers + self.sni = sni + + if log_enabled(BASIC): + log(BASIC, 'instantiated Tls: <%r>' % self) + + def __str__(self): + s = [ + 'protocol: ' + str(self.version), + 'client private key: ' + ('present ' if self.private_key_file else 'not present'), + 'client certificate: ' + ('present ' if self.certificate_file else 'not present'), + 'private key password: ' + ('present ' if self.private_key_password else 'not present'), + 'CA certificates file: ' + ('present ' if self.ca_certs_file else 'not present'), + 'CA certificates path: ' + ('present ' if self.ca_certs_path else 'not present'), + 'CA certificates data: ' + ('present ' if self.ca_certs_data else 'not present'), + 'verify mode: ' + str(self.validate), + 'valid names: ' + str(self.valid_names), + 'ciphers: ' + str(self.ciphers), + 'sni: ' + str(self.sni) + ] + return ' - '.join(s) + + def __repr__(self): + r = '' if self.private_key_file is None else ', local_private_key_file={0.private_key_file!r}'.format(self) + r += '' if self.certificate_file is None else ', local_certificate_file={0.certificate_file!r}'.format(self) + r += '' if self.validate is None else ', validate={0.validate!r}'.format(self) + r += '' if self.version is None else ', version={0.version!r}'.format(self) + r += '' if self.ca_certs_file is None else ', ca_certs_file={0.ca_certs_file!r}'.format(self) + r += '' if self.ca_certs_path is None else ', ca_certs_path={0.ca_certs_path!r}'.format(self) + r += '' if self.ca_certs_data is None else ', ca_certs_data={0.ca_certs_data!r}'.format(self) + r += '' if self.ciphers is None else ', ciphers={0.ciphers!r}'.format(self) + r += '' if self.sni is None else ', sni={0.sni!r}'.format(self) + r = 'Tls(' + r[2:] + ')' + return r + + def wrap_socket(self, connection, do_handshake=False): + """ + Adds TLS to the connection socket + """ + if use_ssl_context: + if self.version is None: # uses the default ssl context for reasonable security + ssl_context = create_default_context(purpose=Purpose.SERVER_AUTH, + cafile=self.ca_certs_file, + capath=self.ca_certs_path, + cadata=self.ca_certs_data) + else: # code from create_default_context in the Python standard library 3.5.1, creates a ssl context with the specificd protocol version + ssl_context = ssl.SSLContext(self.version) + if self.ca_certs_file or self.ca_certs_path or self.ca_certs_data: + ssl_context.load_verify_locations(self.ca_certs_file, self.ca_certs_path, self.ca_certs_data) + elif self.validate != ssl.CERT_NONE: + ssl_context.load_default_certs(Purpose.SERVER_AUTH) + + if self.certificate_file: + ssl_context.load_cert_chain(self.certificate_file, keyfile=self.private_key_file, password=self.private_key_password) + ssl_context.check_hostname = False + ssl_context.verify_mode = self.validate + for option in self.ssl_options: + ssl_context.options |= option + + if self.ciphers: + try: + ssl_context.set_ciphers(self.ciphers) + except ssl.SSLError: + pass + + if self.sni: + wrapped_socket = ssl_context.wrap_socket(connection.socket, server_side=False, do_handshake_on_connect=do_handshake, server_hostname=self.sni) + else: + wrapped_socket = ssl_context.wrap_socket(connection.socket, server_side=False, do_handshake_on_connect=do_handshake) + if log_enabled(NETWORK): + log(NETWORK, 'socket wrapped with SSL using SSLContext for <%s>', connection) + else: + if self.version is None and hasattr(ssl, 'PROTOCOL_SSLv23'): + self.version = ssl.PROTOCOL_SSLv23 + if self.ciphers: + try: + + wrapped_socket = ssl.wrap_socket(connection.socket, + keyfile=self.private_key_file, + certfile=self.certificate_file, + server_side=False, + cert_reqs=self.validate, + ssl_version=self.version, + ca_certs=self.ca_certs_file, + do_handshake_on_connect=do_handshake, + ciphers=self.ciphers) + except ssl.SSLError: + raise + except TypeError: # in python2.6 no ciphers argument is present, failback to self.ciphers=None + self.ciphers = None + + if not self.ciphers: + wrapped_socket = ssl.wrap_socket(connection.socket, + keyfile=self.private_key_file, + certfile=self.certificate_file, + server_side=False, + cert_reqs=self.validate, + ssl_version=self.version, + ca_certs=self.ca_certs_file, + do_handshake_on_connect=do_handshake) + if log_enabled(NETWORK): + log(NETWORK, 'socket wrapped with SSL for <%s>', connection) + + if do_handshake and (self.validate == ssl.CERT_REQUIRED or self.validate == ssl.CERT_OPTIONAL): + check_hostname(wrapped_socket, connection.server.host, self.valid_names) + + connection.socket = wrapped_socket + return + + def start_tls(self, connection): + if connection.server.ssl: # ssl already established at server level + return False + + if (connection.tls_started and not connection._executing_deferred) or connection.strategy._outstanding or connection.sasl_in_progress: + # Per RFC 4513 (3.1.1) + if log_enabled(ERROR): + log(ERROR, "can't start tls because operations are in progress for <%s>", self) + return False + connection.starting_tls = True + if log_enabled(BASIC): + log(BASIC, 'starting tls for <%s>', connection) + if not connection.strategy.sync: + connection._awaiting_for_async_start_tls = True # some flaky servers (OpenLDAP) doesn't return the extended response name in response + result = connection.extended('1.3.6.1.4.1.1466.20037') + if not connection.strategy.sync: + # asynchronous - _start_tls must be executed by the strategy + response = connection.get_response(result) + if response != (None, None): + if log_enabled(BASIC): + log(BASIC, 'tls started for <%s>', connection) + return True + else: + if log_enabled(BASIC): + log(BASIC, 'tls not started for <%s>', connection) + return False + else: + if connection.result['description'] not in ['success']: + # startTLS failed + connection.last_error = 'startTLS failed - ' + str(connection.result['description']) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', connection.last_error, connection) + raise LDAPStartTLSError(connection.last_error) + if log_enabled(BASIC): + log(BASIC, 'tls started for <%s>', connection) + return self._start_tls(connection) + + def _start_tls(self, connection): + try: + self.wrap_socket(connection, do_handshake=True) + except Exception as e: + connection.last_error = 'wrap socket error: ' + str(e) + if log_enabled(ERROR): + log(ERROR, 'error <%s> wrapping socket for TLS in <%s>', connection.last_error, connection) + raise start_tls_exception_factory(e)(connection.last_error) + finally: + connection.starting_tls = False + + if connection.usage: + connection._usage.wrapped_sockets += 1 + connection.tls_started = True + return True + + +def check_hostname(sock, server_name, additional_names): + server_certificate = sock.getpeercert() + if log_enabled(NETWORK): + log(NETWORK, 'certificate found for %s: %s', sock, server_certificate) + if additional_names: + host_names = [server_name] + (additional_names if isinstance(additional_names, SEQUENCE_TYPES) else [additional_names]) + else: + host_names = [server_name] + + for host_name in host_names: + if not host_name: + continue + elif host_name == '*': + if log_enabled(NETWORK): + log(NETWORK, 'certificate matches * wildcard') + return # valid + + try: + match_hostname(server_certificate, host_name) # raise CertificateError if certificate doesn't match server name + if log_enabled(NETWORK): + log(NETWORK, 'certificate matches host name <%s>', host_name) + return # valid + except CertificateError as e: + if log_enabled(NETWORK): + log(NETWORK, str(e)) + + if log_enabled(ERROR): + log(ERROR, "hostname doesn't match certificate") + raise LDAPCertificateError("certificate %s doesn't match any name in %s " % (server_certificate, str(host_names))) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/usage.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/usage.py new file mode 100644 index 0000000..7748c76 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/core/usage.py @@ -0,0 +1,229 @@ +""" +""" + +# Created on 2014.03.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime, timedelta +from os import linesep + +from .exceptions import LDAPMetricsError +from ..utils.log import log, log_enabled, ERROR, BASIC + + +class ConnectionUsage(object): + """ + Collect statistics on connection usage + """ + + def reset(self): + self.open_sockets = 0 + self.closed_sockets = 0 + self.wrapped_sockets = 0 + self.bytes_transmitted = 0 + self.bytes_received = 0 + self.messages_transmitted = 0 + self.messages_received = 0 + self.operations = 0 + self.abandon_operations = 0 + self.add_operations = 0 + self.bind_operations = 0 + self.compare_operations = 0 + self.delete_operations = 0 + self.extended_operations = 0 + self.modify_operations = 0 + self.modify_dn_operations = 0 + self.search_operations = 0 + self.unbind_operations = 0 + self.referrals_received = 0 + self.referrals_followed = 0 + self.referrals_connections = 0 + self.restartable_failures = 0 + self.restartable_successes = 0 + self.servers_from_pool = 0 + if log_enabled(BASIC): + log(BASIC, 'reset usage metrics') + + def __init__(self): + self.initial_connection_start_time = None + self.open_socket_start_time = None + self.connection_stop_time = None + self.last_transmitted_time = None + self.last_received_time = None + self.open_sockets = 0 + self.closed_sockets = 0 + self.wrapped_sockets = 0 + self.bytes_transmitted = 0 + self.bytes_received = 0 + self.messages_transmitted = 0 + self.messages_received = 0 + self.operations = 0 + self.abandon_operations = 0 + self.add_operations = 0 + self.bind_operations = 0 + self.compare_operations = 0 + self.delete_operations = 0 + self.extended_operations = 0 + self.modify_operations = 0 + self.modify_dn_operations = 0 + self.search_operations = 0 + self.unbind_operations = 0 + self.referrals_received = 0 + self.referrals_followed = 0 + self.referrals_connections = 0 + self.restartable_failures = 0 + self.restartable_successes = 0 + self.servers_from_pool = 0 + + if log_enabled(BASIC): + log(BASIC, 'instantiated Usage object') + + def __repr__(self): + r = 'Connection Usage:' + linesep + r += ' Time: [elapsed: ' + str(self.elapsed_time) + ']' + linesep + r += ' Initial start time: ' + (str(self.initial_connection_start_time.isoformat()) if self.initial_connection_start_time else '') + linesep + r += ' Open socket time: ' + (str(self.open_socket_start_time.isoformat()) if self.open_socket_start_time else '') + linesep + r += ' Last transmitted time: ' + (str(self.last_transmitted_time.isoformat()) if self.last_transmitted_time else '') + linesep + r += ' Last received time: ' + (str(self.last_received_time.isoformat()) if self.last_received_time else '') + linesep + r += ' Close socket time: ' + (str(self.connection_stop_time.isoformat()) if self.connection_stop_time else '') + linesep + r += ' Server:' + linesep + r += ' Servers from pool: ' + str(self.servers_from_pool) + linesep + r += ' Sockets open: ' + str(self.open_sockets) + linesep + r += ' Sockets closed: ' + str(self.closed_sockets) + linesep + r += ' Sockets wrapped: ' + str(self.wrapped_sockets) + linesep + r += ' Bytes: ' + str(self.bytes_transmitted + self.bytes_received) + linesep + r += ' Transmitted: ' + str(self.bytes_transmitted) + linesep + r += ' Received: ' + str(self.bytes_received) + linesep + r += ' Messages: ' + str(self.messages_transmitted + self.messages_received) + linesep + r += ' Transmitted: ' + str(self.messages_transmitted) + linesep + r += ' Received: ' + str(self.messages_received) + linesep + r += ' Operations: ' + str(self.operations) + linesep + r += ' Abandon: ' + str(self.abandon_operations) + linesep + r += ' Bind: ' + str(self.bind_operations) + linesep + r += ' Add: ' + str(self.add_operations) + linesep + r += ' Compare: ' + str(self.compare_operations) + linesep + r += ' Delete: ' + str(self.delete_operations) + linesep + r += ' Extended: ' + str(self.extended_operations) + linesep + r += ' Modify: ' + str(self.modify_operations) + linesep + r += ' ModifyDn: ' + str(self.modify_dn_operations) + linesep + r += ' Search: ' + str(self.search_operations) + linesep + r += ' Unbind: ' + str(self.unbind_operations) + linesep + r += ' Referrals: ' + linesep + r += ' Received: ' + str(self.referrals_received) + linesep + r += ' Followed: ' + str(self.referrals_followed) + linesep + r += ' Connections: ' + str(self.referrals_connections) + linesep + r += ' Restartable tries: ' + str(self.restartable_failures + self.restartable_successes) + linesep + r += ' Failed restarts: ' + str(self.restartable_failures) + linesep + r += ' Successful restarts: ' + str(self.restartable_successes) + linesep + return r + + def __str__(self): + return self.__repr__() + + def __iadd__(self, other): + if not isinstance(other, ConnectionUsage): + raise LDAPMetricsError('unable to add to ConnectionUsage') + + self.open_sockets += other.open_sockets + self.closed_sockets += other.closed_sockets + self.wrapped_sockets += other.wrapped_sockets + self.bytes_transmitted += other.bytes_transmitted + self.bytes_received += other.bytes_received + self.messages_transmitted += other.messages_transmitted + self.messages_received += other.messages_received + self.operations += other.operations + self.abandon_operations += other.abandon_operations + self.add_operations += other.add_operations + self.bind_operations += other.bind_operations + self.compare_operations += other.compare_operations + self.delete_operations += other.delete_operations + self.extended_operations += other.extended_operations + self.modify_operations += other.modify_operations + self.modify_dn_operations += other.modify_dn_operations + self.search_operations += other.search_operations + self.unbind_operations += other.unbind_operations + self.referrals_received += other.referrals_received + self.referrals_followed += other.referrals_followed + self.referrals_connections += other.referrals_connections + self.restartable_failures += other.restartable_failures + self.restartable_successes += other.restartable_successes + self.servers_from_pool += other.servers_from_pool + return self + + def update_transmitted_message(self, message, length): + self.last_transmitted_time = datetime.now() + self.bytes_transmitted += length + self.operations += 1 + self.messages_transmitted += 1 + if message['type'] == 'abandonRequest': + self.abandon_operations += 1 + elif message['type'] == 'addRequest': + self.add_operations += 1 + elif message['type'] == 'bindRequest': + self.bind_operations += 1 + elif message['type'] == 'compareRequest': + self.compare_operations += 1 + elif message['type'] == 'delRequest': + self.delete_operations += 1 + elif message['type'] == 'extendedReq': + self.extended_operations += 1 + elif message['type'] == 'modifyRequest': + self.modify_operations += 1 + elif message['type'] == 'modDNRequest': + self.modify_dn_operations += 1 + elif message['type'] == 'searchRequest': + self.search_operations += 1 + elif message['type'] == 'unbindRequest': + self.unbind_operations += 1 + else: + if log_enabled(ERROR): + log(ERROR, 'unable to collect usage for unknown message type <%s>', message['type']) + raise LDAPMetricsError('unable to collect usage for unknown message type') + + def update_received_message(self, length): + self.last_received_time = datetime.now() + self.bytes_received += length + self.messages_received += 1 + + def start(self, reset=True): + if reset: + self.reset() + self.open_socket_start_time = datetime.now() + self.connection_stop_time = None + if not self.initial_connection_start_time: + self.initial_connection_start_time = self.open_socket_start_time + + if log_enabled(BASIC): + log(BASIC, 'start collecting usage metrics') + + def stop(self): + if self.open_socket_start_time: + self.connection_stop_time = datetime.now() + if log_enabled(BASIC): + log(BASIC, 'stop collecting usage metrics') + + @property + def elapsed_time(self): + if self.connection_stop_time: + return self.connection_stop_time - self.open_socket_start_time + else: + return (datetime.now() - self.open_socket_start_time) if self.open_socket_start_time else timedelta(0) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__init__.py new file mode 100644 index 0000000..b359be5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__init__.py @@ -0,0 +1,334 @@ +""" +""" + +# Created on 2014.04.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .. import SUBTREE, DEREF_ALWAYS, ALL_ATTRIBUTES, DEREF_NEVER +from .microsoft.dirSync import DirSync +from .microsoft.modifyPassword import ad_modify_password +from .microsoft.unlockAccount import ad_unlock_account +from .microsoft.addMembersToGroups import ad_add_members_to_groups +from .microsoft.removeMembersFromGroups import ad_remove_members_from_groups +from .microsoft.persistentSearch import ADPersistentSearch +from .novell.partition_entry_count import PartitionEntryCount +from .novell.replicaInfo import ReplicaInfo +from .novell.listReplicas import ListReplicas +from .novell.getBindDn import GetBindDn +from .novell.nmasGetUniversalPassword import NmasGetUniversalPassword +from .novell.nmasSetUniversalPassword import NmasSetUniversalPassword +from .novell.startTransaction import StartTransaction +from .novell.endTransaction import EndTransaction +from .novell.addMembersToGroups import edir_add_members_to_groups +from .novell.removeMembersFromGroups import edir_remove_members_from_groups +from .novell.checkGroupsMemberships import edir_check_groups_memberships +from .standard.whoAmI import WhoAmI +from .standard.modifyPassword import ModifyPassword +from .standard.PagedSearch import paged_search_generator, paged_search_accumulator +from .standard.PersistentSearch import PersistentSearch + + +class ExtendedOperationContainer(object): + def __init__(self, connection): + self._connection = connection + + def __repr__(self): + return linesep.join([' ' + element for element in dir(self) if element[0] != '_']) + + def __str__(self): + return self.__repr__() + + +class StandardExtendedOperations(ExtendedOperationContainer): + def who_am_i(self, controls=None): + return WhoAmI(self._connection, + controls).send() + + def modify_password(self, + user=None, + old_password=None, + new_password=None, + hash_algorithm=None, + salt=None, + controls=None): + + return ModifyPassword(self._connection, + user, + old_password, + new_password, + hash_algorithm, + salt, + controls).send() + + def paged_search(self, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=100, + paged_criticality=False, + generator=True): + + if generator: + return paged_search_generator(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality) + else: + return paged_search_accumulator(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality) + + def persistent_search(self, + search_base='', + search_filter='(objectclass=*)', + search_scope=SUBTREE, + dereference_aliases=DEREF_NEVER, + attributes=ALL_ATTRIBUTES, + size_limit=0, + time_limit=0, + controls=None, + changes_only=True, + show_additions=True, + show_deletions=True, + show_modifications=True, + show_dn_modifications=True, + notifications=True, + streaming=True, + callback=None + ): + events_type = 0 + if show_additions: + events_type += 1 + if show_deletions: + events_type += 2 + if show_modifications: + events_type += 4 + if show_dn_modifications: + events_type += 8 + + if callback: + streaming = False + return PersistentSearch(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + controls, + changes_only, + events_type, + notifications, + streaming, + callback) + + def funnel_search(self, + search_base='', + search_filter='', + search_scope=SUBTREE, + dereference_aliases=DEREF_NEVER, + attributes=ALL_ATTRIBUTES, + size_limit=0, + time_limit=0, + controls=None, + streaming=False, + callback=None + ): + return PersistentSearch(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + controls, + None, + None, + None, + streaming, + callback) + + +class NovellExtendedOperations(ExtendedOperationContainer): + def get_bind_dn(self, controls=None): + return GetBindDn(self._connection, + controls).send() + + def get_universal_password(self, user, controls=None): + return NmasGetUniversalPassword(self._connection, + user, + controls).send() + + def set_universal_password(self, user, new_password=None, controls=None): + return NmasSetUniversalPassword(self._connection, + user, + new_password, + controls).send() + + def list_replicas(self, server_dn, controls=None): + return ListReplicas(self._connection, + server_dn, + controls).send() + + def partition_entry_count(self, partition_dn, controls=None): + return PartitionEntryCount(self._connection, + partition_dn, + controls).send() + + def replica_info(self, server_dn, partition_dn, controls=None): + return ReplicaInfo(self._connection, + server_dn, + partition_dn, + controls).send() + + def start_transaction(self, controls=None): + return StartTransaction(self._connection, + controls).send() + + def end_transaction(self, commit=True, controls=None): # attach the groupingControl to commit, None to abort transaction + return EndTransaction(self._connection, + commit, + controls).send() + + def add_members_to_groups(self, members, groups, fix=True, transaction=True): + return edir_add_members_to_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix, + transaction=transaction) + + def remove_members_from_groups(self, members, groups, fix=True, transaction=True): + return edir_remove_members_from_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix, + transaction=transaction) + + def check_groups_memberships(self, members, groups, fix=False, transaction=True): + return edir_check_groups_memberships(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix, + transaction=transaction) + + +class MicrosoftExtendedOperations(ExtendedOperationContainer): + def dir_sync(self, + sync_base, + sync_filter='(objectclass=*)', + attributes=ALL_ATTRIBUTES, + cookie=None, + object_security=False, + ancestors_first=True, + public_data_only=False, + incremental_values=True, + max_length=2147483647, + hex_guid=False): + return DirSync(self._connection, + sync_base=sync_base, + sync_filter=sync_filter, + attributes=attributes, + cookie=cookie, + object_security=object_security, + ancestors_first=ancestors_first, + public_data_only=public_data_only, + incremental_values=incremental_values, + max_length=max_length, + hex_guid=hex_guid) + + def modify_password(self, user, new_password, old_password=None, controls=None): + return ad_modify_password(self._connection, + user, + new_password, + old_password, + controls) + + def unlock_account(self, user): + return ad_unlock_account(self._connection, + user) + + def add_members_to_groups(self, members, groups, fix=True): + return ad_add_members_to_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix) + + def remove_members_from_groups(self, members, groups, fix=True): + return ad_remove_members_from_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix) + + def persistent_search(self, + search_base='', + search_scope=SUBTREE, + attributes=ALL_ATTRIBUTES, + streaming=True, + callback=None + ): + + if callback: + streaming = False + return ADPersistentSearch(self._connection, + search_base, + search_scope, + attributes, + streaming, + callback) + + +class ExtendedOperationsRoot(ExtendedOperationContainer): + def __init__(self, connection): + ExtendedOperationContainer.__init__(self, connection) # calls super + self.standard = StandardExtendedOperations(self._connection) + self.novell = NovellExtendedOperations(self._connection) + self.microsoft = MicrosoftExtendedOperations(self._connection) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..834cfbc4a1d0d2ad1585972b26dc001e416cc46a GIT binary patch literal 9675 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f47074bb68eb5b639632ac6d6277f8dc551ad1f GIT binary patch literal 149 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CUrzcZxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!xb~q9iphML#z)xhTIlKdnSRK0Y%qvm`!Vub}c4 ThfQvNN@-529mworAZ7pnA2B6X literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76f42cfc57bddb3865ecd6278b2d6fb9ab35a970 GIT binary patch literal 2945 zcmbVO&2Jk;6o0e+UOSDO^eY0v3KdaTZBkJLA}ST7c2H11LXsAB)oQib8QYtzciowF zn^ew)R+JtQN6sAhFZd5QaoHQ<)EnoXcyGpEY0CvmGoE?#=6(F$$L#63Is4CFg&5WW z{)U-f9@k&uP#h;5F3t?N1rdXu1+E3X9Jo2?<-yHEuK;cV7;)qvDnhRWZV7s2aLb08 zho}NQ8(bUr1>i;CCE#UvhN7y#E3nnDGiJZcp|(aoJGRyO_D<{8^_I7NZ=ZD%{M+FDjpzc}#DZr3H%HXL5>I|(r3=WZkbZbn% zL~Ej3Fa+4OKzbvjp6Tn&r}_@!g5VL!0!^}j=i#sb`!5-h9{j})i!jWAyu(ON4u*(P z0n$8yl_F#sFI4n2XC0Qbt|IJ~K>e=QWf+zKRo%DXunfo$Umo*RK>kIi_fcPkj)E{@L9Id}?iXv1@WHi|t)tUpWvtHQ7f@@JMFqeUCBwMq9C{F9M3 zcb*KxEym^u9Diu|X5r92$LD9@_=g>V0~rvG%3D#ufJDIODN?*n*zn`P7od}e7Yv4Z zkTi(t(V_xZ|w( zkrGC@AsRT7NZ>u=*|r>zdw#4?lb^n(?y;{NH3$NsRC^Fu9cT8({&% z4oE*tQ^@1k!lB;92@4xr#e;=$7u4DPlLZfpu=N`>n56!R?buqrRm44X2NCEVt=;96+gM&}@KVFHr-@iPX#XcqxU+IN`OjOcNR}hSwCg-=4uXRc< z_YYp#S19p=q}RXtDVa$2R^Z76pL=-08&!jsCf*3ED^U_)j$B=yUi^Q~YHud~$|@>$ z%Ua11e*+Xd=UqX3S4$_kjKLN+YzRaO#_=!rO; z265`tH&dsMsHB`(q_cB4jdJEa%9)8ud=mCbAhCn9*VIe8I8rW8(3)j+-Bz%4#vwJv zOu)TOx=ir5v!c{*d}eV(sE3v8cf`ax0%Ky`GHyoJoz)MgdBqu!b@;St>+o^L=Vulo zgHz7H!}c=v2u)lxT1_MKbX!-iS?Nu!Y%FAUsB{Tn#3fnfR&_J=VjpeJic0u0=t}xF zK|3hBREi%mqH~bt)j=G%wT?(VRNBW+8{t;dF11>ZzG|}am@H4x^%725o`*py$#u-7 zgoo_|S*A@POhr#MYMDKKgj{=EIXreNrgSi^-5mCOw>s0Xvx08MSwZs{ZSRv*=DDSy z>&G3T+&LqRst}9PfM>~*$R^*RiK3XD`LB{CacTo6sL!*CMWezN*`ifsbF9eDvKl*M z)!0d-R;)U!TNl_VtBAWLJgwtcnBg${BKwdPEcp@2yoHXJJdY=V=VhSdpfQ@keLhH} zSQh(%&_$;-oEkf~JV^0%TE+%PZBGj{A)oX+<6QX)B986-Dy68R!{V6_*eO;o=Gedd C+{&^5 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/dirSync.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/dirSync.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7447f4f9bde6f7d606564b14c95764669c7a53d8 GIT binary patch literal 2152 zcmaJ?&2Ah;5U!cso&EQ2)<3aHkQM|IE0Hx$9K<1t63B)NSSSu0Mv+?MnO=L=^RsmK z2HVQ!tW6{Yv)#4T)z#HiHDA@->~>qf{Ve4VeWKs# zji(C!5vEok5s?q-P~=kLQ0kKJlEdo?B^64md~iZIWN%9CPUvQ8u;5oOoH4SkY-CnA|hgN>Ey$SvxJUw``i*<@0* zpG=-jo{EFXH8~Y4X{|K^lXh|f%5X~?gQg>+SGBqwUm!(35vL-KCxk5_}FjZP& zfT__E1B^#Y3@~+CVt{GT5(5m5V}NPV5(7+|mKb0<90xN=2uC$oON}HlTUmPWID5AgwBF~cZVi0GclBvv0kcgK-vVgr-8k~tlX2<5FXq?D1 zalDA5qLb!I3MKU-F?!S~s#+#f)rM<+)1rd?^V^m!om6YsR6Qm@JEPW!K_J<#lfsaQO8j3xLS2~+4Sp~ku3Q&%2&`va%vo03VI_3uE zChaidZ(1X7Zmg9Xh~K5de=NRs%r-?^?EY&w-X~t#(_5v;R?hYTASVMAo(PM-?rKpY z(C@64I?U(N;?ZA^q>@ui)P@L>7^u}nW7VfL3J;|dhuARZ&;J{@jOwR;i>qUrt28i0 zJCYh_=Ul#MYKsu1r!Thl#&^e`?0+=g+q-xF{>S6J@jjM&Ma|Zl+Jc#j-7jOUN2S_v8C8x zj*;o29e-4UNo-6g;#b88=$eEtxe-UlIP6GiLU*|{#?0i>I5&$)%U>2{os`=PUg zU)AY2J@=w>RnlzgU{vFlz+F^`q9sI{M~j5{ju782f~4G0Z{afa9usavZxHrMwLpfL znp1}h-?owibnLniQ6386_d+zsu{;Z<{KDH+h&R$5B=`e6MWh_OdrzvL4!OH6E1VJme3YW-q<%zH{5za{86O0lDDqdjJ3c literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e50bb18fb0bb46bb431c107dae71b7f1d2ad2418 GIT binary patch literal 1516 zcmY*ZOK;>v5U#d89^2!Y33)68A{0ehp{$fdJj4N33sEvFkisU)WF=^=WI67h*-88u zb@z}=G&w-{8yxn)fgi-Bubhzh1)QjEPhPgVRFAJ7T~+q`?RNCnADsUf1N;pS9vAs< z@yK70FaU~_0CONGP&hyxC|sZ}6dq6yh_ShlH=yu=`cO21HlYZB2DQzDJcJ?w8r51ZzQ?(ZYm&8wkqAxU_dp5~nC;OO}91KkbiflJZ0Ad9cff<1t0@nnT1ImT- z0K_+-JeWCF@4(Ex)wovUnx>-l$yvkn);KpT=$$pV4-LLeh19lMHDTt%kiY;_1u$#O z`Jn?N4C%p*3)f93KY8pGK0uO3NOO+}&RQV#P4qOK|)HAC`OdCX-p!JP6 zHyJ9oaE|6I5<ot7+`BV8~ zeNYL@=oaHL6Qi+l(GDwhv*1#uLr&X>A6KR1iJFeN_6&Ww`GmHzw>&#f$`paZtd(}9 z61s6ZRj6ngh0jZ~ecCT7HX2NYhe}~KQJ7DG28d4;A5OI=r)5UtAy>(5Hri5e1y5OG z7Fw8<6`^rj5a|eO;g=b=#Y)=ED#5q!6{2mxO+x}hd?fe*Mp;#sJTn)h&57g!zY-dk z{302rQeISo(YVUloumVFP@>8uU9RuJl1Jz}?L#kHsV0dn;!hACV)FmK+fl`MXFM8j zjY_G~Jl{HHd@}vw^0S?srQ^@%lwT@dvYld-iAq)jwNtn4XkOm-c&Zn%A+`3d&JD~U zzd`~|NMif?BzBe@pDdA(bjc!0Az2}z6O#|{tT>^&Ks+}j3y5AKUprzAy*C$hGf7yL zC5f&FbU!bOt2fH!HvWffJMX(oW83|Dr(`{%pa!$jt_AL@^~G-fY}dkOvyFK`KEeug Y@Eq?p$@vSj$SSP;j|1^tc)Bpeg literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38cf8e7477e40afe5cded3b5d31252ada2497008 GIT binary patch literal 2784 zcmZuz&2k$>5bjy6{#H`tm?X9dA*uiYLB*~ja7$82B~A*8awTzM2XWY}cE|SGt6gPg zL|HE9f^*?S!8>rEC?0_);J}H?UOD9zIPvwYYzg93ZEsJ{Oi%aMJ>6PpwYeY&Ig_1fAJnDHQ9z<1&YV-;R*GM+#s6@RcMRi*5db#jk z!y@X6yu3OXn(^yWF`EDC-kpc5`$ncZ&eBz-GKDo&9c)QIO2IA-rP8s+0^@5LsBp&* zv(%_830dLs9x?B-D^Z1D@+(0-@HMtH@+fN1E1-m_ zLIMw3Rs!ePl{5MLoqG>YY+AP_g;ku&4}TrJck${!Kn?}%67337i)5@dM}oc+R$d}? zoemwQ#$^UmFCCsbB=TVswu7ng6f;#iELo;Thgc6uos36EMBBxd28WsDO*$+yvs>oV z{T3ZoNc~FY3^OY-sSFLGd(i$U>+gcUn*>_l{J49t7zRnw55m1ptUGCD zIy?^giR_-uYfupwxjoKZR;1@laOs_zJ`SNg_*L*)tW8?c*p;=!6p;}Wkoi^UOIR3Rubx7v%t3ZBm@y*m- zKGqWo)`5q=Y`V?ipTKY$z>^jyXrN1DCM+>(@52MuV)k1PcnqJQs{w?Sbvtu873#H@^_{&I4(oeWa|ob zftPcT3-UH|=Rxk{)jUaviR&~)%b64BC-G^EgT+%KVpHu&$aRDt{+96Cc>D&2L9tO_ z##Rl1nxTq#Ks1d<0XRf9DtjmbkB)a+Nul7TDQbaThiDz4B>iaD&F-%f?=R$qM${uP z4&6jZCN{a`BfNI#quO!RaMtp=ujGr7)JAvfMKr2GKS-l2wE@a2qjV-LSgeOxs-@1W zJAvk_t1iQB^)5))DWLAK;JKen+3@~a$N=-h zU%uQH>@6@8$85?s)yB-YL_8i}nh_PCBHs}eht@aK3*-V^?z2yAp9LVcw;J3A0Bx)6 z1f_$|XKHJaj>lCo2*c4}lmv$Bsr(kLPYcFNYz zZposTm-{yBt0o@EY-HX5GDQh`j!l~H4~dQ_iA#X8?wkrCuRZ~g%QOQR;?)`ie!eWx ze!$I3$27h?gO|g}%Kgsb_0pxybODID7O@8t#5RP53@r}@WC^un5Bd3=Ti}LxVQUEV zgW0qai)MN4e(sv_Q1;FgNIsT&6@MDWPrBt9xZZ<#>U}1R5T@)c{(uEsRdW{^iXH;I z)%gDyRklXxYe|fCnrl2E+3LXQGH~+5oTxdTbFg$u!WH|vHLl>?$9zBce1DKdqlEdU z@4pxYNim}?Lb0tQiYvVOkjW=Zrm1f^TW@NZVB@t1f?m*Rw%d*Qx?=fSx0P3YKgvR! zQMQ?5oz5Fy42GF9_McZ?e#9x&YloSV%W^-IL+;zU=)JX(i4(mXrMB_*=7%aXS(qiu oCylD;t(Bt5+hb3&Gq2q!yuHPhO>?ELESAJMl*aQYj`)@S1%K~p0{{R3 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d50347d3ca3b0a607a3619d9b3ef4ddb10afaf4a GIT binary patch literal 2877 zcmbVONpBQK6n@pS_t<#wuvytk5fKa$HVH|jSPlx{ae@TK*o24{sMGGQ8MocbP}SoF z*_RlFaE$UBa>&2PKgcPUzM-7B<;*GXRn3gY1m%#Cs;27ItG9e_sXjY7Y5)1F5RC@F zUoiG7;QA{Z%EKuDaByZ2SP(IYEpRM|3*Z!h5w!qO5#ka!C5X%5lp(HwQ-Qb&PStP} zA*w-agJa{q1VI^s3Or-r)FG(CTC0{b`xWVIS^4zs#p^4#l5H;vgT1AP>C{0`ysvl*oVt!(+eec`$^3Aq;|KUn|EuXw|ck$NJLwB)#yM4c%7jIl&Yv=XF z_G){{U2Z>UueMlTQC>&5L9*nRP%Hf=aMW;+73zTnkOAy7$QT@2pw7{{%isVhNVkUc zE3_uM1^WP-7D#sh)H8j3@lfAEh!8s>S)fT41VuO~!R{+Yq{lDWK^gW7Aa5{|Q-FPh zs03M&u*wjz3ITM63ZSY-793Oo8Ir3*o*KxPbovPO)#!*A zYLHB82Aj5|u}(+G7Sv!Suwe^*ZnA7b+fj$JDEkMDH1bv~X|9ZA_F90DBJ@Eo9nVowmqk4J#jVZRRY7nYr%MF+99N%sQ& z$w-?!MTX%PV{;6SKQw&faA=>COJi{S&5pr=3@~$Z!o!Rj=%YyC%u^aX_5$^ z5__I|d_C6#VfxPVY(wxUR2fe@d_d<}%B6_YZNWP-jd@q5 z{hk^ZU?~5(Z^(RSLr5_a=HVIzu8V=pU|diq+@0tChVZu(@1)YG;$jyK5{WOkhpy;d zm~@8{$L~uoRKgWh*XxNy7%)~f z*oyZRM&a?PFRIl*N>-%Ela23&lWr>!`g4qVv?F2wp(lV zic>S0g9#yRr0VJQy}2yz&Go|GWrEv_qRZ=n=jGr&6O;J{3G z@wM`lP`Nz{kjl%(o4g(f<;$=~C5|tTNwKFkPtpvN1Izst>VacE(JS=UP-0Kr1ZpmW zP!4>`OPFFpwk+*cUJ;RqMUowb^T?^?Bd3n3r0i+Z*+rZN+4DYS&qyUUaO(NGu^(42 z>Eb}SJVk4kH-?2j45~3^1nvsyG8u3`FH8NJ=T?9S#aMw}SB$J9Fh7j#$5Uq$*V)M zJVV#X=e!t%eujACvK*&D*x8eWLtY9q5v$fjZXdlJjy)D){( zG-|BLnpWAGWMy{VnqcQ}oJMNRYOsbihbK)|V>5W#z%k8^ILyAxK4K+HUO<`42tdVk zgVc9jXUb2dm=(Le&}F7HfCeqlq0%spho+z5>oSWij~byCXhJ{gfX2h>0wRwc`WmIG OqNtY7onarcM&%!?#hnJ8MqN(e0nga#=)DB(sFv6?IhY00d1HV3Q-$8q;eob{Kw zd!!w-dw}J4aO1!afZhve*HvAw%MT`#!Q_%QU1GB!5%10d_4Nwn|4p4_k!+tM7HAEdDje388Dn^|kO~?6P=zd&zFnk ziRGUiuU?#-XR8;B#qnxIk)g`hBIC{T!ltxeNNY@MK}+p1;0kyP$USI=D~20}YceS4 zS(n<=zU_F!uy$C|u7?{R*S@0#csqc4_|?_a(*Mmc;-~ z>lhavYDMkrk7bI4dD*h)O?Te<7(o|n;b|z4}rbx#d zp|jge=}5nkBIlW%0+|qB4(*|-%uA{xE(_r! zh{9ez9d4D7G+HL2pq6c=Tm{22clZxGQoz68&UM|*yRv&&HcIDJ_3$+p+ufI!kLDH6 zyT|{dxYVNI^SUf#tJ<}mZyPKBQBkzpMjv)NbC3GygIV53KcW2UfB-CJWA>RhW*^ep z^J0I>0zYO`ir!~mdGY~qW@9tVGTs(hX3&clZ*^IzL;9UugYWuH$4-y_1ywIv)RTGR jUcsew9li%2P#F_Fq4(KV;;9`IWknD7r|cuT%+&u6&=?Ch literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/addMembersToGroups.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/addMembersToGroups.py new file mode 100644 index 0000000..fb6528a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/addMembersToGroups.py @@ -0,0 +1,98 @@ +""" +""" + +# Created on 2016.12.26 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ... import SEQUENCE_TYPES, MODIFY_ADD, BASE, DEREF_NEVER +from ...core.exceptions import LDAPInvalidDnError, LDAPOperationsErrorResult +from ...utils.dn import safe_dn + + +def ad_add_members_to_groups(connection, + members_dn, + groups_dn, + fix=True, + raise_error=False): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :param fix: checks for group existence and already assigned members + :param raise_error: If the operation fails it raises an error instead of returning False + :return: a boolean where True means that the operation was successful and False means an error has happened + Establishes users-groups relations following the Active Directory rules: users are added to the member attribute of groups. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + """ + + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if connection.check_names: # builds new lists with sanitized dn + members_dn = [safe_dn(member_dn) for member_dn in members_dn] + groups_dn = [safe_dn(group_dn) for group_dn in groups_dn] + + error = False + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member']) + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_members = [element.lower() for element in existing_members] + else: + existing_members = [] + + changes = dict() + member_to_add = [element for element in members_dn if element.lower() not in existing_members] + if member_to_add: + changes['member'] = (MODIFY_ADD, member_to_add) + if changes: + result = connection.modify(group, changes) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + result_error_params = ['result', 'description', 'dn', 'message'] + if raise_error: + raise LDAPOperationsErrorResult([(k, v) for k, v in result.items() if k in result_error_params]) + break + + return not error # returns True if no error is raised in the LDAP operations diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/dirSync.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/dirSync.py new file mode 100644 index 0000000..e5dd8ae --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/dirSync.py @@ -0,0 +1,94 @@ +""" +""" + +# Created on 2015.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...core.exceptions import LDAPExtensionError +from ...protocol.microsoft import dir_sync_control, extended_dn_control, show_deleted_control +from ... import SUBTREE, DEREF_NEVER +from ...utils.dn import safe_dn + + +class DirSync(object): + def __init__(self, + connection, + sync_base, + sync_filter, + attributes, + cookie, + object_security, + ancestors_first, + public_data_only, + incremental_values, + max_length, + hex_guid + ): + self.connection = connection + if self.connection.check_names and sync_base: + self. base = safe_dn(sync_base) + else: + self.base = sync_base + self.filter = sync_filter + self.attributes = attributes + self.cookie = cookie + self.object_security = object_security + self.ancestors_first = ancestors_first + self.public_data_only = public_data_only + self.incremental_values = incremental_values + self.max_length = max_length + self.hex_guid = hex_guid + self.more_results = True + + def loop(self): + result = self.connection.search(search_base=self.base, + search_filter=self.filter, + search_scope=SUBTREE, + attributes=self.attributes, + dereference_aliases=DEREF_NEVER, + controls=[dir_sync_control(criticality=True, + object_security=self.object_security, + ancestors_first=self.ancestors_first, + public_data_only=self.public_data_only, + incremental_values=self.incremental_values, + max_length=self.max_length, cookie=self.cookie), + extended_dn_control(criticality=False, hex_format=self.hex_guid), + show_deleted_control(criticality=False)] + ) + if not self.connection.strategy.sync: + response, result = self.connection.get_response(result) + else: + if self.connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = self.connection.response + result = self.connection.result + + if result['description'] == 'success' and 'controls' in result and '1.2.840.113556.1.4.841' in result['controls']: + self.more_results = result['controls']['1.2.840.113556.1.4.841']['value']['more_results'] + self.cookie = result['controls']['1.2.840.113556.1.4.841']['value']['cookie'] + return response + elif 'controls' in result: + raise LDAPExtensionError('Missing DirSync control in response from server') + else: + raise LDAPExtensionError('error %r in DirSync' % result) + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/modifyPassword.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/modifyPassword.py new file mode 100644 index 0000000..e304caf --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/modifyPassword.py @@ -0,0 +1,75 @@ +""" +""" + +# Created on 2015.11.27 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +from ... import MODIFY_REPLACE, MODIFY_DELETE, MODIFY_ADD +from ...utils.log import log, log_enabled, PROTOCOL +from ...core.results import RESULT_SUCCESS +from ...utils.dn import safe_dn +from ...utils.conv import to_unicode + + +def ad_modify_password(connection, user_dn, new_password, old_password, controls=None): + # old password must be None to reset password with sufficient privileges + if connection.check_names: + user_dn = safe_dn(user_dn) + if str is bytes: # python2, converts to unicode + new_password = to_unicode(new_password) + if old_password: + old_password = to_unicode(old_password) + + encoded_new_password = ('"%s"' % new_password).encode('utf-16-le') + + if old_password: # normal users must specify old and new password + encoded_old_password = ('"%s"' % old_password).encode('utf-16-le') + result = connection.modify(user_dn, + {'unicodePwd': [(MODIFY_DELETE, [encoded_old_password]), + (MODIFY_ADD, [encoded_new_password])]}, + controls) + else: # admin users can reset password without sending the old one + result = connection.modify(user_dn, + {'unicodePwd': [(MODIFY_REPLACE, [encoded_new_password])]}, + controls) + + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + + # change successful, returns True + if result['result'] == RESULT_SUCCESS: + return True + + # change was not successful, raises exception if raise_exception = True in connection or returns the operation result, error code is in result['result'] + if connection.raise_exceptions: + from ...core.exceptions import LDAPOperationResult + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + return False diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/persistentSearch.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/persistentSearch.py new file mode 100644 index 0000000..455bedc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/persistentSearch.py @@ -0,0 +1,117 @@ +""" +""" + +# Created on 2016.07.08 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from queue import Empty +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Empty + +from ...core.exceptions import LDAPExtensionError +from ...utils.dn import safe_dn +from ...protocol.microsoft import persistent_search_control + + +class ADPersistentSearch(object): + def __init__(self, + connection, + search_base, + search_scope, + attributes, + streaming, + callback + ): + if connection.strategy.sync: + raise LDAPExtensionError('Persistent Search needs an asynchronous streaming connection') + + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + self.connection = connection + self.message_id = None + self.base = search_base + self.scope = search_scope + self.attributes = attributes + self.controls = [persistent_search_control()] + + # this is the only filter permitted by AD persistent search + self.filter = '(objectClass=*)' + + self.connection.strategy.streaming = streaming + if callback and callable(callback): + self.connection.strategy.callback = callback + elif callback: + raise LDAPExtensionError('callback is not callable') + + self.start() + + def start(self): + if self.message_id: # persistent search already started + return + + if not self.connection.bound: + self.connection.bind() + + with self.connection.strategy.async_lock: + self.message_id = self.connection.search(search_base=self.base, + search_filter=self.filter, + search_scope=self.scope, + attributes=self.attributes, + controls=self.controls) + self.connection.strategy.persistent_search_message_id = self.message_id + + def stop(self, unbind=True): + self.connection.abandon(self.message_id) + if unbind: + self.connection.unbind() + if self.message_id in self.connection.strategy._responses: + del self.connection.strategy._responses[self.message_id] + if hasattr(self.connection.strategy, '_requests') and self.message_id in self.connection.strategy._requests: # asynchronous strategy has a dict of request that could be returned by get_response() + del self.connection.strategy._requests[self.message_id] + self.connection.strategy.persistent_search_message_id = None + self.message_id = None + + def next(self, block=False, timeout=None): + if not self.connection.strategy.streaming and not self.connection.strategy.callback: + try: + return self.connection.strategy.events.get(block, timeout) + except Empty: + return None + + raise LDAPExtensionError('Persistent search is not accumulating events in queue') + + def funnel(self, block=False, timeout=None): + done = False + while not done: + try: + entry = self.connection.strategy.events.get(block, timeout) + except Empty: + yield None + if entry['type'] == 'searchResEntry': + yield entry + else: + done = True + + yield entry diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py new file mode 100644 index 0000000..86b799a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py @@ -0,0 +1,99 @@ +""" +""" + +# Created on 2016.12.26 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...core.exceptions import LDAPInvalidDnError, LDAPOperationsErrorResult +from ... import SEQUENCE_TYPES, MODIFY_DELETE, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def ad_remove_members_from_groups(connection, + members_dn, + groups_dn, + fix, + raise_error=False): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to remove from groups + :param groups_dn: the list of groups where members are to be removed + :param fix: checks for group existence and existing members + :param raise_error: If the operation fails it raises an error instead of returning False + :return: a boolean where True means that the operation was successful and False means an error has happened + Removes users-groups relations following the Activwe Directory rules: users are removed from groups' member attribute + + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if connection.check_names: # builds new lists with sanitized dn + members_dn = [safe_dn(member_dn) for member_dn in members_dn] + groups_dn = [safe_dn(group_dn) for group_dn in groups_dn] + + error = False + + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + else: + existing_members = members_dn + + existing_members = [element.lower() for element in existing_members] + changes = dict() + member_to_remove = [element for element in members_dn if element.lower() in existing_members] + if member_to_remove: + changes['member'] = (MODIFY_DELETE, member_to_remove) + if changes: + result = connection.modify(group, changes) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + result_error_params = ['result', 'description', 'dn', 'message'] + if raise_error: + raise LDAPOperationsErrorResult([(k, v) for k, v in result.items() if k in result_error_params]) + break + + return not error diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/unlockAccount.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/unlockAccount.py new file mode 100644 index 0000000..b1c65b8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/microsoft/unlockAccount.py @@ -0,0 +1,57 @@ +""" +""" + +# Created on 2016.11.01 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +from ... import MODIFY_REPLACE +from ...utils.log import log, log_enabled, PROTOCOL +from ...core.results import RESULT_SUCCESS +from ...utils.dn import safe_dn + + +def ad_unlock_account(connection, user_dn, controls=None): + if connection.check_names: + user_dn = safe_dn(user_dn) + result = connection.modify(user_dn, {'lockoutTime': [(MODIFY_REPLACE, ['0'])]}, controls) + + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + + # change successful, returns True + if result['result'] == RESULT_SUCCESS: + return True + + # change was not successful, raises exception if raise_exception = True in connection or returns the operation result, error code is in result['result'] + if connection.raise_exceptions: + from ...core.exceptions import LDAPOperationResult + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + return result diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba07e29a08a2470205a6be7b759eb01a23b115c5 GIT binary patch literal 146 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CU-tSXxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!xb~q9iphML#dUEHx)bKR!M)FS8^*Uaz3?7Kcr4 QeoARhsvXGSVjyM!0HT{D4FCWD literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/addMembersToGroups.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/addMembersToGroups.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..376ed703ffcc10652d562343b976d4f98275214a GIT binary patch literal 4608 zcmcgv&2QYs6@TRJa=#?)N-IlNTBLMQz}X;{jix9H!*%OK>%u_oxRzSSL{frUj8`A>}_ ztI(*vXU{(K)qbkwyy~!+S_?k)RN~nd>Z(d`rXZ zdqp}~;we^GqF_ZSG+4q;n=FT#TcHiNO7{V3ti{VJlp3wW_AfvbK(|P49V#W-xNngB zgEl3=^hQu%IDb=MW=u`7?q6qg%VS;Gh2KSH)CUFHf-7FWl#5Uk7HJeLWTx2x3caGh zY|!HZ?ZHNa7yMdPpBJ1o>9M9JnsXCKs!8&W9=G^q4^_fagRYF0N%oXN+L@d!fP>kBt(AtM|Km(92*Oy7%QGu$&XxfzG1XYp7BB`EPOM@H z2STR)A3Bj44ZDal+8g>Roa>GsJrrr_WwyOmD(D z;FZ;xa|^;4P%x3RP`7UEq{ePtf7Ey_rF7SKqUigtx2={7*6rZ|cWhji9JotrlhCZC zS%|F096m|i6;W4u1Lha*OKEW*)h2O#j;j)NH6HQds~}&Vw(&$?$ABh?P5nO36x>!c zIv_qyf2Y%-LEE43Rj!1p3fa~Zee+UM7QW~MLAi*fYIu6%V%#5G9C(8ZUI3Q({)Jsv z43EEa^zDnj>kQt^Msb7<;$95G2g3I+qCQ!Tcfud3ow_+Vepk5W@ zc(UMToE0H&@!V?|GGJew0rmr;`(={2KxsM1FLDg%&x#`?g)L?0EU-ahq?-mcj_2oJ zQ9K*tcoh11Ij~LV0I3`9U9NFz*hheXl*<2;Ud@S~l zlVWrnbghMb5!+Hk1Dx8zs>eMk9M|R_nu!7N(2tW!J}sFbNzwJXvE-kiU~uSqd&gD- zy=>ZV`%F@sTxP6V-l*Kbs-~R^_YSLovmYKON4?dW`eJ7rB`K*x*lMUBzf+c$lwe}6 zn$EH1O1dH4K(2A(-{8UIfHm7HcY98-FCuGgu8VMy&{eJV`Q4mNBqcRrEoOdl_4zVq z>gk3o%Cqczm4|g6xFM?6nY{AiKK?3{qCaDxW<#s${1}>{S2c{hf-XtS*JGFD*u%dHsNxAb%HZ|L$o z;=k3dCuQ4q!>(;xjczE#ra0;fbv{QapGfgs5o(&J!`SnqO_Y$iu53-UvT;94Dp$Zk UT&b?|=@_xDvEJ0asWl7#0cTa?eug{ zs(KPTnvu|&XCxl^0X!ff@oNxLKP^H$Q~6AP`^q}HEk1CP4ZA}nsST07HzlZ5>bCH zU_)CZZ%fZtUDxxvec9iWN_XR^d!VA>KtC^}T^2vt`0&$@!zXUwdmCX#sYta8$=r75 zv!8VCt#`URpMTofPKrPNaJ!Qe;PsgAUcq<;?^ zVxp0tSkS3OdWp*ig2s?QZsqbDTxPk&4jUKf*ca%z@z53HB8`ZSEE*NrlQH~PpcrNR zm&hyAfkmeUYg{tjN_12v{VP+h(5OVGf*x2jE)zP0H}gJKQh(sq2SplJxQRPdC|ooh zYAoSN>nuk%IDQ$Pe}onMnc{{qrAC*a`wMI@x|De{mSNKJqcW+Am=U0PIV{it(YVSM z&opu0n`io#CVjEJ`L2$tw1KI3IQG|U^r)7KYIJ;uUAOV@7LDsPs?$-EPT|=aJ*trU zLU{AEJ(Xe!knRg_j(z-iU+g~qfOb(E6=>hW!C7#>#Fo`v~Oo}JC1A|M*c|;;q2H{g5z{{Xezd! z9!e!AdR&yDWKXg>>7{CvjE9OxKSfIv1=0=ms=Wg<_I(9Apdz$))R5Jn2?n~c?FPX_ z>!JH(GR2`ku>H_9rxsi@nzV#ZyqBsnMqtq}jm`5z^we0t40}?uE_MjU50xLEbRG}g zK-+E{D}QeoOEY-=Q1%{ad#I&a(W!@W+hESB>2u%pHPp?%wD-(QYx}vIZC~4A6x;h| zzp{xpKHf|x3JS$%58b3_E{aa7`mLnX(IZ6tje8D0>)at{|dHsIAiB0k5z zw&-!0wtvTgtQ15~rD|J=wR$6|$UydG7^`^L5Zg$O( zNigLDlULvty?Q5zdf3;yDCFb+y+xZvKRCT3!J)Gr9i_taX>ZD{O=iHIJ`%gCLJxrae z=~DcAEz~ z#rIal7g)tX!kI$|nz3Isxuu0{7S+@o1aCgT4>3y)LEq0JTozmrdt=uR^T_z$0iY*S z`!WDhZ$V^`M_uI71a{OVt}b!5%-P$VP0(N#SJV}50?8uv4rexJ-{NfA{hO#d3losY zz-IdQ>O% zR}w;i$!&ig3i=t?NK^fdMh)}BV(<<1KtQe~T0`QCetR1-Dh1$*O8-AbQ zz6Z_`8unn%G^cz9T5t(VHRN21S)XB2+y$)WJbhwL6AdJ8l5ERUSKHa;e}5Pl(>8G( z&IuQ0mi&DI(Ox4B1~SaJ+j`1;rfYfWTG=@PhybiKWJ+%M3IsG#C$<^}Qs2(eg!z|o zvh-~C0Pzv*Z^bxnYrw3@vWz72sP&3syGs*(Uo~udp?b>Ca`jd zbqd&gr!jLRoO$zcCkv^##Dnwk*PhfiuGi8wE>?|{OH28H^VG<>lyQIzswQ`R=VGSv z9F#d1^8u;yoExMe+yKE@E|gp`AG=aNWI8izn4A3q%hb1#(L#RpuZc4LTH+EX5P`B) z5KH1RYBg(46b&_KaUaltmUzcfD;RwbAJ{70t{3&XU1t%WAGXpXwG(}0n51F{JM+Cr z$yIsWlZF#(s=UIt-- M)eD8@jpo`v0Cylt(f|Me literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/endTransaction.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/endTransaction.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20121f90e424e1b31445e6581d6ec8c685879d5a GIT binary patch literal 1669 zcmZ`(OK;mo5S}F|>JiCNQv|VFx9O<>QG|-@ps4{PC}6m`sX%4)K@?c9fKu4e?CkFB%s1ccqrsr}_a93A)gk(awmt{? z*BIr`5HV2zDJZrm5tLdKSR{CEQ({x ztFrn&Oy;USxVusoc~+`ssWat`S)|~#9jhphm5y-9=G!Fr4NM9NA{$6+l_nw$Y|bxs zXcarMhTf*Q!+9Xr7#Z}8?((*&cdy<D^D$}r;SBeA-V|1FF&jM9eycuOL=Q3O>$ zg^bar%315Uh2YtmEDn$S@t6Kr&z|~Ye>^^ZK0bkR^xPjmJ@$`0H|XmI8kvQu3I~?_uTN^HG%+qheM(nPp`aCdrdu zVl}^h_U>qu#9?u~lFC$Ul;v+#l8jKit@Qokx^|;Hdo_Fg8C;ei8IkDX*B6V2ccJo| zeHW96W95(IW8Gl(JCvnO`iv^0+@M^7t}J5_bZPM_=y`yW9iSMM%?REIVQjGf>QII< z5kX;TK)!4-;7im3+iem{hxB`bg!K};TXed#sC>_?U76Z+isPW|h?c zrC8s8hrUb-Q;HW*uJ;WdhQ0@kjCmVQf5;w_10rAbNS}}Z`i9Y~)t@p!KN|4tiRMu1 zmSLi22g3%0SgvVXyU^xIRd>1T&$Z6ACkzlf$<_CZyqG6prT8pP9K-R7X*NFpf2ljWvKhj7D*87a-D#m74#ZSMm+ zzyR)IDeIn;X&%oL*85VvnTJWUq6ctfDyt7!`-BD8XiJ#lbJIP>Fqrg3-+eIXyPB;N zuUEIFjPpp!VAwRWpRZqD!^Pl!q4O$_^2BdC+`J^_>CjBrpf|5(N$E574V{hStq@E^ W97o+bZ4!CG5SU=x{h>G%L;F7rP<^)m literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/getBindDn.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/getBindDn.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c20f2afbed7c4a051197acf01330a055b4cc9513 GIT binary patch literal 998 zcmaJ=PjAyO6n{?AtSv1oTmT{135f_TUAl>ZG@%NZCOCA5ApyBqS?o>OQYW(=v`*a0 znQy^?55y%`PJ9JUJUeUIIN-=Hzh^(cKfh<+>G!)ozH$Dw1@IHD3=i=br!s;8#3%_c z2XX>a2Vw_^(Ot-0n0gR@IT=W!>y8VW6p));0 zd~5eybHO;%YcblyNqOXog(#O-t31)%IKUH+aPhKCmjt9wF7Ev;^B>zu(5lG^hLf){m#QdXpt#;c_) sbdeT$*fgkV`k-lASS((LG#>2fD^)H7)$N@ozZd4FE5o0EcR&X2A2+n&SO5S3 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/listReplicas.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/listReplicas.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a520e6ad8924d54ab21a8145c77589c911ab68e GIT binary patch literal 1568 zcmaJ>OK;mo5S}F|l9Hv`Nzlh3MIWc|5K461x56ZAsz$(|G?Vt(0+)b ze?wIOaMTP62PA`q1Ka^da~Grw3lF&0&pnU>SopyGem(#hz#;@50{f=$p$Om&dI~@| z@Vg6q2t^2o(XeBqe_f0evF^s>S4LEYD86lk%1l{TxVZ6yXk?jZPfBfY>OVR7`n!WU zT7k}vL|Rlie!Lpw=^={VMI|tK%oMeAQ37VbUCO=ipcud#M(MAT;{)0{jKXeA(Jlh( zoS`oo^mb4lq1XV3!#O~TWjWShV6Zr_whP9)w5?w{i7)^L@aD^px8vl?_^X{+oWx0T zZ#TJ*#`bQU%y8xYJGZxIU8s6cbQJKh5+|+DCatoC;1eZuQ&(EpsTyFa9j^5!PBYmG z<>4A1X1YpJ-H4puTz!%mqsnKk5eToRg*^HT)CQh@`)Fzw&9o_-yJe+KCgt5{g=o)q zUTsfhku~=&w6Oh~R`scnaw^v_jGMF0&+F=_eEu1sH$nw$h|d_G<*jwRGJ(6bza85LNLPH7Wxw!XEWl`G5Y)be+Ks}2Uuc-M7C^0G?2M_PpePBLkhke zf%+a8V^?;6sTllhG4STAki=&XRM)lk}{PiZhMmD3(2+KblIPu}o)`#41wNa7N zIq{4K7fifX|J%_XwLh;H&HjvBQ=B0zXIB7d>ZX;M5h*gTl_uVkb)HGRkH+Q4itvkE zzEz04#$N*+wfye<{-bXA<5?pfD^;tA**@otsEupNasvOf@F|KWiXrcVO<&R4JQ{UDnih4A zT-@p}QCwgC11(wkW}|9T=e3Oc+tuIVt<|bJ%6Gm<5=&ejwx*OiE~=i)6k{zHn;Iq5 Ug?oK5`_vtKC;gAMn0?&;07Z3Rj{pDw literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/nmasGetUniversalPassword.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/nmasGetUniversalPassword.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d21955fc166b6bfd20f0fa7a4850869db4110349 GIT binary patch literal 1666 zcmah}&2Ah;5U!q?o&AZ87Z4%=BnJsZ_K>wVwlI-aC=r+l3D!{@LNbcfn#{DxI?q6Ab>9#A1@7Elt9;B`nvNVABNh-NKHS~QC(i5po&MVn?FN;)KNCx`AnSKon3w$e_Uj3xtz|3_>0e0(>qQ2Ly zdGJ5L`~uS(1GuL|5_kok5oCcHc|If?o$=lVpM+I{v1oE~`Py*w>F~4d&EaS`8g1>2 zu7laSKHSFsCN{TTdt%#l>IKGwcCw-yoMoBLRI;j7gQs8W2o5{!`Aof}%kiJ4Tq*J6w&`$y92RS)Jas-XByI2G?&N)fp#I@OZlylMo zc6m97HP@Q!NI5O1R?6f;_E=?4Jjh13A=5Dvj%5((3w*c-e@m5do49Chly)8LSX~vy zquP*FzSal%1apDK+X1i$R>jGOOR+d}`Ibx5)T^ zNpM~g()f61aUZR7=@3vt)4>^T(1cxRD$!bvA?Rz-`1^95BHN-TJ<`9B5aK22gHq6a z4{$uuYw*y8N^92wskDoIN$0u?!5~ihxymZMH1e!CT{tbRi?N&+Ht9T0P4i-e#%kBS zdt9qs)-wWYjsu6i_|LC2L+q3V%`AZ!g~*280-iDeq|}(uP7MATnyZDQo5d$ zvnrn#%&$oKbeUHv|D+)U?)&pn=YTE{e8KT37SlWYBYMDf22rx%HdY z8dhfyudl~st=5&TvZ@$1J?Hz~H@Gjyq%*hE!VL4WDN$B?&b;@AeQ=#|wWHS2mcPT%O0RDnYPk{P; z9Of4k0w6`nKzN`SlpdrWF#7jF`A`Os22c(l9Y7gE8uqpT)DX%D(g@hMVgMq9H|Qk< z>A`Cs(hU$pIE*)RKG`NM-l{{1%(9`gO4f8>w%A02*ou*9Q>COeW` zR5?a+@laUzahTgEB%**Rqx4o-U^=N!Acz1k!8eR>zyvWbGGWTTOK@vlY&k=}^w8JC z@ih*27=n8Sz!5LcDGV&422S_E2IsmvgI40HfQJRk)9c&G;;ZD&?yY2zEEYSr7k5$F zxtr|b{4JbZ{O^kGE^1a7$HR22dz^Wdl`@@Z+2iScb$|hPIOmw)Cq#uF;9R(!A`#ysnOlU$3KcGeQAu1K%;er`Oi8k@S0(IVC_3eJMf53epc2 z;Mfs!h7vjOfuVNnfllDeN$ZpHn!ziNSVCrwks=0rWL}bOHRa)y4>|*st0^D$RvdOi z$_=YM9U!!#N=KD^&K)Nr4mFi!7ja%xh2=cm%zu;lQ^$wVL$v9T1f?Ah^d>DHVQQ7k zsiV4}HRyPJ;SoEji_mU$t&F3i7ZY+aL-8dJLkh6>*_4gF2@4sG)6dpIc^=$S&LSYKIZ&c zo2lNS-$TC+P`yPO75*jR;KpkhuHi7mAXe*ex~XYy8IQUl=c3M$?^)jlNqv4vx`Ifj zjjnB-*DC4z!}X?XMpqAM)Y?LsL{xo^klRbgyJ#qeF52tkzeg96p=IILjD5mp{=WrC BfII*I literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/partition_entry_count.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/partition_entry_count.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cba2081d0066923b3a13e81443449d15ada799e GIT binary patch literal 1674 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 X9i+sy>js|y5pNV@sjhuRtLOd$#s4VV literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/replicaInfo.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/replicaInfo.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4235b4cbbae515f7f67fb9435fcfc0cb461eac8b GIT binary patch literal 2276 zcmbVN&2HpG5U#doJRXlHGf5VL2&{4eX#|<Fx%Jus(S>9Qyd_|tMjeP;c!By|;0`=TWj%NbX~_%qWgtp^Y1GooS~B9%=Q)>w!W&3M#KSD&lE@;Ma6d{zvSj{{=7%_n z9h^AAhgjik%s@nM5HUor#_RN+1OsKjbI`QbLc4fB;GK=}^v&(z=)K|YgL}i#a5TEVGkPD1?VaK19&&d6dwaKX z^FXSYU_hS-P0y7zW_}tZ-0MnSYoy<-pbXHKq(m?mWpE5D7cvX z3UV1G{`z=JCHYn!=bLd_s6dF#!-$vX56-r?L=@!rXEUdeMq6oi%7xgH*I^vy=am&^ z=_EdSn?NEnfVElMaM^Ta0n=f9XdE`_1U~d_;LzB9hr|VgV*t4c7Y4|6PzW_*%itM8 zZ4#e2rskLg`>{!|qtr!%QkCIpTpuI)4EFHgY+=Bj4u?6e+69-VTq2rs2^Auwo$z}e zo@fLM=^{@$I90aq$7!s5U-tAl*(a`pE~Gr9fXF*^mM*DmK zC_JDVGu%i7(;NMNIRW!l0Sk^>*LpBSGgXcME!n(P@`hK|4FUUKFtq;(L+ggXt+?4Q zE6|3$uhP5FP!60pAb(@{DD0@%NE!Ud;G2}e*BCWfX?ADE*2(FPJv%7U(Lv5bZ=vqv zi0WK7O&`lsac?=vqIiN$RQCmH!=96u@`(GIUJ+Rs2>-fs#F0)@Y9949>OALFb0UJH zV)}ZS28V)gsBEL|vKvKtSSakhe7atyCu#OWdd=F9JPEKa(xZXv^=pC1pZ6F^`C3`C zZcUY4nQ^Kr3lEe+NlNLeU#f5-vxIC#f0A6b^g+~FwfE0Lp6lwekU21Q)p_kJljgsI z=tiYgy*$fHfku-tsB0I+i+6FNsx#SLwmKVc;FrdHP2V-F#%04|)AhxQym8~eqMkr~ z*Y_*O_b~{iAlmi)r)41O9l44sb=}JiqNu|zOu8%J-yhz>QIL-=b6dTRB;I(?uUftz zWg&JQ!piIC=adpd3fQnr<5NkXdc81{e8}fm6_PIUdb!M07G`2t_h^l){wa9vZ2mXZ z&CPR46^mj>ck7sWcFn-9s5>B8vtYG$f=sXMz1r;$=$ELwn)O=Wz?Z$s`t+KA0~kpI AwEzGB literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/startTransaction.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/__pycache__/startTransaction.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f3464bb70341bbc4f4c1c50a284a385681b09e2 GIT binary patch literal 1804 zcmaKs&u-gB5XNUkiuzM2mQbg*8yC)@D4+tNB0H!Xz$gM3fp02M8%eq?uwclIp@brt zB^5+QdU9T+hdxj*y!O-w=%uHAvy^1nE<%B$;SRa8-*0DjtJ`h=`McKtG>QJAwabP7 z1b6-`OhhDM1w}QA1x;%tYb5yDq1d6ROVXujon)P+9!al?xfC~O+9cT|aT3)j^5`RG z@krO`(jnQRs6nTLW+~c#JIFE+W&i2>LMM@qe$2E9ib#7u(ZS*9F`WHFfAsLc z9}PU&F%>SA1XC@$Mpu07qj8b4#Fz!D-Z4>A$Czvdc`{OYrbEzja~;3>gUn}${ChGi zrr9u?WDh1uUIcOc;ANy|^GEOZhjA2S2Meq1Mh=toosQ!nUc3gt&*r5E`mZME_c3XX z>H~}xejRbKbrY9gy*UnfZ}{SWUb@BhHJpOzwI%lf)>ao+CrG}=zSZc+!g4+h>rifl z*9&dn7|v8Sm6{}zLMhY2BSzai+QzC9ZTGWmE-ERvj4IQ?OXd#DH@I_NE{V^@#m+5t z%h|701+%vDUciAo)`ChDv~#&GY`(pWIJC3S>(bHlWRKj!p*L+ZrzC^`fUD@wiJ%u2 zNqsE)Yod?S^vy)`&hWqNt%a(7s@oD7xTP~m3fYTvn4($LvZzWA-YhQ47We5>V^T8^ zmevg}b+3zUzb{51{#B@0=*SGnC%@&)h zrC86l0QdGDZrkJ?(eXCiPQ&o%7-wTcsVEJVlD+E0@YChVZ+lN}WF{@rFpd4{D6vPD lJ). +from ...core.exceptions import LDAPInvalidDnError +from ... import SEQUENCE_TYPES, MODIFY_ADD, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def edir_add_members_to_groups(connection, + members_dn, + groups_dn, + fix, + transaction): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :param fix: checks for inconsistences in the users-groups relation and fixes them + :param transaction: activates an LDAP transaction + :return: a boolean where True means that the operation was successful and False means an error has happened + Establishes users-groups relations following the eDirectory rules: groups are added to securityEquals and groupMembership + attributes in the member object while members are added to member and equivalentToMe attributes in the group object. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + transaction_control = None + error = False + + if connection.check_names: # builds new lists with sanitized dn + safe_members_dn = [] + safe_groups_dn = [] + for member_dn in members_dn: + safe_members_dn.append(safe_dn(member_dn)) + for group_dn in groups_dn: + safe_groups_dn.append(safe_dn(group_dn)) + + members_dn = safe_members_dn + groups_dn = safe_groups_dn + + if transaction: + transaction_control = connection.extend.novell.start_transaction() + + if not error: + for member in members_dn: + if fix: # checks for existance of member and for already assigned groups + result = connection.search(member, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['securityEquals', 'groupMembership']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': + raise LDAPInvalidDnError(member + ' not found') + + existing_security_equals = response[0]['attributes']['securityEquals'] if 'securityEquals' in response[0]['attributes'] else [] + existing_group_membership = response[0]['attributes']['groupMembership'] if 'groupMembership' in response[0]['attributes'] else [] + existing_security_equals = [element.lower() for element in existing_security_equals] + existing_group_membership = [element.lower() for element in existing_group_membership] + else: + existing_security_equals = [] + existing_group_membership = [] + changes = dict() + security_equals_to_add = [element for element in groups_dn if element.lower() not in existing_security_equals] + group_membership_to_add = [element for element in groups_dn if element.lower() not in existing_group_membership] + if security_equals_to_add: + changes['securityEquals'] = (MODIFY_ADD, security_equals_to_add) + if group_membership_to_add: + changes['groupMembership'] = (MODIFY_ADD, group_membership_to_add) + if changes: + result = connection.modify(member, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if not error: + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member', 'equivalentToMe']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_equivalent_to_me = response[0]['attributes']['equivalentToMe'] if 'equivalentToMe' in response[0]['attributes'] else [] + existing_members = [element.lower() for element in existing_members] + existing_equivalent_to_me = [element.lower() for element in existing_equivalent_to_me] + else: + existing_members = [] + existing_equivalent_to_me = [] + + changes = dict() + member_to_add = [element for element in members_dn if element.lower() not in existing_members] + equivalent_to_me_to_add = [element for element in members_dn if element.lower() not in existing_equivalent_to_me] + if member_to_add: + changes['member'] = (MODIFY_ADD, member_to_add) + if equivalent_to_me_to_add: + changes['equivalentToMe'] = (MODIFY_ADD, equivalent_to_me_to_add) + if changes: + result = connection.modify(group, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if transaction: + if error: # aborts transaction in case of error in the modify operations + result = connection.extend.novell.end_transaction(commit=False, controls=[transaction_control]) + else: + result = connection.extend.novell.end_transaction(commit=True, controls=[transaction_control]) + + if result['description'] != 'success': + error = True + + return not error # returns True if no error is raised in the LDAP operations diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/checkGroupsMemberships.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/checkGroupsMemberships.py new file mode 100644 index 0000000..0f65b5d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/checkGroupsMemberships.py @@ -0,0 +1,180 @@ +""" +""" + +# Created on 2016.05.14 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +from .addMembersToGroups import edir_add_members_to_groups +from ...core.exceptions import LDAPInvalidDnError +from ... import SEQUENCE_TYPES, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def _check_members_have_memberships(connection, + members_dn, + groups_dn): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :return: two booleans. The first when True means that all members have membership in all groups, The second when True means that + there are inconsistences in the securityEquals attribute + Checks user's group membership. + Raises LDAPInvalidDNError if member is not found in the DIT. + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + partial = False # True when a member has groupMembership but doesn't have securityEquals + for member in members_dn: + result = connection.search(member, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['groupMembership', 'securityEquals']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': # member not found in DIT + raise LDAPInvalidDnError(member + ' not found') + + existing_security_equals = response[0]['attributes']['securityEquals'] if 'securityEquals' in response[0]['attributes'] else [] + existing_group_membership = response[0]['attributes']['groupMembership'] if 'groupMembership' in response[0]['attributes'] else [] + existing_security_equals = [element.lower() for element in existing_security_equals] + existing_group_membership = [element.lower() for element in existing_group_membership] + + for group in groups_dn: + if group.lower() not in existing_group_membership: + return False, False + if group.lower() not in existing_security_equals: + partial = True + + return True, partial + + +def _check_groups_contain_members(connection, + groups_dn, + members_dn): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :return: two booleans. The first when True means that all members have membership in all groups, The second when True means that + there are inconsistences in the EquivalentToMe attribute + Checks if groups have members in their 'member' attribute. + Raises LDAPInvalidDNError if member is not found in the DIT. + """ + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + partial = False # True when a group has member but doesn't have equivalentToMe + for group in groups_dn: + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member', 'equivalentToMe']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_equivalent_to_me = response[0]['attributes']['equivalentToMe'] if 'equivalentToMe' in response[0]['attributes'] else [] + existing_members = [element.lower() for element in existing_members] + existing_equivalent_to_me = [element.lower() for element in existing_equivalent_to_me] + for member in members_dn: + if member.lower() not in existing_members: + return False, False + if member.lower() not in existing_equivalent_to_me: + partial = True + + return True, partial + + +def edir_check_groups_memberships(connection, + members_dn, + groups_dn, + fix, + transaction): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to check + :param groups_dn: the list of groups to check + :param fix: checks for inconsistences in the users-groups relation and fixes them + :param transaction: activates an LDAP transaction when fixing + :return: a boolean where True means that the operation was successful and False means an error has happened + Checks and fixes users-groups relations following the eDirectory rules: groups are checked against 'groupMembership' + attribute in the member object while members are checked against 'member' attribute in the group object. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + """ + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if connection.check_names: # builds new lists with sanitized dn + safe_members_dn = [] + safe_groups_dn = [] + for member_dn in members_dn: + safe_members_dn.append(safe_dn(member_dn)) + for group_dn in groups_dn: + safe_groups_dn.append(safe_dn(group_dn)) + + members_dn = safe_members_dn + groups_dn = safe_groups_dn + + try: + members_have_memberships, partial_member_security = _check_members_have_memberships(connection, members_dn, groups_dn) + groups_contain_members, partial_group_security = _check_groups_contain_members(connection, groups_dn, members_dn) + except LDAPInvalidDnError: + return False + + if not members_have_memberships and not groups_contain_members: + return False + + if fix: # fix any inconsistences + if (members_have_memberships and not groups_contain_members) \ + or (groups_contain_members and not members_have_memberships) \ + or partial_group_security \ + or partial_member_security: + + for member in members_dn: + for group in groups_dn: + edir_add_members_to_groups(connection, member, group, True, transaction) + + return True diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/endTransaction.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/endTransaction.py new file mode 100644 index 0000000..18bc041 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/endTransaction.py @@ -0,0 +1,58 @@ +""" +""" + +# Created on 2016.04.14 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import EndGroupTypeRequestValue, EndGroupTypeResponseValue, Sequence +from ...utils.asn1 import decoder + + +class EndTransaction(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.103.2' + self.response_name = '2.16.840.1.113719.1.27.103.2' + self.request_value = EndGroupTypeRequestValue() + self.asn1_spec = EndGroupTypeResponseValue() + + def __init__(self, connection, commit=True, controls=None): + if controls and len(controls) == 1: + group_cookie = decoder.decode(controls[0][2], asn1Spec=Sequence())[0][0] # get the cookie from the built groupingControl + else: + group_cookie = None + controls = None + + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if group_cookie: + self.request_value['endGroupCookie'] = group_cookie # transactionGroupingType + if not commit: + self.request_value['endGroupValue'] = '' # an empty endGroupValue means abort transaction + + def populate_result(self): + try: + self.result['value'] = self.decoded_response['endGroupValue'] + except TypeError: + self.result['value'] = None + + def set_response(self): + self.response_value = self.result diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/getBindDn.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/getBindDn.py new file mode 100644 index 0000000..492bcdd --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/getBindDn.py @@ -0,0 +1,41 @@ +""" +""" + +# Created on 2014.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...protocol.novell import Identity +from ...extend.operation import ExtendedOperation + + +class GetBindDn(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.31' + self.response_name = '2.16.840.1.113719.1.27.100.32' + self.response_attribute = 'identity' + self.asn1_spec = Identity() + + def populate_result(self): + try: + self.result['identity'] = str(self.decoded_response) if self.decoded_response else None + except TypeError: + self.result['identity'] = None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/listReplicas.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/listReplicas.py new file mode 100644 index 0000000..8ccf2ff --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/listReplicas.py @@ -0,0 +1,50 @@ +""" +""" + +# Created on 2014.07.03 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import ReplicaList +from ...protocol.rfc4511 import LDAPDN +from ...utils.dn import safe_dn + + +class ListReplicas(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.19' + self.response_name = '2.16.840.1.113719.1.27.100.20' + self.request_value = LDAPDN() + self.asn1_spec = ReplicaList() + self.response_attribute = 'replicas' + + def __init__(self, connection, server_dn, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if connection.check_names: + server_dn = safe_dn(server_dn) + self.request_value = LDAPDN(server_dn) + + def populate_result(self): + try: + self.result['replicas'] = [str(replica) for replica in self.decoded_response] if self.decoded_response else None + except TypeError: + self.result['replicas'] = None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py new file mode 100644 index 0000000..291ae92 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py @@ -0,0 +1,56 @@ +""" +""" + +# Created on 2014.07.03 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import NmasGetUniversalPasswordRequestValue, NmasGetUniversalPasswordResponseValue, NMAS_LDAP_EXT_VERSION +from ...utils.dn import safe_dn + + +class NmasGetUniversalPassword(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.39.42.100.13' + self.response_name = '2.16.840.1.113719.1.39.42.100.14' + self.request_value = NmasGetUniversalPasswordRequestValue() + self.asn1_spec = NmasGetUniversalPasswordResponseValue() + self.response_attribute = 'password' + + def __init__(self, connection, user, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + + if connection.check_names: + user = safe_dn(user) + + self.request_value['nmasver'] = NMAS_LDAP_EXT_VERSION + self.request_value['reqdn'] = user + + def populate_result(self): + if self.decoded_response: + self.result['nmasver'] = int(self.decoded_response['nmasver']) + self.result['error'] = int(self.decoded_response['err']) + try: + + self.result['password'] = str(self.decoded_response['passwd']) if self.decoded_response['passwd'].hasValue() else None + except TypeError: + self.result['password'] = None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py new file mode 100644 index 0000000..dadab59 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py @@ -0,0 +1,52 @@ +""" +""" + +# Created on 2014.07.03 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import NmasSetUniversalPasswordRequestValue, NmasSetUniversalPasswordResponseValue, NMAS_LDAP_EXT_VERSION +from ...utils.dn import safe_dn + + +class NmasSetUniversalPassword(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.39.42.100.11' + self.response_name = '2.16.840.1.113719.1.39.42.100.12' + self.request_value = NmasSetUniversalPasswordRequestValue() + self.asn1_spec = NmasSetUniversalPasswordResponseValue() + self.response_attribute = 'password' + + def __init__(self, connection, user, new_password, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if connection.check_names and user: + user = safe_dn(user) + + self.request_value['nmasver'] = NMAS_LDAP_EXT_VERSION + if user: + self.request_value['reqdn'] = user + if new_password: + self.request_value['new_passwd'] = new_password + + def populate_result(self): + self.result['nmasver'] = int(self.decoded_response['nmasver']) + self.result['error'] = int(self.decoded_response['err']) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/partition_entry_count.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/partition_entry_count.py new file mode 100644 index 0000000..3d46c7a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/partition_entry_count.py @@ -0,0 +1,57 @@ +""" +""" + +# Created on 2014.08.05 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import Integer + +from ...core.exceptions import LDAPExtensionError +from ..operation import ExtendedOperation +from ...protocol.rfc4511 import LDAPDN +from ...utils.asn1 import decoder +from ...utils.dn import safe_dn + + +class PartitionEntryCount(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.13' + self.response_name = '2.16.840.1.113719.1.27.100.14' + self.request_value = LDAPDN() + self.response_attribute = 'entry_count' + + def __init__(self, connection, partition_dn, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if connection.check_names: + partition_dn = safe_dn(partition_dn) + self.request_value = LDAPDN(partition_dn) + + def populate_result(self): + substrate = self.decoded_response + try: + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['entry_count'] = int(decoded) + except Exception: + raise LDAPExtensionError('unable to decode substrate') + + if substrate: + raise LDAPExtensionError('unknown substrate remaining') diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/removeMembersFromGroups.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/removeMembersFromGroups.py new file mode 100644 index 0000000..5736079 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/removeMembersFromGroups.py @@ -0,0 +1,170 @@ +""" +""" + +# Created on 2016.04.17 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from ...core.exceptions import LDAPInvalidDnError +from ... import SEQUENCE_TYPES, MODIFY_DELETE, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def edir_remove_members_from_groups(connection, + members_dn, + groups_dn, + fix, + transaction): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to remove from groups + :param groups_dn: the list of groups where members are to be removed + :param fix: checks for inconsistences in the users-groups relation and fixes them + :param transaction: activates an LDAP transaction + :return: a boolean where True means that the operation was successful and False means an error has happened + Removes users-groups relations following the eDirectory rules: groups are removed from securityEquals and groupMembership + attributes in the member object while members are removed from member and equivalentToMe attributes in the group object. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if connection.check_names: # builds new lists with sanitized dn + safe_members_dn = [] + safe_groups_dn = [] + for member_dn in members_dn: + safe_members_dn.append(safe_dn(member_dn)) + for group_dn in groups_dn: + safe_groups_dn.append(safe_dn(group_dn)) + + members_dn = safe_members_dn + groups_dn = safe_groups_dn + + transaction_control = None + error = False + + if transaction: + transaction_control = connection.extend.novell.start_transaction() + + if not error: + for member in members_dn: + if fix: # checks for existance of member and for already assigned groups + result = connection.search(member, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['securityEquals', 'groupMembership']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(member + ' not found') + + existing_security_equals = response[0]['attributes']['securityEquals'] if 'securityEquals' in response[0]['attributes'] else [] + existing_group_membership = response[0]['attributes']['groupMembership'] if 'groupMembership' in response[0]['attributes'] else [] + else: + existing_security_equals = groups_dn + existing_group_membership = groups_dn + existing_security_equals = [element.lower() for element in existing_security_equals] + existing_group_membership = [element.lower() for element in existing_group_membership] + + changes = dict() + security_equals_to_remove = [element for element in groups_dn if element.lower() in existing_security_equals] + group_membership_to_remove = [element for element in groups_dn if element.lower() in existing_group_membership] + if security_equals_to_remove: + changes['securityEquals'] = (MODIFY_DELETE, security_equals_to_remove) + if group_membership_to_remove: + changes['groupMembership'] = (MODIFY_DELETE, group_membership_to_remove) + if changes: + result = connection.modify(member, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if not error: + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member', 'equivalentToMe']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_equivalent_to_me = response[0]['attributes']['equivalentToMe'] if 'equivalentToMe' in response[0]['attributes'] else [] + else: + existing_members = members_dn + existing_equivalent_to_me = members_dn + + existing_members = [element.lower() for element in existing_members] + existing_equivalent_to_me = [element.lower() for element in existing_equivalent_to_me] + + changes = dict() + member_to_remove = [element for element in members_dn if element.lower() in existing_members] + equivalent_to_me_to_remove = [element for element in members_dn if element.lower() in existing_equivalent_to_me] + if member_to_remove: + changes['member'] = (MODIFY_DELETE, member_to_remove) + if equivalent_to_me_to_remove: + changes['equivalentToMe'] = (MODIFY_DELETE, equivalent_to_me_to_remove) + if changes: + result = connection.modify(group, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if transaction: + if error: # aborts transaction in case of error in the modify operations + result = connection.extend.novell.end_transaction(commit=False, controls=[transaction_control]) + else: + result = connection.extend.novell.end_transaction(commit=True, controls=[transaction_control]) + + if result['description'] != 'success': + error = True + + return not error # return True if no error is raised in the LDAP operations diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/replicaInfo.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/replicaInfo.py new file mode 100644 index 0000000..057f934 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/replicaInfo.py @@ -0,0 +1,79 @@ +""" +""" + +# Created on 2014.08.07 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime + +from pyasn1.type.univ import Integer + +from ...core.exceptions import LDAPExtensionError +from ...protocol.novell import LDAPDN, ReplicaInfoRequestValue +from ..operation import ExtendedOperation +from ...utils.asn1 import decoder +from ...utils.dn import safe_dn + + +class ReplicaInfo(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.17' + self.response_name = '2.16.840.1.113719.1.27.100.18' + # self.asn1_spec = ReplicaInfoResponseValue() + self.request_value = ReplicaInfoRequestValue() + self.response_attribute = 'partition_dn' + + def __init__(self, connection, server_dn, partition_dn, controls=None): + if connection.check_names: + if server_dn: + server_dn = safe_dn(server_dn) + if partition_dn: + partition_dn = safe_dn(partition_dn) + + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + self.request_value['server_dn'] = server_dn + self.request_value['partition_dn'] = partition_dn + + def populate_result(self): + substrate = self.decoded_response + try: + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['partition_id'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['replica_state'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['modification_time'] = datetime.utcfromtimestamp(int(decoded)) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['purge_time'] = datetime.utcfromtimestamp(int(decoded)) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['local_partition_id'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=LDAPDN()) + self.result['partition_dn'] = str(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['replica_type'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['flags'] = int(decoded) + except Exception: + raise LDAPExtensionError('unable to decode substrate') + + if substrate: + raise LDAPExtensionError('unknown substrate remaining') diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/startTransaction.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/startTransaction.py new file mode 100644 index 0000000..6179cb0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/novell/startTransaction.py @@ -0,0 +1,56 @@ +""" +""" + +# Created on 2016.04.14 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import CreateGroupTypeRequestValue, CreateGroupTypeResponseValue, GroupingControlValue +from ...protocol.controls import build_control + + +class StartTransaction(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.103.1' + self.response_name = '2.16.840.1.113719.1.27.103.1' + self.request_value = CreateGroupTypeRequestValue() + self.asn1_spec = CreateGroupTypeResponseValue() + + def __init__(self, connection, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + self.request_value['createGroupType'] = '2.16.840.1.113719.1.27.103.7' # transactionGroupingType + + def populate_result(self): + self.result['cookie'] = int(self.decoded_response['createGroupCookie']) + try: + self.result['value'] = self.decoded_response['createGroupValue'] + except TypeError: + self.result['value'] = None + + def set_response(self): + try: + grouping_cookie_value = GroupingControlValue() + grouping_cookie_value['groupingCookie'] = self.result['cookie'] + self.response_value = build_control('2.16.840.1.113719.1.27.103.7', True, grouping_cookie_value, encode_control_value=True) # groupingControl + except TypeError: + self.response_value = None + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/operation.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/operation.py new file mode 100644 index 0000000..fcfdad4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/operation.py @@ -0,0 +1,98 @@ +""" +""" + +# Created on 2014.07.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..core.results import RESULT_SUCCESS +from ..core.exceptions import LDAPExtensionError +from ..utils.asn1 import decoder + + +class ExtendedOperation(object): + def __init__(self, connection, controls=None): + self.connection = connection + self.decoded_response = None + self.result = None + self.asn1_spec = None # if None the response_value is returned without encoding + self.request_name = None + self.response_name = None + self.request_value = None + self.response_value = None + self.response_attribute = None + self.controls = controls + self.config() + + def send(self): + if self.connection.check_names and self.connection.server.info is not None and self.connection.server.info.supported_extensions is not None: # checks if extension is supported + for request_name in self.connection.server.info.supported_extensions: + if request_name[0] == self.request_name: + break + else: + raise LDAPExtensionError('extension not in DSA list of supported extensions') + + resp = self.connection.extended(self.request_name, self.request_value, self.controls) + if not self.connection.strategy.sync: + _, result = self.connection.get_response(resp) + else: + if self.connection.strategy.thread_safe: + _, result, _, _ = resp + else: + result = self.connection.result + self.result = result + self.decode_response(result) + self.populate_result() + self.set_response() + return self.response_value + + def populate_result(self): + pass + + def decode_response(self, response=None): + if not response: + response = self.result + if not response: + return None + if response['result'] not in [RESULT_SUCCESS]: + if self.connection.raise_exceptions: + raise LDAPExtensionError('extended operation error: ' + response['description'] + ' - ' + response['message']) + else: + return None + if not self.response_name or response['responseName'] == self.response_name: + if response['responseValue']: + if self.asn1_spec is not None: + decoded, unprocessed = decoder.decode(response['responseValue'], asn1Spec=self.asn1_spec) + if unprocessed: + raise LDAPExtensionError('error decoding extended response value') + self.decoded_response = decoded + else: + self.decoded_response = response['responseValue'] + else: + raise LDAPExtensionError('invalid response name received') + + def set_response(self): + self.response_value = self.result[self.response_attribute] if self.result and self.response_attribute in self.result else None + if not self.connection.strategy.thread_safe: + self.connection.response = self.response_value + + def config(self): + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PagedSearch.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PagedSearch.py new file mode 100644 index 0000000..a0f986e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PagedSearch.py @@ -0,0 +1,146 @@ +""" +""" + +# Created on 2014.07.08 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ... import SUBTREE, DEREF_ALWAYS +from ...utils.dn import safe_dn +from ...core.results import DO_NOT_RAISE_EXCEPTIONS, RESULT_SIZE_LIMIT_EXCEEDED +from ...core.exceptions import LDAPOperationResult +from ...utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, NETWORK, EXTENDED + + +def paged_search_generator(connection, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=100, + paged_criticality=False): + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + responses = [] + original_connection = None + original_auto_referrals = connection.auto_referrals + connection.auto_referrals = False # disable auto referrals because it cannot handle paged searches + cookie = True # performs search operation at least one time + cachekey = None # for referrals cache + while cookie: + result = connection.search(search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality, + None if cookie is True else cookie) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if result['referrals'] and original_auto_referrals: # if rererrals are returned start over the loop with a new connection to the referral + if not original_connection: + original_connection = connection + _, connection, cachekey = connection.strategy.create_referral_connection(result['referrals']) # change connection to a valid referrals + continue + + responses.extend(response) + try: + cookie = result['controls']['1.2.840.113556.1.4.319']['value']['cookie'] + except KeyError: + cookie = None + + if connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'paged search operation result <%s> for <%s>', result, connection) + if result['result'] == RESULT_SIZE_LIMIT_EXCEEDED: + while responses: + yield responses.pop() + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + while responses: + yield responses.pop() + + if original_connection: + connection = original_connection + if connection.use_referral_cache and cachekey: + connection.strategy.referral_cache[cachekey] = connection + else: + connection.unbind() + + connection.auto_referrals = original_auto_referrals + connection.response = None + + +def paged_search_accumulator(connection, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=100, + paged_criticality=False): + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + responses = [] + for response in paged_search_generator(connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality): + responses.append(response) + + connection.response = responses + return responses diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PersistentSearch.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PersistentSearch.py new file mode 100644 index 0000000..b25ec68 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/PersistentSearch.py @@ -0,0 +1,137 @@ +""" +""" + +# Created on 2016.07.08 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from queue import Empty +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Empty + +from ...core.exceptions import LDAPExtensionError +from ...protocol.persistentSearch import persistent_search_control +from ... import SEQUENCE_TYPES +from ...utils.dn import safe_dn + + +class PersistentSearch(object): + def __init__(self, + connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + controls, + changes_only, + events_type, + notifications, + streaming, + callback + ): + if connection.strategy.sync: + raise LDAPExtensionError('Persistent Search needs an asynchronous streaming connection') + + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + self.connection = connection + self.changes_only = changes_only + self.notifications = notifications + self.message_id = None + self.base = search_base + self.filter = search_filter + self.scope = search_scope + self.dereference_aliases = dereference_aliases + self.attributes = attributes + self.size_limit = size_limit + self.time_limit = time_limit + self.connection.strategy.streaming = streaming + if callback and callable(callback): + self.connection.strategy.callback = callback + elif callback: + raise LDAPExtensionError('callback is not callable') + + if not isinstance(controls, SEQUENCE_TYPES): + self.controls = [] + else: + self.controls = controls + + if events_type and changes_only and notifications: + self.controls.append(persistent_search_control(events_type, changes_only, notifications)) + self.start() + + def start(self): + if self.message_id: # persistent search already started + return + + if not self.connection.bound: + self.connection.bind() + + with self.connection.strategy.async_lock: + self.message_id = self.connection.search(search_base=self.base, + search_filter=self.filter, + search_scope=self.scope, + dereference_aliases=self.dereference_aliases, + attributes=self.attributes, + size_limit=self.size_limit, + time_limit=self.time_limit, + controls=self.controls) + self.connection.strategy.persistent_search_message_id = self.message_id + + def stop(self, unbind=True): + self.connection.abandon(self.message_id) + if unbind: + self.connection.unbind() + if self.message_id in self.connection.strategy._responses: + del self.connection.strategy._responses[self.message_id] + if hasattr(self.connection.strategy, '_requests') and self.message_id in self.connection.strategy._requests: # asynchronous strategy has a dict of request that could be returned by get_response() + del self.connection.strategy._requests[self.message_id] + self.connection.strategy.persistent_search_message_id = None + self.message_id = None + + def next(self, block=False, timeout=None): + if not self.connection.strategy.streaming and not self.connection.strategy.callback: + try: + return self.connection.strategy.events.get(block, timeout) + except Empty: + return None + + raise LDAPExtensionError('Persistent search is not accumulating events in queue') + + def funnel(self, block=False, timeout=None): + done = False + while not done: + try: + entry = self.connection.strategy.events.get(block, timeout) + except Empty: + yield None + if entry['type'] == 'searchResEntry': + yield entry + else: + done = True + + yield entry diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/PagedSearch.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/PagedSearch.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb1020da6b44823a89e1f14b4cb30b59fbd6e1d1 GIT binary patch literal 2597 zcma)8TW=f36+W}P-zmwmB?Up$+!{7D6;!YLeZgs6}>*qBhxWiaKO>DC&~krD%!lC5o2GUM3+ek_GZB z>iqrpHo_XeZE zJ!kjeX!o;mPv}bOK9Y_fgXhNH&^a7VoYC(7c;E~k-W}YZ><3s-S+AlCVRE7y07u5|aVULV8jME6kuH6_ zJKn#mtM^C4$?)#*Kvxb2lcVA26I~rVoD2>j_3#C>rh6|CAo5yFOHaO5M!ItvcUF*dAJhF zs-4bvE<%3urUn-n{cp`qAd2L>WRie3^PGm~x3}%a3&>l4%M7b_@K| zBu=H1&8Jcq8GCEG;XRh#sS~^4Qzev)-F9bL;=EG4oZoC$(+s66Pv*Lq&STGRp2!Sr zxlp^2Jyz279c~l4dbzB)80`%YTbX<*(}62u=@}i%@+_0FudAQP`9P^e*D8-_QJeL0)oKD)IQ z`tEe+0`rJ%fg|=^`&+V`h@{z!8wsJcl<>C2sfl5fLa~Vw929^YWQCM z7sL;JU$dHG4P(^;uhli&Z-|1`0{4b!iH7xtXo?llg`|%7CAe0Me=-=ui5RI>gvZ-ef8*GZnf%v{wn3aXNdl$ z6HgQTO*H)rNI=vj8l9m)P~cD`Xy8!SA+Z}@q@pa)VV%?s5<*NS6sHp&$ATUO1qzB3 zm1t0=ZkYu4OB7XTP^E4)@0Tg6(V$Ma^2oWTO5O8d67OrOiQVMlTC_Z}Ho&zq-5m)W}$eNxZ34qA+JQl}d*iQsZjrDgVIr zlh~*v!r043=Oam==vImYJh57D6&lV+f&DiFI=qXgo*i4>G5ifezro z%qA>SylChAWlgYp!US`g#x*i$=($7sAKK4#TcQ|R;g6k{Xxt#RCSVBDrlt7q67|oL zS>{o;vB{x>?+X6p3Oy&p8Ug6S*3tDD((N4Tb}VI}+g{xE^eFZZR1zmc-PT4)ZxF`& zZ3Ip%eS_#aTJgOo>UsWQJJjtsF>UU9y-0Revnp12M(&TYBJZQvYu$!_ApJu(_6Aa` zDkNEbwq4fr54?C^YB!0aQP#qS;a=!_{3)H)u|#|O(hY;G*z>f^%6nmCq{>R#Pg0qk z4y2NMXt6I{FA6aQt2|>=*c%$=b$BG*C>(?)tDA5z0^pvo*RVU9ALdDttXJ;jwIYfO^O>f4%hCTce)U8}u1jp+*2h}063 zvrOJ&(gNu=1GY6s`3FIUHSk`q@Sl zcnYyWH4WP+YofRCG(dWEgW4hlrgz#NE2hH8)BSZ{<8L)B?{x z#blAmyLQgbAtYX_?Xy(r2=zX%<`BurCFah9?4s#&AOx2dou+6x3u5UN_s)x>vu`-j zhWUNp;gxv!T|j%yg}{qZv$ag1;;P(*5Y1ee`v@ZI$ip(JZM$eH$v61Y&|iMn|8|bZh7FIW75~?+*vV2vr(qLtduZVcZ6wL)ocXJZ+56Dppp` zr)7nGX%rh}4~I^{VwaVAHVrCVp_8F`1I8F7%wUn`3QM9b3gSF~tT}H1kmnx5$0rcO z=c8#20xO>t=&8qtybft};RIR^2kJ3e&x*7gF9WZl#p})luZO|{hN}VU%_>UGA!74; zzA8KvPi)D-{$O^k#9~?6x}6odjCbd99PdfJiJREyey4N-tWTkyT4TcaV8~|iItw;H zvLd2WW+fa7YVhYQn8w<#3X(a zt*6J8Ft;f`n8_a7-RjVUkzNnt{NhngdVO4DtP*e2I;&pKZNI@4&gN`+r6A6rOfI2N H+F#*+6%D%| literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35794175ca7bcf49f5253a1dbe3dd15970f89c32 GIT binary patch literal 148 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CUyk}Exdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!xb~q9iphMIWdlFD0=kML#}1GcU6wK3=b&@)n0p RZhlH>PO2Tq=wcvd008nQB+vi= literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/modifyPassword.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/modifyPassword.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6797e4d695fcfcb20f7b55e31aa50b7e23e2a56c GIT binary patch literal 2150 zcmZ8i&2AJ&5U!b>o&C2LTfyEOkT@jLN@0yL;u3^FU?37%5NiVI%V?Ns+hflk-M!$o z%q8Xla>^S-N-jC`5;^2R4s*>ZuaHx|?)EO=+3A|9?&`nqtEye=_1YhP<@|k*=pXvz z@u1&ElfOX3L=4iQ*rn8=%q8ZMqwN}{HOf3y-J#e99Wc8n(AiX_K-Rv6i)c zO52omh;^*pptMU_k66#zO-h$2TPC(l&V#r`ahu*@|2A=tPHV*a6nAJc>{d?u-x|(0 zbgIt7JCldo_k!``@ixp0+eeD$F^?aYT!bnq@}XO;KMAFL6MtXC$?ohae>LS&{Sc;8 zUJX7Uk!6ufZicXyzaPqd9z$Dy9i~YfDjvurD^nhndci{Iv4#wHc@XDNm!57g+rr;Fe57oS5nvVP;pIKfYUJv0O12Plf@z@T^n z+0gOmoVX;uCD;d0MjB7_oI3OtU>ZCR0IWkdPiiDmQgwo&d^&YW2BaF=1nw~3VkTbf zfC)8B@JRe+CV2A+Kbr}LC_TZW6T{VEljLt&S4}#^Dc%$2o-O3j&3r(rrH6Gdc3y0P zF~f9y%(_#_#dk5!Rib7)tW~73O$*in)m9z0g$AQ)20@Z1DhOC7+UL=sAzg|V#so?U zRqaF?#`1_)^_MfnrO-%LE=xH`^b7*MBh3HI8%y0u8VqbW;AFJH|ItZ23R+TgEBw`Ju^BuHr0P} z=*Qfl7bXI_W7gW^x#hX?k(<+0?c5jo{z%K!NB8bLSya=fX0+v1W~ni;J7VBAw*kuUW8zM5hjuc z{3zmPE6J9lLh#YY4)G=YhOP-Iqn`_jYPl@RX{t-Nz1S`IOHC^|HRm!yV%1r7`zQ!~ z=lIgOkT^GW=2mgoFmc*J-&bf- zS4LDL|I&)kedFPUsu2Wn5n)xEGpuiG+^CrUp_xQv{ZbUFh>CP1cB8GUH?En=YfEi+ zs*+TW?BAD3I<~TKm!V8YT9~|KP3s%yCWl$q;A^3hmI-~ZPcC5Yqi<0)Z(0Oy=}3{f O-(T+o$BSs@SN|W8Bm95> literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/whoAmI.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/__pycache__/whoAmI.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82c0c7675283b809744469f64f76c894ab5e1cdc GIT binary patch literal 909 zcmZ8gPjAyO6n{?Av<ZxmDL^#ICf?`uvXm0 zSK+`1;*u*Tz5*wn-42aedOyF|@89n|XL~qIetze?>Hz$LD=R|%0L3_9068K77Jwj7 z1&{|o+;<2fgernO0`h`Iz&h{^Ejz#ixCkNd0E=Osc3YDC4lzzeDr zmP+DbVij#1)!(|Uh#3~X*gSLPqJzDIGbd9PIeznahu>-+btSmnwwfl!)alyE{_|_ky2#1IQap(huQu-9owoN*JZs^N@EKlc8(cumV4*B zW5J4gx6q)%4EHOp*$_aE6CXyVBhs4P>* z@gsn~3)T}y{epnR#(}@`4c$MI6NqdGpAyjTfe^CsdbM%CZvRdac#9F{X)x0$wPAhDaF%x39`zHUv`r|j6l(-WeL(41QwTRJN_B#v^w5EedIem1jsF4ML-9=> zkU`{6X85GKlrpuTG#{;}l&Q=2tKG}alg5_9xLJJml)dAX@IITT*xO&1_QbtN. + +from ... import HASHED_NONE +from ...extend.operation import ExtendedOperation +from ...protocol.rfc3062 import PasswdModifyRequestValue, PasswdModifyResponseValue +from ...utils.hashed import hashed +from ...protocol.sasl.sasl import validate_simple_password +from ...utils.dn import safe_dn +from ...core.results import RESULT_SUCCESS + +# implements RFC3062 + + +class ModifyPassword(ExtendedOperation): + def config(self): + self.request_name = '1.3.6.1.4.1.4203.1.11.1' + self.request_value = PasswdModifyRequestValue() + self.asn1_spec = PasswdModifyResponseValue() + self.response_attribute = 'new_password' + + def __init__(self, connection, user=None, old_password=None, new_password=None, hash_algorithm=None, salt=None, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if user: + if connection.check_names: + user = safe_dn(user) + self.request_value['userIdentity'] = user + if old_password: + if not isinstance(old_password, bytes): # bytes are returned raw, as per RFC (4.2) + old_password = validate_simple_password(old_password, True) + self.request_value['oldPasswd'] = old_password + if new_password: + if not isinstance(new_password, bytes): # bytes are returned raw, as per RFC (4.2) + new_password = validate_simple_password(new_password, True) + if hash_algorithm is None or hash_algorithm == HASHED_NONE: + self.request_value['newPasswd'] = new_password + else: + self.request_value['newPasswd'] = hashed(hash_algorithm, new_password, salt) + + def populate_result(self): + try: + self.result[self.response_attribute] = str(self.decoded_response['genPasswd']) + except TypeError: # optional field can be absent, so returns True if operation is successful else False + if self.result['result'] == RESULT_SUCCESS: + self.result[self.response_attribute] = True + else: # change was not successful, raises exception if raise_exception = True in connection or returns the operation result, error code is in result['result'] + self.result[self.response_attribute] = False + if self.connection.raise_exceptions: + from ...core.exceptions import LDAPOperationResult + raise LDAPOperationResult(result=self.result['result'], description=self.result['description'], dn=self.result['dn'], message=self.result['message'], response_type=self.result['type']) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/whoAmI.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/whoAmI.py new file mode 100644 index 0000000..a6c08a8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/extend/standard/whoAmI.py @@ -0,0 +1,40 @@ +""" +""" + +# Created on 2014.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# implements RFC4532 +from ...extend.operation import ExtendedOperation +from ...utils.conv import to_unicode + + +class WhoAmI(ExtendedOperation): + def config(self): + self.request_name = '1.3.6.1.4.1.4203.1.11.3' + self.response_attribute = 'authzid' + + def populate_result(self): + try: + self.result['authzid'] = to_unicode(self.decoded_response) if self.decoded_response else None + except TypeError: + self.result['authzid'] = self.decoded_response if self.decoded_response else None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f578e3a06e8baaeeb3f54762d983ad1d44dad599 GIT binary patch literal 142 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CU)K61xdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!xc9Ahjs5Br`uxKR!M)FS8^*Uaz3?7Kcr4eoARh MsvXGCVjyM!017`MlK=n! literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/abandon.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/abandon.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f851f65515aa397d0210cd516d6d07671f2a3607 GIT binary patch literal 540 zcmYjNu};G<5IrYt(pD4|hL(kiDMK3-ii8kCAXpga09zI-jZGCPse|oGRDub9g@F%Z z@yf(6FmX;ospWe<`_Av)-Jsj;e7P@P-);U`=3N>7(Preb6$b^KGdD$82BD;sq0nJN~%jN}KjAS1O+Ko9l#NhFvz( zMY}>%eFTl0z%#%rvHJymg0y5BIMOCcl#Sexm#aBVnek;s{sGd%$j@o0^CB$LVwf(J zj*zjG+CibvT_Rg}u9e#k*2;T$ z!C|5JN_lEEJJYD0*B!Hf7*}Z-5ZT1sQfmc1Ud`aIa@`Hpg0eKx2N+a#MnGf-aT<8W zr<93=(x_KRp+zFHk$gxd$K&z;fJ&+5kBv%pKC&#=I?DxHX8hbzEBo&4_1!J+7uO+j AH2?qr literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/add.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/add.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a4c624ac80a576f78f52713efec57de6a1cb4e0 GIT binary patch literal 1744 zcmZuxOK%)S5U!r*&g{canHUm42r1e_vPv*;Sw$GzoWjb)kcbx1Fqv+fG4pbFZ)A)0 z$@v=`5#qwX$)&G3pwXEvkUMBZv1?dzrrDZ z$B6+@oCz=o3Ie4A)B$327YY|j52y#F57dV;02)9U0u7<;0PR2-0ga%HfyV6_4~j07 zJ)k`(`#}3p4uB4zTmia*JA5$z09XjD1Fu}5tH2^)F}y+;Yrwj|dRAUHJCBBaP2#r> z!Wh3lE|m@*@9!S&Pjr7*DUrXJD*iY}bF@_T z=2G0}G81{D^19OT6E3HP+N&AY-qW;@Lr<>>e$0hHB~f)!7(eUj!mYKjJX8AC%e2T@ zs(7+oOwcstdZQ7%Nd-@iYmrD^vAjB&e3J$E5cBKf=;7GIA-4#C0=NRW4B-3?C;~GA zR|NK-zlNV2xD4U41IjTwW&zAX7%LZM9kZp?w=r8|_2$IR9<# z)mW|PFRkYoF1s*`;539;3<__FU}k;K(C)y@gP9Lk=mr5HE6y5tR*mK-kT36?Xz%== zQ+UAwrwik=EqJD4i?s&|ufeC|(H<}l#%3Q%K1w~zelXFVx@h=Yj1y=NV=J}KDC9;LeY}>FA%qJ^`9?Bs%%D0-rTeBi{jo3#-|rM=MP5(OPkN; zbKRI%BmPm!*!|{0_wk!7tskK)Y5YMqBHN@-Hc3P_$Q|;~89D1tL{>@ch!1f+Ln_*z z`I?wof_{nuG7LG2xkAA($Rr=LhPq?*+`)9Y6S0naZLEflcBK-+(0oY52gYtNw9_4w z^oBt>f3c}EQ&W#{L7LbDq7onD_Z>{jqWKwDt}(S3m}@X$m7LmIIYlBb@gcdeK#cCU z_=ANWwmNbj>ju}O_C2Qg#1kC|+Z|}!er=cNvg`ICwh#!7%2Z+M8MdDgQ!mpKPS;qT zo>a9|dG_tx6fN5d?JUG$pxqo99T`7^6Rsvm9`@995vjwuE=&pqwsF%2@u)=NO8(z? zZnp7k7Z(Aw88k&;0(u(LLSzW#4LRpwL?QJ31k}~A7*|c}x0B$K^+0Yr6HJcXvk?Hnw6{q0VD%l~Q M1TJyO%KJV4U-hAxng9R* literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/bind.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/bind.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..400fee89184edf3f06f3e929a44708902044689d GIT binary patch literal 4718 zcmbtYNpBp-6@J~bFC6ZhL`kE?k;b;DXtAAzaZHi4z=RwU8cKl*a0adE7THoSqpGGQ z3NnJk3XmU=i?0E4NNzd!mP_&2r;3BGFAB65iYs70<#fkmNB!lp1sB1d7KM4rL|i2_+Hk)xnU zVTnY^jPn$fDXfsFP*^2VrLab#Mq!;q-AEKD7@@F1qG85G3Pvd$BQZwdIEirzCrC_C zI7woX!YL9{6i$)^k~>B2wC1moJ45cQ=3C^>kvp&Xcln@B>r84@-`cQxE1woS z>zmsfYiVVy`uL<&!YH6w7j3}c~Ro`oWzf# zO)uGtU8Cdd(G%KnvK$2Q3(qX#LUW%xfsZr2uJXfv;C1`iajiyLdgw_7b?MY`^(%X^ z-}CTjy(6vN^&|Jb_k7<|Nm{+{sr?{XiCr%p?Kmn}k)F#pa{`stjilJUx5Up$>gtEF8OO^e@8Iki-1yH`ZzUMkqo0p4|6m zz0cg>?-sKD8|RHtGR|gvI>FC9erlk1kLyz}*(@}f*^wXfbV?hjLa$+vdHb|WO;9q; z%g5Bh>~KD!BC1mYIGN0>fva^|Q|+{b80H+47Z68jJ^~E9dS@Si&}6pht7bUBgr*-g zO_DYrBjeJd8KjNl(f#VmAcenex2S|(Z_kN*6{fY`VUCKtLejpvdU%B>PMVGZ4ZeXB z#nC|+?<;)?G1pmNS>Jfn-Ckb#`SQKB?&^AHW$WSE{YPR(otm#=I@{4+ySKHozPz*6 zZSQPsioB+yX45d4#Z)E@+}z%3cQWCI5gVlVt8@DX2AjuC(F`>Zwr1rRtSd*@#8qGU zkxHDX=gA_^o@0_@QfATs5fjP-goVHlK-b*^24^|St92$7CY<|nf=Ql9jmaF7c@QxN zlQO7A161mUo>IUqG23^f@&G}wsTb{f!-ccimLpFXF3K~knIWfDl}+X^Gr0(omIv+@ z4R#&$WquW7dVJKmH7Jj}UZhd2Bn@VZ>QD|4jnG3#c6pcj6Ui2i`0qzIlCXcH@At23 z(*?ox$F8@3aOdT%8-eTeZ)Y^_ds5e*8yugD{e!f@Om{ec1IWq8=I_{lmZ6k1P19J0L({ATt0N z%sf&PnQH(Vj2`DS9AiDF$9@ipnQt2_vw^j#Te&pnM@gDfiIitC+p^?UUS#_i@-Db^ zNj;n-b%d*i26aYe8)IE3 z@FX5{sX#H<(q%-WKhNedn2jgtl*IfKF5wi>G{USoR-cF0g>hcEOlGa>L^`zhD{xG%ONPeGZ zOBpQ5n>?xve5|w+(h6IDg^@ts#(JwP-^VZQ=(MrxC5(&iLnlDzmzJ`zybcjj-gA^* zkPEE1@c1C{6mo_$@}%RYk2?+k#a-D;NGgU~PMQVnwht}&Q;d%}j4@F=Y#YpXbr_Na zN{qw&Jd9Xw%MYPfTTp()+%+cJbR+0fV>ygkHXt%#Xdt=7l0RYcF%ve+|1rRVsb<|% z?eJ^tQ;cW>JIH15LmT8U-~yy=@J}!qd;s+{d@$-|A<9h^V8Xx%xcPaW0Yos6;N1vZ zmUPiya+k>M9QT3QDo5_g)haC^+*qzQW=WMx-wV@OFnnNds7<^|Z0t?u5===H43KP`YeY%U!oD279 zqt@E;E)JC(Lx)C{t31^4uFbfH;g0+Sv{jIw@|uoyZ9yI3+(@--lj8Sy{X}iN_-$dX z&Gr>`WjSxmHfNo;<m*Qt2<@Wu(8cdBgR!!)O)e?77ger$rlr&ddhp* z^EB`&)8kcmA0vlu+r&g)#!1|ZgGI(WO?0Ct#)b>>N$<`FH*e||Qn!ev9UNmFy6)*t zP?y0|D&S#bs2jN>dV6t%ZY$9(g@#H|-B0{LE%Jg1O#EjL|K$k6eSf`?dqMI`E literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/compare.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/compare.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1f781895a574865885ccec44a38b149e260c4cd GIT binary patch literal 1551 zcmYjROK;>v5H8zed+d2+W_Q^n5)ylz!%noYDs7{Hcee{5;5!GX2 z;h9l>muI@ocv)zeb180w zlzFABvnrKdeOtr;U>~%BQoNUVRRf`k9*91~q&?br^Z<$Ccyz9P(gEoKZSaHFr%gbc z(6(q3(L?AVbQ>KYI&{YjNk_E7k=TF&59l1HSuKP%L^Y!oo9t_6p_)d9GRYytA~8O1OtQbigswkql&?_?(G(~d zixlpxbCzJuwzHLTVox}NFtO}=^%u!!u>bq&OxN96S9UMUM(Mn&US4ytzJLAO=Vukq zyDzq~?S#y2)6R;%<;(8g%(r^BUwwfi)f9r##G83b-^$dN&*3RN>&Ii+W?{M}eF+6k zLQ&C`Qxx`t8xz|uxP0frfS^T?rzpAA26S2mD0jGWprpM~&aHR?vGC;x9}_4op+B{L zi`@b4#V28;Q!FqS)-Did#Qd5l$Q!DA4yRdsEH z5w}EoRM(S3UHgDtVb2k_FYKq@3r~J#k9uO_EaPpFWo*{TR<}i4EsM6f!=Fb#0Cp4} zt;w6>^_y3(`nfnvjcr*!Iu68a&&s6|xh&o}Rh0lU3M8g0_31MwhYhf cmai-EwWY7JJc~}AdrM1^IPe1R=x7}O59ZF~xnvY_N}*=V%~}2)oBz z8MIESeby+k#m~D^iG+v=-m@rs5u>ROhor+d3^}wa)dTcNLktkHkMf_yGd!?ly+vhA zj1|6%Y+*5xyla5>j+L$fwexwPJZt;?-C$>jy*&ZtTYqHj%EynysSboKWfu3lDXE@P zCQDIuhC~q}kSwYTRlZ{sYaiB3%3{s316md9rj@EHUk*pn*a_KWrzU}RDs}pg>A7RCaA6+5dzdjfD389is`xNkci1Ik|^xPQ-1r(j?Yl zp3}C>^K9OUR<&iz7vicsdvtR0x8DYAV{+58>$Ap#T5? literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/extended.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/extended.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a657a01b339f0e9e9434b86f808f1eaafd36ad2c GIT binary patch literal 2886 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%0D##eq9MSD zY&UA*%HbKqAwGm)9+6JS80K-eIKNXi+WRJ4E-7-gE81+6 zHv3LI{-!k$+uSk!A?>(DJN}i9k1fIYTePp90tBzHEnDd_23R7 zi3?;@pasqw5)1k5bLL}UAM+0heuCg15&R^!-1 zpWt->2tO;9BgGH370Dj!Q$ngm`7S+25J@fBM1j$iRp5T+dt$L<g!qyMJ=Kf>a(J$VJ63bEb8~k$H&2r8B2^hyO7Qxop!b+aKrLnQD2JrCy5MgNZoddwzc^OCxO3s0<<#T8r9?_ zyVosVviTP8KpkUH%PW;GMzg>uDB_LcFYwL;gHi$EhU3OwZ3{k{zOW?{*ZjGKtsbX% zhyI_q{t*O)5Pr?~W7j|e&;w6+TR-1KV6yd_({3L(@x{w!cb!)$Uar-HMx}Jx7U>qd zy=sJ&z3Dl(xB25u7rTSs*y4AbVGo3J!_*P~Y=%u>e|{H~GKT=%fk-fWDtH6)A6TRN z{s>cyry!#E$4vhTK-e9P*SW#FR&THeA$!;U?&SWCVidCS7G>rQkcs_}vYQg-dnj-2 zEB7~v&lEn&{mp#^^Wo4Tv2Fg62OH{5HU%l>)l)|AmE-Wag$?2B*uaPJ#xuAheZ;t2r8P&6Qg< z4%tE9{A&8H&DQFlJVF9nG2V+8gxlaWr=1;%jS2HMa9FkPO)zWJqD?M{pkR zF5*J~5BI;fcjpeW`vN|}CV#>~ z?|q=|8E(Q!eG+5c#H8;yS=#tf&HIxk=24@|v!3BLqPM+O+V2rr2O`(s5_18Ef5 zn>YGl_R=lGR38Dwsl7eZd$d7jxp91-V#)_`#a`Cm!w1$j8)p3o0Xf^vE;lN;uPIfg z8MbBw+a1C~qei_{uO2j)N=F_!e7NoYPp|&;nvc6>uk@$^^xEG(k=f2{j$jADPJ&$o zy9w?ixSwDT!Crzq!9Ifh1P>4#AUH@sv1ec99A@evf`05- znYz|!r7@$@$NtviD6`yKcT01{&EQFJkZ+g0qVY5k;ASE^;dPj0#bfO461<1tJi!Hm z_YxEc-bYX*xJXbUz=;;~vjjg)@JWKdPY@E!68sp!X9zw^@OgsYB={=9*9d->;Ohim zCSa7ps(cj?-(vRL1ZtB1AyYKIR28e-R+*`stmm*zIW$=*?3u8?Qawgi3aDbz8)45S zW)nN13VtWWpL7g48=B9D<7dSB9hW9IjAviS9?8yTHz%E>Gx$h0o$b!{WP7tI{L5r} Thcm+&q>g0!vKz94NcI08&6-XK literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/unbind.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/__pycache__/unbind.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ea944d981743d18eff9b0589ae12b8453a58719 GIT binary patch literal 348 zcmYk1F-yci5QX0+xkL{F>9nyGQrv~pvk*iC`zsWiG$EH=A+X7=n+@KL. + +from ..protocol.rfc4511 import AbandonRequest, MessageID + + +def abandon_operation(msg_id): + # AbandonRequest ::= [APPLICATION 16] MessageID + request = AbandonRequest(MessageID(msg_id)) + return request + + +def abandon_request_to_dict(request): + return {'messageId': str(request)} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/add.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/add.py new file mode 100644 index 0000000..d0b95b4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/add.py @@ -0,0 +1,72 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SEQUENCE_TYPES +from ..protocol.rfc4511 import AddRequest, LDAPDN, AttributeList, Attribute, AttributeDescription, ResultCode, Vals +from ..protocol.convert import referrals_to_list, attributes_to_dict, validate_attribute_value, prepare_for_sending + + +def add_operation(dn, + attributes, + auto_encode, + schema=None, + validator=None, + check_names=False): + # AddRequest ::= [APPLICATION 8] SEQUENCE { + # entry LDAPDN, + # attributes AttributeList } + # + # attributes is a dictionary in the form 'attribute': ['val1', 'val2', 'valN'] + attribute_list = AttributeList() + for pos, attribute in enumerate(attributes): + attribute_list[pos] = Attribute() + attribute_list[pos]['type'] = AttributeDescription(attribute) + vals = Vals() # changed from ValsAtLeast1() for allowing empty member value in groups + if isinstance(attributes[attribute], SEQUENCE_TYPES): + for index, value in enumerate(attributes[attribute]): + vals.setComponentByPosition(index, prepare_for_sending(validate_attribute_value(schema, attribute, value, auto_encode, validator, check_names))) + else: + vals.setComponentByPosition(0, prepare_for_sending(validate_attribute_value(schema, attribute, attributes[attribute], auto_encode, validator, check_names))) + + attribute_list[pos]['vals'] = vals + + request = AddRequest() + request['entry'] = LDAPDN(dn) + request['attributes'] = attribute_list + + return request + + +def add_request_to_dict(request): + return {'entry': str(request['entry']), + 'attributes': attributes_to_dict(request['attributes'])} + + +def add_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/bind.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/bind.py new file mode 100644 index 0000000..43ad1fb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/bind.py @@ -0,0 +1,160 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SIMPLE, ANONYMOUS, SASL, STRING_TYPES +from ..core.results import RESULT_CODES +from ..core.exceptions import LDAPUserNameIsMandatoryError, LDAPPasswordIsMandatoryError, LDAPUnknownAuthenticationMethodError, LDAPUserNameNotAllowedError +from ..protocol.sasl.sasl import validate_simple_password +from ..protocol.rfc4511 import Version, AuthenticationChoice, Simple, BindRequest, ResultCode, SaslCredentials, BindResponse, \ + LDAPDN, LDAPString, Referral, ServerSaslCreds, SicilyPackageDiscovery, SicilyNegotiate, SicilyResponse +from ..protocol.convert import authentication_choice_to_dict, referrals_to_list +from ..utils.conv import to_unicode, to_raw + +# noinspection PyUnresolvedReferences +def bind_operation(version, + authentication, + name='', + password=None, + sasl_mechanism=None, + sasl_credentials=None, + auto_encode=False): + # BindRequest ::= [APPLICATION 0] SEQUENCE { + # version INTEGER (1 .. 127), + # name LDAPDN, + # authentication AuthenticationChoice } + request = BindRequest() + request['version'] = Version(version) + if name is None: + name = '' + if isinstance(name, STRING_TYPES): + request['name'] = to_unicode(name) if auto_encode else name + if authentication == SIMPLE: + if not name: + raise LDAPUserNameIsMandatoryError('user name is mandatory in simple bind') + if password: + request['authentication'] = AuthenticationChoice().setComponentByName('simple', Simple(validate_simple_password(password))) + else: + raise LDAPPasswordIsMandatoryError('password is mandatory in simple bind') + elif authentication == SASL: + sasl_creds = SaslCredentials() + sasl_creds['mechanism'] = sasl_mechanism + if sasl_credentials is not None: + sasl_creds['credentials'] = sasl_credentials + # else: + # sasl_creds['credentials'] = None + request['authentication'] = AuthenticationChoice().setComponentByName('sasl', sasl_creds) + elif authentication == ANONYMOUS: + if name: + raise LDAPUserNameNotAllowedError('user name not allowed in anonymous bind') + request['name'] = '' + request['authentication'] = AuthenticationChoice().setComponentByName('simple', Simple('')) + elif authentication == 'SICILY_PACKAGE_DISCOVERY': # https://msdn.microsoft.com/en-us/library/cc223501.aspx + request['name'] = '' + request['authentication'] = AuthenticationChoice().setComponentByName('sicilyPackageDiscovery', SicilyPackageDiscovery('')) + elif authentication == 'SICILY_NEGOTIATE_NTLM': # https://msdn.microsoft.com/en-us/library/cc223501.aspx + request['name'] = 'NTLM' + request['authentication'] = AuthenticationChoice().setComponentByName('sicilyNegotiate', SicilyNegotiate(name.create_negotiate_message())) # ntlm client in self.name + elif authentication == 'SICILY_RESPONSE_NTLM': # https://msdn.microsoft.com/en-us/library/cc223501.aspx + name.parse_challenge_message(password) # server_creds returned by server in password + server_creds = name.create_authenticate_message() + if server_creds: + request['name'] = '' + request['authentication'] = AuthenticationChoice().setComponentByName('sicilyResponse', SicilyResponse(server_creds)) + else: + request = None + else: + raise LDAPUnknownAuthenticationMethodError('unknown authentication method') + + return request + + +def bind_request_to_dict(request): + return {'version': int(request['version']), + 'name': str(request['name']), + 'authentication': authentication_choice_to_dict(request['authentication'])} + + +def bind_response_operation(result_code, + matched_dn='', + diagnostic_message='', + referral=None, + server_sasl_credentials=None): + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + response = BindResponse() + response['resultCode'] = ResultCode(result_code) + response['matchedDN'] = LDAPDN(matched_dn) + response['diagnosticMessage'] = LDAPString(diagnostic_message) + if referral: + response['referral'] = Referral(referral) + + if server_sasl_credentials: + response['serverSaslCreds'] = ServerSaslCreds(server_sasl_credentials) + + return response + + +def bind_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral']) if response['referral'] is not None and response['referral'].hasValue() else [], + 'saslCreds': bytes(response['serverSaslCreds']) if response['serverSaslCreds'] is not None and response['serverSaslCreds'].hasValue() else None} + + +def sicily_bind_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'server_creds': bytes(response['matchedDN']), + 'error_message': str(response['diagnosticMessage'])} + + +def bind_response_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['dn'] = to_unicode(response[1][3], from_server=True) # matchedDN + response_dict['message'] = to_unicode(response[2][3], from_server=True) # diagnosticMessage + response_dict['referrals'] = None # referrals + response_dict['saslCreds'] = None # saslCreds + for r in response[3:]: + if r[2] == 3: # referrals + response_dict['referrals'] = referrals_to_list(r[3]) # referrals + else: + response_dict['saslCreds'] = bytes(r[3]) # saslCreds + + return response_dict + + +def sicily_bind_response_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['server_creds'] = bytes(response[1][3]) # server_creds + response_dict['error_message'] = to_unicode(response[2][3], from_server=True) # error_message + + return response_dict diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/compare.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/compare.py new file mode 100644 index 0000000..2232f61 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/compare.py @@ -0,0 +1,64 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.convert import validate_attribute_value, prepare_for_sending +from ..protocol.rfc4511 import CompareRequest, AttributeValueAssertion, AttributeDescription, LDAPDN, AssertionValue, ResultCode +from ..operation.search import ava_to_dict +from ..operation.bind import referrals_to_list + + +def compare_operation(dn, + attribute, + value, + auto_encode, + schema=None, + validator=None, + check_names=False): + # CompareRequest ::= [APPLICATION 14] SEQUENCE { + # entry LDAPDN, + # ava AttributeValueAssertion } + ava = AttributeValueAssertion() + ava['attributeDesc'] = AttributeDescription(attribute) + ava['assertionValue'] = AssertionValue(prepare_for_sending(validate_attribute_value(schema, attribute, value, auto_encode, validator, check_names=check_names))) + + request = CompareRequest() + request['entry'] = LDAPDN(dn) + request['ava'] = ava + + return request + + +def compare_request_to_dict(request): + ava = ava_to_dict(request['ava']) + return {'entry': str(request['entry']), + 'attribute': ava['attribute'], + 'value': ava['value']} + + +def compare_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/delete.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/delete.py new file mode 100644 index 0000000..2db40f4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/delete.py @@ -0,0 +1,46 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.rfc4511 import DelRequest, LDAPDN, ResultCode +from ..operation.bind import referrals_to_list + + +def delete_operation(dn): + # DelRequest ::= [APPLICATION 10] LDAPDN + request = DelRequest(LDAPDN(dn)) + + return request + + +def delete_request_to_dict(request): + return {'entry': str(request)} + + +def delete_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/extended.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/extended.py new file mode 100644 index 0000000..4b1ebc7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/extended.py @@ -0,0 +1,109 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString +from pyasn1.type.base import Asn1Item + +from ..core.results import RESULT_CODES +from ..protocol.rfc4511 import ExtendedRequest, RequestName, ResultCode, RequestValue +from ..protocol.convert import referrals_to_list +from ..utils.asn1 import encode +from ..utils.conv import to_unicode + +# ExtendedRequest ::= [APPLICATION 23] SEQUENCE { +# requestName [0] LDAPOID, +# requestValue [1] OCTET STRING OPTIONAL } + + +def extended_operation(request_name, + request_value=None, + no_encode=None): + request = ExtendedRequest() + request['requestName'] = RequestName(request_name) + if request_value and isinstance(request_value, Asn1Item): + request['requestValue'] = RequestValue(encode(request_value)) + elif str is not bytes and isinstance(request_value, (bytes, bytearray)): # in Python 3 doesn't try to encode a byte value + request['requestValue'] = request_value + elif request_value and no_encode: # doesn't encode the value + request['requestValue'] = request_value + elif request_value: # tries to encode as a octet string + request['requestValue'] = RequestValue(encode(OctetString(str(request_value)))) + + # elif request_value is not None: + # raise LDAPExtensionError('unable to encode value for extended operation') + return request + + +def extended_request_to_dict(request): + # return {'name': str(request['requestName']), 'value': bytes(request['requestValue']) if request['requestValue'] else None} + return {'name': str(request['requestName']), 'value': bytes(request['requestValue']) if 'requestValue' in request and request['requestValue'] is not None and request['requestValue'].hasValue() else None} + +def extended_response_to_dict(response): + return {'result': int(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'referrals': referrals_to_list(response['referral']), + 'responseName': str(response['responseName']) if response['responseName'] is not None and response['responseName'].hasValue() else str(), + 'responseValue': bytes(response['responseValue']) if response['responseValue'] is not None and response['responseValue'].hasValue() else bytes()} + + +def intermediate_response_to_dict(response): + return {'responseName': str(response['responseName']), + 'responseValue': bytes(response['responseValue']) if response['responseValue'] else bytes()} + + +def extended_response_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['dn'] = to_unicode(response[1][3], from_server=True) # matchedDN + response_dict['message'] = to_unicode(response[2][3], from_server=True) # diagnosticMessage + response_dict['referrals'] = None # referrals + response_dict['responseName'] = None # referrals + response_dict['responseValue'] = None # responseValue + + for r in response[3:]: + if r[2] == 3: # referrals + response_dict['referrals'] = referrals_to_list(r[3]) # referrals + elif r[2] == 10: # responseName + response_dict['responseName'] = to_unicode(r[3], from_server=True) + response_dict['responseValue'] = b'' # responseValue could be empty + + else: # responseValue (11) + response_dict['responseValue'] = bytes(r[3]) + + return response_dict + + +def intermediate_response_to_dict_fast(response): + response_dict = dict() + for r in response: + if r[2] == 0: # responseName + response_dict['responseName'] = to_unicode(r[3], from_server=True) + else: # responseValue (1) + response_dict['responseValue'] = bytes(r[3]) + + return response_dict diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modify.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modify.py new file mode 100644 index 0000000..31867e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modify.py @@ -0,0 +1,96 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SEQUENCE_TYPES, MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, MODIFY_INCREMENT +from ..protocol.rfc4511 import ModifyRequest, LDAPDN, Changes, Change, Operation, PartialAttribute, AttributeDescription, Vals, ResultCode +from ..operation.bind import referrals_to_list +from ..protocol.convert import changes_to_list, validate_attribute_value, prepare_for_sending + +# ModifyRequest ::= [APPLICATION 6] SEQUENCE { +# object LDAPDN, +# changes SEQUENCE OF change SEQUENCE { +# operation ENUMERATED { +# add (0), +# delete (1), +# replace (2), +# ... }, +# modification PartialAttribute } } + +change_table = {MODIFY_ADD: 0, # accepts actual values too + MODIFY_DELETE: 1, + MODIFY_REPLACE: 2, + MODIFY_INCREMENT: 3, + 0: 0, + 1: 1, + 2: 2, + 3: 3} + + +def modify_operation(dn, + changes, + auto_encode, + schema=None, + validator=None, + check_names=False): + # changes is a dictionary in the form {'attribute': [(operation, [val1, ...]), ...], ...} + # operation is 0 (add), 1 (delete), 2 (replace), 3 (increment) + # increment as per RFC4525 + + change_list = Changes() + pos = 0 + for attribute in changes: + for change_operation in changes[attribute]: + partial_attribute = PartialAttribute() + partial_attribute['type'] = AttributeDescription(attribute) + partial_attribute['vals'] = Vals() + if isinstance(change_operation[1], SEQUENCE_TYPES): + for index, value in enumerate(change_operation[1]): + partial_attribute['vals'].setComponentByPosition(index, prepare_for_sending(validate_attribute_value(schema, attribute, value, auto_encode, validator, check_names=check_names))) + else: + partial_attribute['vals'].setComponentByPosition(0, prepare_for_sending(validate_attribute_value(schema, attribute, change_operation[1], auto_encode, validator, check_names=check_names))) + change = Change() + change['operation'] = Operation(change_table[change_operation[0]]) + change['modification'] = partial_attribute + + change_list[pos] = change + pos += 1 + + request = ModifyRequest() + request['object'] = LDAPDN(dn) + request['changes'] = change_list + return request + + +def modify_request_to_dict(request): + return {'entry': str(request['object']), + 'changes': changes_to_list(request['changes'])} + + +def modify_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'message': str(response['diagnosticMessage']), + 'dn': str(response['matchedDN']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modifyDn.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modifyDn.py new file mode 100644 index 0000000..73c6da3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/modifyDn.py @@ -0,0 +1,62 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.rfc4511 import ModifyDNRequest, LDAPDN, RelativeLDAPDN, DeleteOldRDN, NewSuperior, ResultCode +from ..operation.bind import referrals_to_list + +# ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { +# entry LDAPDN, +# newrdn RelativeLDAPDN, +# deleteoldrdn BOOLEAN, +# newSuperior [0] LDAPDN OPTIONAL } + + +def modify_dn_operation(dn, + new_relative_dn, + delete_old_rdn=True, + new_superior=None): + request = ModifyDNRequest() + request['entry'] = LDAPDN(dn) + request['newrdn'] = RelativeLDAPDN(new_relative_dn) + request['deleteoldrdn'] = DeleteOldRDN(delete_old_rdn) + if new_superior: + request['newSuperior'] = NewSuperior(new_superior) + + return request + + +def modify_dn_request_to_dict(request): + return {'entry': str(request['entry']), + 'newRdn': str(request['newrdn']), + 'deleteOldRdn': bool(request['deleteoldrdn']), + 'newSuperior': str(request['newSuperior']) if request['newSuperior'] is not None and request['newSuperior'].hasValue() else None} + + +def modify_dn_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'referrals': referrals_to_list(response['referral']), + 'message': str(response['diagnosticMessage'])} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/search.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/search.py new file mode 100644 index 0000000..e12c13c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/search.py @@ -0,0 +1,579 @@ +""" +""" + +# Created on 2013.06.02 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from string import whitespace +from os import linesep + +from .. import DEREF_NEVER, BASE, LEVEL, SUBTREE, DEREF_SEARCH, DEREF_BASE, DEREF_ALWAYS, NO_ATTRIBUTES, SEQUENCE_TYPES, get_config_parameter, STRING_TYPES + +from ..core.exceptions import LDAPInvalidFilterError, LDAPAttributeError, LDAPInvalidScopeError, LDAPInvalidDereferenceAliasesError +from ..utils.ciDict import CaseInsensitiveDict +from ..protocol.rfc4511 import SearchRequest, LDAPDN, Scope, DerefAliases, Integer0ToMax, TypesOnly, \ + AttributeSelection, Selector, EqualityMatch, AttributeDescription, AssertionValue, Filter, \ + Not, And, Or, ApproxMatch, GreaterOrEqual, LessOrEqual, ExtensibleMatch, Present, SubstringFilter, \ + Substrings, Final, Initial, Any, ResultCode, Substring, MatchingRule, Type, MatchValue, DnAttributes +from ..operation.bind import referrals_to_list +from ..protocol.convert import ava_to_dict, attributes_to_list, search_refs_to_list, validate_assertion_value, prepare_filter_for_sending, search_refs_to_list_fast +from ..protocol.formatters.standard import format_attribute_values +from ..utils.conv import to_unicode, to_raw + +ROOT = 0 +AND = 1 +OR = 2 +NOT = 3 +MATCH_APPROX = 4 +MATCH_GREATER_OR_EQUAL = 5 +MATCH_LESS_OR_EQUAL = 6 +MATCH_EXTENSIBLE = 7 +MATCH_PRESENT = 8 +MATCH_SUBSTRING = 9 +MATCH_EQUAL = 10 + +SEARCH_OPEN = 20 +SEARCH_OPEN_OR_CLOSE = 21 +SEARCH_MATCH_OR_CLOSE = 22 +SEARCH_MATCH_OR_CONTROL = 23 + + +class FilterNode(object): + def __init__(self, tag=None, assertion=None): + self.tag = tag + self.parent = None + self.assertion = assertion + self.elements = [] + + def append(self, filter_node): + filter_node.parent = self + self.elements.append(filter_node) + return filter_node + + def __str__(self, pos=0): + self.__repr__(pos) + + def __repr__(self, pos=0): + node_tags = ['ROOT', 'AND', 'OR', 'NOT', 'MATCH_APPROX', 'MATCH_GREATER_OR_EQUAL', 'MATCH_LESS_OR_EQUAL', 'MATCH_EXTENSIBLE', 'MATCH_PRESENT', 'MATCH_SUBSTRING', 'MATCH_EQUAL'] + representation = ' ' * pos + 'tag: ' + node_tags[self.tag] + ' - assertion: ' + str(self.assertion) + if self.elements: + representation += ' - elements: ' + str(len(self.elements)) + for element in self.elements: + representation += linesep + ' ' * pos + element.__repr__(pos + 2) + return representation + + +def evaluate_match(match, schema, auto_escape, auto_encode, validator, check_names): + left_part, equal_sign, right_part = match.strip().partition('=') + if not equal_sign: + raise LDAPInvalidFilterError('invalid matching assertion') + if left_part.endswith('~'): # approximate match '~=' + tag = MATCH_APPROX + left_part = left_part[:-1].strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + elif left_part.endswith('>'): # greater or equal match '>=' + tag = MATCH_GREATER_OR_EQUAL + left_part = left_part[:-1].strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + elif left_part.endswith('<'): # less or equal match '<=' + tag = MATCH_LESS_OR_EQUAL + left_part = left_part[:-1].strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + elif left_part.endswith(':'): # extensible match ':=' + tag = MATCH_EXTENSIBLE + left_part = left_part[:-1].strip() + right_part = right_part.strip() + extended_filter_list = left_part.split(':') + matching_rule = False + dn_attributes = False + attribute_name = False + if extended_filter_list[0] == '': # extensible filter format [:dn]:matchingRule:=assertionValue + if len(extended_filter_list) == 2 and extended_filter_list[1].lower().strip() != 'dn': + matching_rule = extended_filter_list[1] + elif len(extended_filter_list) == 3 and extended_filter_list[1].lower().strip() == 'dn': + dn_attributes = True + matching_rule = extended_filter_list[2] + else: + raise LDAPInvalidFilterError('invalid extensible filter') + elif len(extended_filter_list) <= 3: # extensible filter format attr[:dn][:matchingRule]:=assertionValue + if len(extended_filter_list) == 1: + attribute_name = extended_filter_list[0] + elif len(extended_filter_list) == 2: + attribute_name = extended_filter_list[0] + if extended_filter_list[1].lower().strip() == 'dn': + dn_attributes = True + else: + matching_rule = extended_filter_list[1] + elif len(extended_filter_list) == 3 and extended_filter_list[1].lower().strip() == 'dn': + attribute_name = extended_filter_list[0] + dn_attributes = True + matching_rule = extended_filter_list[2] + else: + raise LDAPInvalidFilterError('invalid extensible filter') + + if not attribute_name and not matching_rule: + raise LDAPInvalidFilterError('invalid extensible filter') + attribute_name = attribute_name.strip() if attribute_name else False + matching_rule = matching_rule.strip() if matching_rule else False + assertion = {'attr': attribute_name, 'value': validate_assertion_value(schema, attribute_name, right_part, auto_escape, auto_encode, validator, check_names), 'matchingRule': matching_rule, 'dnAttributes': dn_attributes} + elif right_part == '*': # attribute present match '=*' + tag = MATCH_PRESENT + left_part = left_part.strip() + assertion = {'attr': left_part} + elif '*' in right_part: # substring match '=initial*substring*substring*final' + tag = MATCH_SUBSTRING + left_part = left_part.strip() + right_part = right_part.strip() + substrings = right_part.split('*') + initial = validate_assertion_value(schema, left_part, substrings[0], auto_escape, auto_encode, validator, check_names) if substrings[0] else None + final = validate_assertion_value(schema, left_part, substrings[-1], auto_escape, auto_encode, validator, check_names) if substrings[-1] else None + any_string = [validate_assertion_value(schema, left_part, substring, auto_escape, auto_encode, validator, check_names) for substring in substrings[1:-1] if substring] + #assertion = {'attr': left_part, 'initial': initial, 'any': any_string, 'final': final} + assertion = {'attr': left_part} + if initial: + assertion['initial'] = initial + if any_string: + assertion['any'] = any_string + if final: + assertion['final'] = final + else: # equality match '=' + tag = MATCH_EQUAL + left_part = left_part.strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + + return FilterNode(tag, assertion) + + +def parse_filter(search_filter, schema, auto_escape, auto_encode, validator, check_names): + if str is not bytes and isinstance(search_filter, bytes): # python 3 with byte filter + search_filter = to_unicode(search_filter) + search_filter = search_filter.strip() + if search_filter and search_filter.count('(') == search_filter.count(')') and search_filter.startswith('(') and search_filter.endswith(')'): + state = SEARCH_OPEN_OR_CLOSE + root = FilterNode(ROOT) + current_node = root + start_pos = None + skip_white_space = True + just_closed = False + for pos, c in enumerate(search_filter): + if skip_white_space and c in whitespace: + continue + elif (state == SEARCH_OPEN or state == SEARCH_OPEN_OR_CLOSE) and c == '(': + state = SEARCH_MATCH_OR_CONTROL + just_closed = False + elif state == SEARCH_MATCH_OR_CONTROL and c in '&!|': + if c == '&': + current_node = current_node.append(FilterNode(AND)) + elif c == '|': + current_node = current_node.append(FilterNode(OR)) + elif c == '!': + current_node = current_node.append(FilterNode(NOT)) + state = SEARCH_OPEN + elif (state == SEARCH_MATCH_OR_CLOSE or state == SEARCH_OPEN_OR_CLOSE) and c == ')': + if just_closed: + current_node = current_node.parent + else: + just_closed = True + skip_white_space = True + end_pos = pos + if start_pos: + if current_node.tag == NOT and len(current_node.elements) > 0: + raise LDAPInvalidFilterError('NOT (!) clause in filter cannot be multiple') + current_node.append(evaluate_match(search_filter[start_pos:end_pos], schema, auto_escape, auto_encode, validator, check_names)) + start_pos = None + state = SEARCH_OPEN_OR_CLOSE + elif (state == SEARCH_MATCH_OR_CLOSE or state == SEARCH_MATCH_OR_CONTROL) and c not in '()': + skip_white_space = False + if not start_pos: + start_pos = pos + state = SEARCH_MATCH_OR_CLOSE + else: + raise LDAPInvalidFilterError('malformed filter') + if len(root.elements) != 1: + raise LDAPInvalidFilterError('missing boolean operator in filter') + return root + else: + raise LDAPInvalidFilterError('invalid filter') + + +def compile_filter(filter_node): + """Builds ASN1 structure for filter, converts from filter LDAP escaping to bytes""" + compiled_filter = Filter() + if filter_node.tag == AND: + boolean_filter = And() + pos = 0 + for element in filter_node.elements: + boolean_filter[pos] = compile_filter(element) + pos += 1 + compiled_filter['and'] = boolean_filter + elif filter_node.tag == OR: + boolean_filter = Or() + pos = 0 + for element in filter_node.elements: + boolean_filter[pos] = compile_filter(element) + pos += 1 + compiled_filter['or'] = boolean_filter + elif filter_node.tag == NOT: + boolean_filter = Not() + boolean_filter['innerNotFilter'] = compile_filter(filter_node.elements[0]) + compiled_filter.setComponentByName('notFilter', boolean_filter, verifyConstraints=False) # do not verify constraints because of hack for recursive filters in rfc4511 + + elif filter_node.tag == MATCH_APPROX: + matching_filter = ApproxMatch() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter['approxMatch'] = matching_filter + elif filter_node.tag == MATCH_GREATER_OR_EQUAL: + matching_filter = GreaterOrEqual() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter['greaterOrEqual'] = matching_filter + elif filter_node.tag == MATCH_LESS_OR_EQUAL: + matching_filter = LessOrEqual() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter['lessOrEqual'] = matching_filter + elif filter_node.tag == MATCH_EXTENSIBLE: + matching_filter = ExtensibleMatch() + if filter_node.assertion['matchingRule']: + matching_filter['matchingRule'] = MatchingRule(filter_node.assertion['matchingRule']) + if filter_node.assertion['attr']: + matching_filter['type'] = Type(filter_node.assertion['attr']) + matching_filter['matchValue'] = MatchValue(prepare_filter_for_sending(filter_node.assertion['value'])) + matching_filter['dnAttributes'] = DnAttributes(filter_node.assertion['dnAttributes']) + compiled_filter['extensibleMatch'] = matching_filter + elif filter_node.tag == MATCH_PRESENT: + matching_filter = Present(AttributeDescription(filter_node.assertion['attr'])) + compiled_filter['present'] = matching_filter + elif filter_node.tag == MATCH_SUBSTRING: + matching_filter = SubstringFilter() + matching_filter['type'] = AttributeDescription(filter_node.assertion['attr']) + substrings = Substrings() + pos = 0 + if 'initial' in filter_node.assertion and filter_node.assertion['initial']: + substrings[pos] = Substring().setComponentByName('initial', Initial(prepare_filter_for_sending(filter_node.assertion['initial']))) + pos += 1 + if 'any' in filter_node.assertion and filter_node.assertion['any']: + for substring in filter_node.assertion['any']: + substrings[pos] = Substring().setComponentByName('any', Any(prepare_filter_for_sending(substring))) + pos += 1 + if 'final' in filter_node.assertion and filter_node.assertion['final']: + substrings[pos] = Substring().setComponentByName('final', Final(prepare_filter_for_sending(filter_node.assertion['final']))) + matching_filter['substrings'] = substrings + compiled_filter['substringFilter'] = matching_filter + elif filter_node.tag == MATCH_EQUAL: + matching_filter = EqualityMatch() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter.setComponentByName('equalityMatch', matching_filter) + else: + raise LDAPInvalidFilterError('unknown filter node tag') + + return compiled_filter + + +def build_attribute_selection(attribute_list, schema): + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + + attribute_selection = AttributeSelection() + for index, attribute in enumerate(attribute_list): + if schema and schema.attribute_types: + if ';' in attribute: # exclude tags from validation + if not attribute[0:attribute.index(';')] in schema.attribute_types and attribute.lower() not in conf_attributes_excluded_from_check: + raise LDAPAttributeError('invalid attribute type in attribute list: ' + attribute) + else: + if attribute not in schema.attribute_types and attribute.lower() not in conf_attributes_excluded_from_check: + raise LDAPAttributeError('invalid attribute type in attribute list: ' + attribute) + attribute_selection[index] = Selector(attribute) + + return attribute_selection + + +def search_operation(search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + auto_escape, + auto_encode, + schema=None, + validator=None, + check_names=False): + # SearchRequest ::= [APPLICATION 3] SEQUENCE { + # baseObject LDAPDN, + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + # ... }, + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + # sizeLimit INTEGER (0 .. maxInt), + # timeLimit INTEGER (0 .. maxInt), + # typesOnly BOOLEAN, + # filter Filter, + # attributes AttributeSelection } + request = SearchRequest() + request['baseObject'] = LDAPDN(search_base) + + if search_scope == BASE or search_scope == 0: + request['scope'] = Scope('baseObject') + elif search_scope == LEVEL or search_scope == 1: + request['scope'] = Scope('singleLevel') + elif search_scope == SUBTREE or search_scope == 2: + request['scope'] = Scope('wholeSubtree') + else: + raise LDAPInvalidScopeError('invalid scope type') + + if dereference_aliases == DEREF_NEVER or dereference_aliases == 0: + request['derefAliases'] = DerefAliases('neverDerefAliases') + elif dereference_aliases == DEREF_SEARCH or dereference_aliases == 1: + request['derefAliases'] = DerefAliases('derefInSearching') + elif dereference_aliases == DEREF_BASE or dereference_aliases == 2: + request['derefAliases'] = DerefAliases('derefFindingBaseObj') + elif dereference_aliases == DEREF_ALWAYS or dereference_aliases == 3: + request['derefAliases'] = DerefAliases('derefAlways') + else: + raise LDAPInvalidDereferenceAliasesError('invalid dereference aliases type') + + request['sizeLimit'] = Integer0ToMax(size_limit) + request['timeLimit'] = Integer0ToMax(time_limit) + request['typesOnly'] = TypesOnly(True) if types_only else TypesOnly(False) + request['filter'] = compile_filter(parse_filter(search_filter, schema, auto_escape, auto_encode, validator, check_names).elements[0]) # parse the searchFilter string and compile it starting from the root node + if not isinstance(attributes, SEQUENCE_TYPES): + attributes = [NO_ATTRIBUTES] + + request['attributes'] = build_attribute_selection(attributes, schema) + + return request + + +def decode_vals(vals): + try: + return [str(val) for val in vals if val] if vals else None + except UnicodeDecodeError: + return decode_raw_vals(vals) + +def decode_vals_fast(vals): + try: + return [to_unicode(val[3], from_server=True) for val in vals if val] if vals else None + except UnicodeDecodeError: + return [val[3] for val in vals if val] if vals else None + + +def attributes_to_dict(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[str(attribute['type'])] = decode_vals(attribute['vals']) + return attributes + + +def attributes_to_dict_fast(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[to_unicode(attribute[3][0][3], from_server=True)] = decode_vals_fast(attribute[3][1][3]) + + return attributes + + +def decode_raw_vals(vals): + return [bytes(val) for val in vals] if vals else None + + +def decode_raw_vals_fast(vals): + return [bytes(val[3]) for val in vals] if vals else None + + +def raw_attributes_to_dict(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[str(attribute['type'])] = decode_raw_vals(attribute['vals']) + + return attributes + + +def raw_attributes_to_dict_fast(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[to_unicode(attribute[3][0][3], from_server=True)] = decode_raw_vals_fast(attribute[3][1][3]) + + return attributes + + +def checked_attributes_to_dict(attribute_list, schema=None, custom_formatter=None): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + + checked_attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + name = str(attribute['type']) + checked_attributes[name] = format_attribute_values(schema, name, decode_raw_vals(attribute['vals']) or [], custom_formatter) + return checked_attributes + + +def checked_attributes_to_dict_fast(attribute_list, schema=None, custom_formatter=None): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + + checked_attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + name = to_unicode(attribute[3][0][3], from_server=True) + checked_attributes[name] = format_attribute_values(schema, name, decode_raw_vals_fast(attribute[3][1][3]) or [], custom_formatter) + return checked_attributes + + +def matching_rule_assertion_to_string(matching_rule_assertion): + return str(matching_rule_assertion) + + +def filter_to_string(filter_object): + filter_type = filter_object.getName() + filter_string = '(' + if filter_type == 'and': + filter_string += '&' + for f in filter_object['and']: + filter_string += filter_to_string(f) + elif filter_type == 'or': + filter_string += '|' + for f in filter_object['or']: + filter_string += filter_to_string(f) + elif filter_type == 'notFilter': + filter_string += '!' + filter_to_string(filter_object['notFilter']['innerNotFilter']) + elif filter_type == 'equalityMatch': + ava = ava_to_dict(filter_object['equalityMatch']) + filter_string += ava['attribute'] + '=' + ava['value'] + elif filter_type == 'substringFilter': + attribute = filter_object['substringFilter']['type'] + filter_string += str(attribute) + '=' + for substring in filter_object['substringFilter']['substrings']: + component = substring.getName() + if substring[component] is not None and substring[component].hasValue(): + if component == 'initial': + filter_string += str(substring['initial']) + '*' + elif component == 'any': + filter_string += str(substring['any']) if filter_string.endswith('*') else '*' + str(substring['any']) + filter_string += '*' + elif component == 'final': + filter_string += '*' + str(substring['final']) + elif filter_type == 'greaterOrEqual': + ava = ava_to_dict(filter_object['greaterOrEqual']) + filter_string += ava['attribute'] + '>=' + ava['value'] + elif filter_type == 'lessOrEqual': + ava = ava_to_dict(filter_object['lessOrEqual']) + filter_string += ava['attribute'] + '<=' + ava['value'] + elif filter_type == 'present': + filter_string += str(filter_object['present']) + '=*' + elif filter_type == 'approxMatch': + ava = ava_to_dict(filter_object['approxMatch']) + filter_string += ava['attribute'] + '~=' + ava['value'] + elif filter_type == 'extensibleMatch': + filter_string += matching_rule_assertion_to_string(filter_object['extensibleMatch']) + else: + raise LDAPInvalidFilterError('error converting filter to string') + filter_string += ')' + + if str is bytes: # Python2, forces conversion to Unicode + filter_string = to_unicode(filter_string) + + return filter_string + + +def search_request_to_dict(request): + return {'base': str(request['baseObject']), + 'scope': int(request['scope']), + 'dereferenceAlias': int(request['derefAliases']), + 'sizeLimit': int(request['sizeLimit']), + 'timeLimit': int(request['timeLimit']), + 'typesOnly': bool(request['typesOnly']), + 'filter': filter_to_string(request['filter']), + 'attributes': attributes_to_list(request['attributes'])} + + +def search_result_entry_response_to_dict(response, schema, custom_formatter, check_names): + entry = dict() + # entry['dn'] = str(response['object']) + if response['object']: + if isinstance(response['object'], STRING_TYPES): # mock strategies return string not a PyAsn1 object + entry['raw_dn'] = to_raw(response['object']) + entry['dn'] = to_unicode(response['object']) + else: + entry['raw_dn'] = str(response['object']) + entry['dn'] = to_unicode(bytes(response['object']), from_server=True) + else: + entry['raw_dn'] = b'' + entry['dn'] = '' + entry['raw_attributes'] = raw_attributes_to_dict(response['attributes']) + if check_names: + entry['attributes'] = checked_attributes_to_dict(response['attributes'], schema, custom_formatter) + else: + entry['attributes'] = attributes_to_dict(response['attributes']) + + return entry + + +def search_result_done_response_to_dict(response): + result = {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'message': str(response['diagnosticMessage']), + 'dn': str(response['matchedDN']), + 'referrals': referrals_to_list(response['referral'])} + + if 'controls' in response: # used for returning controls in Mock strategies + result['controls'] = dict() + for control in response['controls']: + result['controls'][control[0]] = control[1] + + return result + + +def search_result_reference_response_to_dict(response): + return {'uri': search_refs_to_list(response)} + + +def search_result_entry_response_to_dict_fast(response, schema, custom_formatter, check_names): + entry_dict = dict() + entry_dict['raw_dn'] = response[0][3] + entry_dict['dn'] = to_unicode(response[0][3], from_server=True) + entry_dict['raw_attributes'] = raw_attributes_to_dict_fast(response[1][3]) # attributes + if check_names: + entry_dict['attributes'] = checked_attributes_to_dict_fast(response[1][3], schema, custom_formatter) # attributes + else: + entry_dict['attributes'] = attributes_to_dict_fast(response[1][3]) # attributes + + return entry_dict + + +def search_result_reference_response_to_dict_fast(response): + return {'uri': search_refs_to_list_fast([r[3] for r in response])} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/unbind.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/unbind.py new file mode 100644 index 0000000..4d418fb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/operation/unbind.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2013.09.03 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.rfc4511 import UnbindRequest + + +def unbind_operation(): + # UnbindRequest ::= [APPLICATION 2] NULL + request = UnbindRequest() + return request diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f97050dd7f6c2143efbfa6ff3ad790136dde2414 GIT binary patch literal 141 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CUsn1hxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!#}LD8D2>IX_1~K0Y%qvm`!Vub}c4hfQvNN@-52 L9mvdLAZ7pnCN;l^Q@zr<+YAP4}CNI+0f1ZoPL zLd}3Ps3YJJ5Wzr1pkk;K;0e|-hy+9mKMC*@#0bu^u_u!&f^r%2=~_3=YUQVETe+$% zROPlleRulm!~3_VS2T1HpU9@vLY|iq*5Tlm5b`xf>ku$50e(cVi{K0HN5E0oAxYqp z0vT8ej=>J8fu+IG*D+WFI|laCVVZ$MC3@&<7S|Vn-3y*&(S}dU{r=}$BmK0z_P}Su z&BsD@GK+2akoR`rK!wO)wHfq>gYnqZhP|m@luJxJQ>hf?R2Ttau{!q&DPH^x=M+| z3m&0dyFdUkCU^0fk%T;;3uhh)M21BLsQQ2+n{ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/convert.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/convert.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1481005e8ae9b5f81ad2e38e78df2d519d6d67a6 GIT binary patch literal 9535 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/microsoft.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/microsoft.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b71477f4795c31db495a249514a069290d63cad4 GIT binary patch literal 3327 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 N9(RTLN&M$e?qBUike2`e literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/oid.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/oid.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aab66212322a618fd1840f366143bb468b68bb50 GIT binary patch literal 72211 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 Y{hVA1lka}))BLC8%s2d#`pubt0Nwarw*UYD literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/persistentSearch.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/persistentSearch.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee291f6b2d8a03101ea3321c6115e4a4588de2f6 GIT binary patch literal 1810 zcma)6OK;mo5FUzpP}I}1V<&Bzqy>7=A#@bGk3&$Tek3SRFa{j-usskocb%}{E4!po z74FITD?Rkr^wi5uy3U$Azy(0-0X z{ei#%7@`Hd0f_}^16Tu68<-7g6Ic^0nzJEkLD~k^uKgw?9Y`Hu4y0XRT}WMEE~GtR zJzUWO-iD+P=>XWE_B)UaAsqo5f%TF*z`O7s_w9mk;0m`J!%OZ0@0n;1M9)MwFxm$` zFwwzs?F9JH{6@gXz&GGMzF-sh1Wu=$+H$WkFPPfe^}|%~*YiRs-Mz8(#;c-?^DInm zLQ_lkjPpa7R6 z40#Fy?FK=b^C}^`9|Z5JFsWyxjVG2(0*9cBpa)T&7I}vI(iXpi+@>jlzYliHwAd}; z;&Gg*GE9=kXIxbC{hy!iCOj~Yn7k!FD5pDg>#2Q&9_F+mt z$3?d&t>sk9=gLSK)pj}^YWMJl7;T4~%N{HX$qCt;1X~1@4(k!GyjI(ax7ymFRd*3Q9Ex`B zJ8jFx+eAN{|NoFw+eoUjloYxsDJ(uCIFeL%DX9m?DBgL^lAo9Hc^rjQF$-leccm=m z7E)Zqd8Lkg*01A!m7WRdPu<(8uT(_oN$Nuqo6|y6cgVWY&>9zyaN-$`S_wm=1d6?W z5z+Udi(W44WYt4XYXIuYS zg=eW{K3<=yviL%F@QJn5=>)7J&!hb>W;3G&?JP1|kcTZ)bSd^ZI}MCd8jzfWM&ivvGff ztA2;T0YXFu+<=ThZa`>2ZbE26Zb4`PqdOBa8*&Fi2l5Vtot4#stP6P$!XBP&;0|Pc z$Xy6sV8R66feQxV07Q=xhyh$+bPvAfUEn=&9MY;UDtz? z@_GDv<~zC@MFo}>MYe% zkk4?{L~p>F^9Qs^og;FfbZy#erq(=tBWAuS2Y4?%f(?S3>Q=iuWE&%Vj%$_7XwLsD znR8s0Kd1jS-6p1*w$jo0gLF58^ayX--0(@UE2-ygxBzNmp_|B5rAeHnYIz%+RB3dLUeN%zRH3%gTUC4}cvLqpa6Q0J z@utQvCjjfQ3H#KLAK~8L)SW2eWfDcHq)$ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc2849.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc2849.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3403a4efb5a9ae9ed0e2442b78db9720725e7b6 GIT binary patch literal 7659 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc3062.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc3062.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..633cf9a8ce66b34be74fc6c079e9662204fb1127 GIT binary patch literal 2444 zcmcJQ&u`;I6vvfab`Zx^PTsbP5X~uIsc^r@E6Qo z73?2i%m2i{0DO!ZFdZTdVjX-PVgq~wG*S(SDiBw}uR?5sZ%)+;L^X&l@GXez;MXCx z!M8y>W>sJ&{ESaDf$MOI4{E?Ms{yl=YL%*kY8{xZRJ&B0s5XE(N_9$g1=S|76{W5K zH`H@msJ4K$mD(=VHn3Ibch(BcevQk6j$Sl+L&;@dicxZ2SbhFt%#$I<0ow~>&IXf= z=f!F-lcO{VqnXw*3S$tS7cCi{A4XxGAEt@qucQ*bN<|#X{wU5OKBWICuPSy9u;u$0 zIKoAS7@530zdi@@(@nuhS^3AV_ezK~UI15T|S$ zQQrxI7vnIx8mR>VONT)q4E$|j;==n}7ES!_;zCEmk&GsyhGW8_P^T;lVWtex{sv-= zR0@AT+Lm#)osF{1QIg9riZ;Jzd_4K&)!uf*!tCKy%tR{FVH$0Vv*E*?PxrR6iLmka z9c;OY!7)tjV@+xIgt^{}*i)?TOLnoTz@_EAd%F83z^^r&-!))?+YE$5p-Ewd0&x^A z3T+CD=)@{%GiKA?JEXmfVHevx0@CgafyZAiAV|u4_jK=#2o~S5w~1gKm;2}j0@Cga z!7)$%7lIqx>}?|0z~w%^fq=9H1hh#GDCr4?rGCTFS9IVeTmoETN7)S8&-HDEtY~^m zhK-(7MF%pAjVY0@aeJRlo{?|n^4l;P^NZirPPuK^-QWMh?H_$}a^xKzxj(Ah|L9(n ze%Fmixp#PD-JjG%d}rQ7{rc=*{QB%6UdLWqNHTXp#FZhbZ7S%cESkeK&e8{#Rn9Y+24maaDpu-7*5611u0%a&L&}=>~2X! zy){loKTK_wlKuDQ$LLgJlqF_`^IP)?c(C2{WIBDW3oFz_sYq%H%Vt|xpHENIFUbsZ ST93K0uB~eyHP@}HkMj@LN$NfT literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4511.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4511.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb2feddac16995e23ee17b2934069630363ec91b GIT binary patch literal 26271 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4512.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4512.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cfede22917d0d026cd519f4f33af0770054ad91 GIT binary patch literal 28907 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 I33uoJ0|3lG>;M1& literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4527.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/__pycache__/rfc4527.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e14dbcffc44564a200c02ea02345e7202fa8e55 GIT binary patch literal 1372 zcmd5*&u`N(6n;+HuIu`1lMo;w@C`+ljoQy|j9sq+{DQgRqW>6QrO?Cx zK3W2?1DwFb0pEd%3%(1J68I$`X3hm(hDind3dSXf%fJ_4QU$+?aRuT9h^z3GfWHVP zL|e0A&4x=5*KLSS0|s8RAhi<*7x&zv(SH$a4u`LvKY2ae9u&>Zot^o(KESE|vtao4 z<@UfM#nn-s@HhyymdPmBEKrQINGBpaA*LWH8qGWW9BvU!pyL7~GGtB0lRiavmeVXwwV$;nXHrG16&fU(M zd3v2SZ%T*f$R+Gu){QYbOic^DqK!?TWA+xJ%JNs1%jo|rmqO|PmdtQ$bTM*Wn9KDG zaJige)91+S&5^l+e&4GX3qcTzC. + +from .rfc4511 import Control, Criticality, LDAPOID +from ..utils.asn1 import encode + + +def build_control(oid, criticality, value, encode_control_value=True): + control = Control() + control.setComponentByName('controlType', LDAPOID(oid)) + control.setComponentByName('criticality', Criticality(criticality)) + if value is not None: + if encode_control_value: + control.setComponentByName('controlValue', encode(value)) + else: + control.setComponentByName('controlValue', value) + + return control diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/convert.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/convert.py new file mode 100644 index 0000000..4acc3cb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/convert.py @@ -0,0 +1,221 @@ +""" +""" + +# Created on 2013.07.24 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from pyasn1.error import PyAsn1Error + +from .. import SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from ..core.exceptions import LDAPControlError, LDAPAttributeError, LDAPObjectClassError, LDAPInvalidValueError +from ..protocol.rfc4511 import Controls, Control +from ..utils.conv import to_raw, to_unicode, escape_filter_chars, is_filter_escaped +from ..protocol.formatters.standard import find_attribute_validator + + +def to_str_or_normalized_unicode(val): + """ Attempt to convert value to a string. If that would error, convert it to normalized unicode. + Python 3 string conversion handles unicode -> str without issue, but python 2 doesn't. + """ + try: + return str(val) + except: + return val.encode('ascii', 'backslashreplace') + + +def attribute_to_dict(attribute): + try: + return {'type': str(attribute['type']), 'values': [str(val) for val in attribute['vals']]} + except PyAsn1Error: # invalid encoding, return bytes value + return {'type': str(attribute['type']), 'values': [bytes(val) for val in attribute['vals']]} + + +def attributes_to_dict(attributes): + attributes_dict = dict() + for attribute in attributes: + attribute_dict = attribute_to_dict(attribute) + attributes_dict[attribute_dict['type']] = attribute_dict['values'] + return attributes_dict + + +def referrals_to_list(referrals): + if isinstance(referrals, list): + return [to_str_or_normalized_unicode(referral) for referral in referrals if referral] if referrals else None + else: + return [to_str_or_normalized_unicode(referral) for referral in referrals if referral] if referrals is not None and referrals.hasValue() else None + + +def search_refs_to_list(search_refs): + return [to_str_or_normalized_unicode(search_ref) for search_ref in search_refs if search_ref] if search_refs else None + + +def search_refs_to_list_fast(search_refs): + return [to_unicode(search_ref) for search_ref in search_refs if search_ref] if search_refs else None + + +def sasl_to_dict(sasl): + return {'mechanism': str(sasl['mechanism']), 'credentials': bytes(sasl['credentials']) if sasl['credentials'] is not None and sasl['credentials'].hasValue() else None} + + +def authentication_choice_to_dict(authentication_choice): + return {'simple': str(authentication_choice['simple']) if authentication_choice.getName() == 'simple' else None, 'sasl': sasl_to_dict(authentication_choice['sasl']) if authentication_choice.getName() == 'sasl' else None} + + +def partial_attribute_to_dict(modification): + try: + return {'type': str(modification['type']), 'value': [str(value) for value in modification['vals']]} + except PyAsn1Error: # invalid encoding, return bytes value + return {'type': str(modification['type']), 'value': [bytes(value) for value in modification['vals']]} + + +def change_to_dict(change): + return {'operation': int(change['operation']), 'attribute': partial_attribute_to_dict(change['modification'])} + + +def changes_to_list(changes): + return [change_to_dict(change) for change in changes] + + +def attributes_to_list(attributes): + return [to_str_or_normalized_unicode(attribute) for attribute in attributes] + + +def ava_to_dict(ava): + try: + return {'attribute': str(ava['attributeDesc']), 'value': escape_filter_chars(str(ava['assertionValue']))} + except Exception: # invalid encoding, return bytes value + try: + return {'attribute': str(ava['attributeDesc']), 'value': escape_filter_chars(bytes(ava['assertionValue']))} + except Exception: + return {'attribute': str(ava['attributeDesc']), 'value': bytes(ava['assertionValue'])} + + +def substring_to_dict(substring): + return {'initial': substring['initial'] if substring['initial'] else '', 'any': [middle for middle in substring['any']] if substring['any'] else '', 'final': substring['final'] if substring['final'] else ''} + + +def prepare_changes_for_request(changes): + prepared = dict() + for change in changes: + attribute_name = change['attribute']['type'] + if attribute_name not in prepared: + prepared[attribute_name] = [] + prepared[attribute_name].append((change['operation'], change['attribute']['value'])) + return prepared + + +def build_controls_list(controls): + """controls is a sequence of Control() or sequences + each sequence must have 3 elements: the control OID, the criticality, the value + criticality must be a boolean + """ + + if not controls: + return None + + if not isinstance(controls, SEQUENCE_TYPES): + raise LDAPControlError('controls must be a sequence') + + built_controls = Controls() + for idx, control in enumerate(controls): + if isinstance(control, Control): + built_controls.setComponentByPosition(idx, control) + elif len(control) == 3 and isinstance(control[1], bool): + built_control = Control() + built_control['controlType'] = control[0] + built_control['criticality'] = control[1] + if control[2] is not None: + built_control['controlValue'] = control[2] + built_controls.setComponentByPosition(idx, built_control) + else: + raise LDAPControlError('control must be a sequence of 3 elements: controlType, criticality (boolean) and controlValue (None if not provided)') + + return built_controls + + +def validate_assertion_value(schema, name, value, auto_escape, auto_encode, validator, check_names): + value = to_unicode(value) + if auto_escape: + if '\\' in value and not is_filter_escaped(value): + value = escape_filter_chars(value) + value = validate_attribute_value(schema, name, value, auto_encode, validator=validator, check_names=check_names) + return value + + +def validate_attribute_value(schema, name, value, auto_encode, validator=None, check_names=False): + conf_classes_excluded_from_check = [v.lower() for v in get_config_parameter('CLASSES_EXCLUDED_FROM_CHECK')] + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + conf_utf8_syntaxes = get_config_parameter('UTF8_ENCODED_SYNTAXES') + conf_utf8_types = [v.lower() for v in get_config_parameter('UTF8_ENCODED_TYPES')] + if schema and schema.attribute_types: + if ';' in name: + name = name.split(';')[0] + if check_names and schema.object_classes and name.lower() == 'objectclass': + if to_unicode(value).lower() not in conf_classes_excluded_from_check and to_unicode(value) not in schema.object_classes: + raise LDAPObjectClassError('invalid class in objectClass attribute: ' + str(value)) + elif check_names and name not in schema.attribute_types and name.lower() not in conf_attributes_excluded_from_check: + raise LDAPAttributeError('invalid attribute ' + name) + else: # try standard validators + validator = find_attribute_validator(schema, name, validator) + validated = validator(value) + if validated is False: + try: # checks if the value is a byte value erroneously converted to a string (as "b'1234'"), this is a common case in Python 3 when encoding is not specified + if value[0:2] == "b'" and value [-1] == "'": + value = to_raw(value[2:-1]) + validated = validator(value) + except Exception: + raise LDAPInvalidValueError('value \'%s\' non valid for attribute \'%s\'' % (value, name)) + if validated is False: + raise LDAPInvalidValueError('value \'%s\' non valid for attribute \'%s\'' % (value, name)) + elif validated is not True: # a valid LDAP value equivalent to the actual value + value = validated + # converts to utf-8 for well known Unicode LDAP syntaxes + if auto_encode and ((name in schema.attribute_types and schema.attribute_types[name].syntax in conf_utf8_syntaxes) or name.lower() in conf_utf8_types): + value = to_unicode(value) # tries to convert from local encoding to Unicode + return to_raw(value) + + +def prepare_filter_for_sending(raw_string): + i = 0 + ints = [] + raw_string = to_raw(raw_string) + while i < len(raw_string): + if (raw_string[i] == 92 or raw_string[i] == '\\') and i < len(raw_string) - 2: # 92 (0x5C) is backslash + try: + ints.append(int(raw_string[i + 1: i + 3], 16)) + i += 2 + except ValueError: # not an ldap escaped value, sends as is + ints.append(92) # adds backslash + else: + if str is not bytes: # Python 3 + ints.append(raw_string[i]) + else: # Python 2 + ints.append(ord(raw_string[i])) + i += 1 + + if str is not bytes: # Python 3 + return bytes(ints) + else: # Python 2 + return ''.join(chr(x) for x in ints) + + +def prepare_for_sending(raw_string): + return to_raw(raw_string) if isinstance(raw_string, STRING_TYPES) else raw_string diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04d9b97be1564b9fb89652ba3bb69990920c9772 GIT binary patch literal 152 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CU#|Kkxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!#}LD8D2>IX_1~Ex#x?v7{ums8~NfJ~J<~BtBlR Wpz;=nO>TZlX-=vg$oOI)W&i-A|0c8m literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/formatters.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/__pycache__/formatters.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c08b042bf3970e68cb8f1ddd7c1e6d4b1aefef3 GIT binary patch literal 10988 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/formatters.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/formatters.py new file mode 100644 index 0000000..2638d52 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/formatters.py @@ -0,0 +1,436 @@ +""" +""" + +# Created on 2014.10.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import re + +from binascii import hexlify +from uuid import UUID +from datetime import datetime, timedelta +from ...utils.conv import to_unicode + +from ...core.timezone import OffsetTzInfo + + +def format_unicode(raw_value): + try: + if str is not bytes: # Python 3 + return str(raw_value, 'utf-8', errors='strict') + else: # Python 2 + return unicode(raw_value, 'utf-8', errors='strict') + except (TypeError, UnicodeDecodeError): + pass + + return raw_value + + +def format_integer(raw_value): + try: + return int(raw_value) + except (TypeError, ValueError): # expected exceptions + pass + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_binary(raw_value): + try: + return bytes(raw_value) + except TypeError: # expected exceptions + pass + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_uuid(raw_value): + try: + return str(UUID(bytes=raw_value)) + except (TypeError, ValueError): + return format_unicode(raw_value) + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_uuid_le(raw_value): + try: + return '{' + str(UUID(bytes_le=raw_value)) + '}' + except (TypeError, ValueError): + return format_unicode(raw_value) + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_boolean(raw_value): + if raw_value in [b'TRUE', b'true', b'True']: + return True + if raw_value in [b'FALSE', b'false', b'False']: + return False + + return raw_value + + +def format_ad_timestamp(raw_value): + """ + Active Directory stores date/time values as the number of 100-nanosecond intervals + that have elapsed since the 0 hour on January 1, 1601 till the date/time that is being stored. + The time is always stored in Greenwich Mean Time (GMT) in the Active Directory. + """ + utc_timezone = OffsetTzInfo(0, 'UTC') + if raw_value == b'9223372036854775807': # max value to be stored in a 64 bit signed int + return datetime.max.replace(tzinfo=utc_timezone) # returns datetime.datetime(9999, 12, 31, 23, 59, 59, 999999, tzinfo=OffsetTzInfo(offset=0, name='UTC')) + try: + timestamp = int(raw_value) + if timestamp < 0: # ad timestamp cannot be negative + timestamp = timestamp * -1 + except Exception: + return raw_value + + try: + return datetime.fromtimestamp(timestamp / 10000000.0 - 11644473600, + tz=utc_timezone) # forces true division in python 2 + except (OSError, OverflowError, ValueError): # on Windows backwards timestamps are not allowed + try: + unix_epoch = datetime.fromtimestamp(0, tz=utc_timezone) + diff_seconds = timedelta(seconds=timestamp / 10000000.0 - 11644473600) + return unix_epoch + diff_seconds + except Exception: + pass + except Exception: + pass + + return raw_value + + +try: # uses regular expressions and the timezone class (python3.2 and later) + from datetime import timezone + + time_format = re.compile( + r''' + ^ + (?P[0-9]{4}) + (?P0[1-9]|1[0-2]) + (?P0[1-9]|[12][0-9]|3[01]) + (?P[01][0-9]|2[0-3]) + (?: + (?P[0-5][0-9]) + (?P[0-5][0-9]|60)? + )? + (?: + [.,] + (?P[0-9]+) + )? + (?: + Z + | + (?: + (?P[+-]) + (?P[01][0-9]|2[0-3]) + (?P[0-5][0-9])? + ) + ) + $ + ''', + re.VERBOSE + ) + + + def format_time(raw_value): + try: + match = time_format.fullmatch(to_unicode(raw_value)) + if match is None: + return raw_value + matches = match.groupdict() + + offset = timedelta( + hours=int(matches['OffHour'] or 0), + minutes=int(matches['OffMinute'] or 0) + ) + + if matches['Offset'] == '-': + offset *= -1 + + # Python does not support leap second in datetime (!) + if matches['Second'] == '60': + matches['Second'] = '59' + + # According to RFC, fraction may be applied to an Hour/Minute (!) + fraction = float('0.' + (matches['Fraction'] or '0')) + + if matches['Minute'] is None: + fraction *= 60 + minute = int(fraction) + fraction -= minute + else: + minute = int(matches['Minute']) + + if matches['Second'] is None: + fraction *= 60 + second = int(fraction) + fraction -= second + else: + second = int(matches['Second']) + + microseconds = int(fraction * 1000000) + + return datetime( + int(matches['Year']), + int(matches['Month']), + int(matches['Day']), + int(matches['Hour']), + minute, + second, + microseconds, + timezone(offset), + ) + except Exception: # exceptions should be investigated, anyway the formatter return the raw_value + pass + return raw_value + +except ImportError: + def format_time(raw_value): + """ + From RFC4517: + A value of the Generalized Time syntax is a character string + representing a date and time. The LDAP-specific encoding of a value + of this syntax is a restriction of the format defined in [ISO8601], + and is described by the following ABNF: + + GeneralizedTime = century year month day hour + [ minute [ second / leap-second ] ] + [ fraction ] + g-time-zone + + century = 2(%x30-39) ; "00" to "99" + year = 2(%x30-39) ; "00" to "99" + month = ( %x30 %x31-39 ) ; "01" (January) to "09" + / ( %x31 %x30-32 ) ; "10" to "12" + day = ( %x30 %x31-39 ) ; "01" to "09" + / ( %x31-32 %x30-39 ) ; "10" to "29" + / ( %x33 %x30-31 ) ; "30" to "31" + hour = ( %x30-31 %x30-39 ) / ( %x32 %x30-33 ) ; "00" to "23" + minute = %x30-35 %x30-39 ; "00" to "59" + second = ( %x30-35 %x30-39 ) ; "00" to "59" + leap-second = ( %x36 %x30 ) ; "60" + fraction = ( DOT / COMMA ) 1*(%x30-39) + g-time-zone = %x5A ; "Z" + / g-differential + g-differential = ( MINUS / PLUS ) hour [ minute ] + MINUS = %x2D ; minus sign ("-") + """ + + if len(raw_value) < 10 or not all((c in b'0123456789+-,.Z' for c in raw_value)) or ( + b'Z' in raw_value and not raw_value.endswith( + b'Z')): # first ten characters are mandatory and must be numeric or timezone or fraction + return raw_value + + # sets position for fixed values + year = int(raw_value[0: 4]) + month = int(raw_value[4: 6]) + day = int(raw_value[6: 8]) + hour = int(raw_value[8: 10]) + minute = 0 + second = 0 + microsecond = 0 + + remain = raw_value[10:] + if remain and remain.endswith(b'Z'): # uppercase 'Z' + sep = b'Z' + elif b'+' in remain: # timezone can be specified with +hh[mm] or -hh[mm] + sep = b'+' + elif b'-' in remain: + sep = b'-' + else: # timezone not specified + return raw_value + + time, _, offset = remain.partition(sep) + + if time and (b'.' in time or b',' in time): + # fraction time + if time[0] in b',.': + minute = 6 * int(time[1] if str is bytes else chr(time[1])) # Python 2 / Python 3 + elif time[2] in b',.': + minute = int(raw_value[10: 12]) + second = 6 * int(time[3] if str is bytes else chr(time[3])) # Python 2 / Python 3 + elif time[4] in b',.': + minute = int(raw_value[10: 12]) + second = int(raw_value[12: 14]) + microsecond = 100000 * int(time[5] if str is bytes else chr(time[5])) # Python 2 / Python 3 + elif len(time) == 2: # mmZ format + minute = int(raw_value[10: 12]) + elif len(time) == 0: # Z format + pass + elif len(time) == 4: # mmssZ + minute = int(raw_value[10: 12]) + second = int(raw_value[12: 14]) + else: + return raw_value + + if sep == b'Z': # UTC + timezone = OffsetTzInfo(0, 'UTC') + else: # build timezone + try: + if len(offset) == 2: + timezone_hour = int(offset[:2]) + timezone_minute = 0 + elif len(offset) == 4: + timezone_hour = int(offset[:2]) + timezone_minute = int(offset[2:4]) + else: # malformed timezone + raise ValueError + except ValueError: + return raw_value + if timezone_hour > 23 or timezone_minute > 59: # invalid timezone + return raw_value + + if str is not bytes: # Python 3 + timezone = OffsetTzInfo((timezone_hour * 60 + timezone_minute) * (1 if sep == b'+' else -1), + 'UTC' + str(sep + offset, encoding='utf-8')) + else: # Python 2 + timezone = OffsetTzInfo((timezone_hour * 60 + timezone_minute) * (1 if sep == b'+' else -1), + unicode('UTC' + sep + offset, encoding='utf-8')) + + try: + return datetime(year=year, + month=month, + day=day, + hour=hour, + minute=minute, + second=second, + microsecond=microsecond, + tzinfo=timezone) + except (TypeError, ValueError): + pass + + return raw_value + + +def format_ad_timedelta(raw_value): + """ + Convert a negative filetime value to a timedelta. + """ + # Active Directory stores attributes like "minPwdAge" as a negative + # "filetime" timestamp, which is the number of 100-nanosecond intervals that + # have elapsed since the 0 hour on January 1, 1601. + # + # Handle the minimum value that can be stored in a 64 bit signed integer. + # See https://docs.microsoft.com/en-us/dotnet/api/system.int64.minvalue + # In attributes like "maxPwdAge", this signifies never. + if raw_value == b'-9223372036854775808': + return timedelta.max + # We can reuse format_ad_timestamp to get a datetime object from the + # timestamp. Afterwards, we can subtract a datetime representing 0 hour on + # January 1, 1601 from the returned datetime to get the timedelta. + return format_ad_timestamp(raw_value) - format_ad_timestamp(0) + + +def format_time_with_0_year(raw_value): + try: + if raw_value.startswith(b'0000'): + return raw_value + except Exception: + try: + if raw_value.startswith('0000'): + return raw_value + except Exception: + pass + + return format_time(raw_value) + + +def format_sid(raw_value): + """ + SID= "S-1-" IdentifierAuthority 1*SubAuthority + IdentifierAuthority= IdentifierAuthorityDec / IdentifierAuthorityHex + ; If the identifier authority is < 2^32, the + ; identifier authority is represented as a decimal + ; number + ; If the identifier authority is >= 2^32, + ; the identifier authority is represented in + ; hexadecimal + IdentifierAuthorityDec = 1*10DIGIT + ; IdentifierAuthorityDec, top level authority of a + ; security identifier is represented as a decimal number + IdentifierAuthorityHex = "0x" 12HEXDIG + ; IdentifierAuthorityHex, the top-level authority of a + ; security identifier is represented as a hexadecimal number + SubAuthority= "-" 1*10DIGIT + ; Sub-Authority is always represented as a decimal number + ; No leading "0" characters are allowed when IdentifierAuthority + ; or SubAuthority is represented as a decimal number + ; All hexadecimal digits must be output in string format, + ; pre-pended by "0x" + + Revision (1 byte): An 8-bit unsigned integer that specifies the revision level of the SID. This value MUST be set to 0x01. + SubAuthorityCount (1 byte): An 8-bit unsigned integer that specifies the number of elements in the SubAuthority array. The maximum number of elements allowed is 15. + IdentifierAuthority (6 bytes): A SID_IDENTIFIER_AUTHORITY structure that indicates the authority under which the SID was created. It describes the entity that created the SID. The Identifier Authority value {0,0,0,0,0,5} denotes SIDs created by the NT SID authority. + SubAuthority (variable): A variable length array of unsigned 32-bit integers that uniquely identifies a principal relative to the IdentifierAuthority. Its length is determined by SubAuthorityCount. + """ + try: + if raw_value.startswith(b'S-1-'): + return raw_value + except Exception: + try: + if raw_value.startswith('S-1-'): + return raw_value + except Exception: + pass + try: + if str is not bytes: # Python 3 + revision = int(raw_value[0]) + sub_authority_count = int(raw_value[1]) + identifier_authority = int.from_bytes(raw_value[2:8], byteorder='big') + if identifier_authority >= 4294967296: # 2 ^ 32 + identifier_authority = hex(identifier_authority) + + sub_authority = '' + i = 0 + while i < sub_authority_count: + sub_authority += '-' + str( + int.from_bytes(raw_value[8 + (i * 4): 12 + (i * 4)], byteorder='little')) # little endian + i += 1 + else: # Python 2 + revision = int(ord(raw_value[0])) + sub_authority_count = int(ord(raw_value[1])) + identifier_authority = int(hexlify(raw_value[2:8]), 16) + if identifier_authority >= 4294967296: # 2 ^ 32 + identifier_authority = hex(identifier_authority) + + sub_authority = '' + i = 0 + while i < sub_authority_count: + sub_authority += '-' + str(int(hexlify(raw_value[11 + (i * 4): 7 + (i * 4): -1]), 16)) # little endian + i += 1 + return 'S-' + str(revision) + '-' + str(identifier_authority) + sub_authority + except Exception: # any exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/standard.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/standard.py new file mode 100644 index 0000000..42f6c26 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/standard.py @@ -0,0 +1,238 @@ +""" +""" + +# Created on 2014.10.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ... import SEQUENCE_TYPES +from .formatters import format_ad_timestamp, format_binary, format_boolean,\ + format_integer, format_sid, format_time, format_unicode, format_uuid, format_uuid_le, format_time_with_0_year,\ + format_ad_timedelta +from .validators import validate_integer, validate_time, always_valid,\ + validate_generic_single_value, validate_boolean, validate_ad_timestamp, validate_sid,\ + validate_uuid_le, validate_uuid, validate_zero_and_minus_one_and_positive_int, validate_guid, validate_time_with_0_year,\ + validate_ad_timedelta + +# for each syntax can be specified a format function and a input validation function + +standard_formatter = { + '1.2.840.113556.1.4.903': (format_binary, None), # Object (DN-binary) - Microsoft + '1.2.840.113556.1.4.904': (format_unicode, None), # Object (DN-string) - Microsoft + '1.2.840.113556.1.4.905': (format_unicode, None), # String (Teletex) - Microsoft + '1.2.840.113556.1.4.906': (format_integer, validate_integer), # Large integer - Microsoft + '1.2.840.113556.1.4.907': (format_binary, None), # String (NT-sec-desc) - Microsoft + '1.2.840.113556.1.4.1221': (format_binary, None), # Object (OR-name) - Microsoft + '1.2.840.113556.1.4.1362': (format_unicode, None), # String (Case) - Microsoft + '1.3.6.1.4.1.1466.115.121.1.1': (format_binary, None), # ACI item [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.2': (format_binary, None), # Access point [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.3': (format_unicode, None), # Attribute type description + '1.3.6.1.4.1.1466.115.121.1.4': (format_binary, None), # Audio [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.5': (format_binary, None), # Binary [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.6': (format_unicode, None), # Bit String + '1.3.6.1.4.1.1466.115.121.1.7': (format_boolean, validate_boolean), # Boolean + '1.3.6.1.4.1.1466.115.121.1.8': (format_binary, None), # Certificate [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.9': (format_binary, None), # Certificate List [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.10': (format_binary, None), # Certificate Pair [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.11': (format_unicode, None), # Country String + '1.3.6.1.4.1.1466.115.121.1.12': (format_unicode, None), # Distinguished name (DN) + '1.3.6.1.4.1.1466.115.121.1.13': (format_binary, None), # Data Quality Syntax [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.14': (format_unicode, None), # Delivery method + '1.3.6.1.4.1.1466.115.121.1.15': (format_unicode, None), # Directory string + '1.3.6.1.4.1.1466.115.121.1.16': (format_unicode, None), # DIT Content Rule Description + '1.3.6.1.4.1.1466.115.121.1.17': (format_unicode, None), # DIT Structure Rule Description + '1.3.6.1.4.1.1466.115.121.1.18': (format_binary, None), # DL Submit Permission [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.19': (format_binary, None), # DSA Quality Syntax [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.20': (format_binary, None), # DSE Type [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.21': (format_binary, None), # Enhanced Guide + '1.3.6.1.4.1.1466.115.121.1.22': (format_unicode, None), # Facsimile Telephone Number + '1.3.6.1.4.1.1466.115.121.1.23': (format_binary, None), # Fax + '1.3.6.1.4.1.1466.115.121.1.24': (format_time, validate_time), # Generalized time + '1.3.6.1.4.1.1466.115.121.1.25': (format_binary, None), # Guide [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.26': (format_unicode, None), # IA5 string + '1.3.6.1.4.1.1466.115.121.1.27': (format_integer, validate_integer), # Integer + '1.3.6.1.4.1.1466.115.121.1.28': (format_binary, None), # JPEG + '1.3.6.1.4.1.1466.115.121.1.29': (format_binary, None), # Master and Shadow Access Points [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.30': (format_unicode, None), # Matching rule description + '1.3.6.1.4.1.1466.115.121.1.31': (format_unicode, None), # Matching rule use description + '1.3.6.1.4.1.1466.115.121.1.32': (format_unicode, None), # Mail Preference [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.33': (format_unicode, None), # MHS OR Address [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.34': (format_unicode, None), # Name and optional UID + '1.3.6.1.4.1.1466.115.121.1.35': (format_unicode, None), # Name form description + '1.3.6.1.4.1.1466.115.121.1.36': (format_unicode, None), # Numeric string + '1.3.6.1.4.1.1466.115.121.1.37': (format_unicode, None), # Object class description + '1.3.6.1.4.1.1466.115.121.1.38': (format_unicode, None), # OID + '1.3.6.1.4.1.1466.115.121.1.39': (format_unicode, None), # Other mailbox + '1.3.6.1.4.1.1466.115.121.1.40': (format_binary, None), # Octet string + '1.3.6.1.4.1.1466.115.121.1.41': (format_unicode, None), # Postal address + '1.3.6.1.4.1.1466.115.121.1.42': (format_binary, None), # Protocol Information [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.43': (format_binary, None), # Presentation Address [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.44': (format_unicode, None), # Printable string + '1.3.6.1.4.1.1466.115.121.1.45': (format_binary, None), # Subtree specification [OBSOLETE + '1.3.6.1.4.1.1466.115.121.1.46': (format_binary, None), # Supplier Information [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.47': (format_binary, None), # Supplier Or Consumer [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.48': (format_binary, None), # Supplier And Consumer [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.49': (format_binary, None), # Supported Algorithm [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.50': (format_unicode, None), # Telephone number + '1.3.6.1.4.1.1466.115.121.1.51': (format_unicode, None), # Teletex terminal identifier + '1.3.6.1.4.1.1466.115.121.1.52': (format_unicode, None), # Teletex number + '1.3.6.1.4.1.1466.115.121.1.53': (format_time, validate_time), # Utc time (deprecated) + '1.3.6.1.4.1.1466.115.121.1.54': (format_unicode, None), # LDAP syntax description + '1.3.6.1.4.1.1466.115.121.1.55': (format_binary, None), # Modify rights [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.56': (format_binary, None), # LDAP Schema Definition [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.57': (format_unicode, None), # LDAP Schema Description [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.58': (format_unicode, None), # Substring assertion + '1.3.6.1.1.16.1': (format_uuid, validate_uuid), # UUID + '1.3.6.1.1.16.4': (format_uuid, validate_uuid), # entryUUID (RFC 4530) + '2.16.840.1.113719.1.1.4.1.501': (format_uuid, validate_guid), # GUID (Novell) + '2.16.840.1.113719.1.1.5.1.0': (format_binary, None), # Unknown (Novell) + '2.16.840.1.113719.1.1.5.1.6': (format_unicode, None), # Case Ignore List (Novell) + '2.16.840.1.113719.1.1.5.1.12': (format_binary, None), # Tagged Data (Novell) + '2.16.840.1.113719.1.1.5.1.13': (format_binary, None), # Octet List (Novell) + '2.16.840.1.113719.1.1.5.1.14': (format_unicode, None), # Tagged String (Novell) + '2.16.840.1.113719.1.1.5.1.15': (format_unicode, None), # Tagged Name And String (Novell) + '2.16.840.1.113719.1.1.5.1.16': (format_binary, None), # NDS Replica Pointer (Novell) + '2.16.840.1.113719.1.1.5.1.17': (format_unicode, None), # NDS ACL (Novell) + '2.16.840.1.113719.1.1.5.1.19': (format_time, validate_time), # NDS Timestamp (Novell) + '2.16.840.1.113719.1.1.5.1.22': (format_integer, validate_integer), # Counter (Novell) + '2.16.840.1.113719.1.1.5.1.23': (format_unicode, None), # Tagged Name (Novell) + '2.16.840.1.113719.1.1.5.1.25': (format_unicode, None), # Typed Name (Novell) + 'supportedldapversion': (format_integer, None), # supportedLdapVersion (Microsoft) + 'octetstring': (format_binary, validate_uuid_le), # octect string (Microsoft) + '1.2.840.113556.1.4.2': (format_uuid_le, validate_uuid_le), # objectGUID (Microsoft) + '1.2.840.113556.1.4.13': (format_ad_timestamp, validate_ad_timestamp), # builtinCreationTime (Microsoft) + '1.2.840.113556.1.4.26': (format_ad_timestamp, validate_ad_timestamp), # creationTime (Microsoft) + '1.2.840.113556.1.4.49': (format_ad_timestamp, validate_ad_timestamp), # badPasswordTime (Microsoft) + '1.2.840.113556.1.4.51': (format_ad_timestamp, validate_ad_timestamp), # lastLogoff (Microsoft) + '1.2.840.113556.1.4.52': (format_ad_timestamp, validate_ad_timestamp), # lastLogon (Microsoft) + '1.2.840.113556.1.4.60': (format_ad_timedelta, validate_ad_timedelta), # lockoutDuration (Microsoft) + '1.2.840.113556.1.4.61': (format_ad_timedelta, validate_ad_timedelta), # lockOutObservationWindow (Microsoft) + '1.2.840.113556.1.4.74': (format_ad_timedelta, validate_ad_timedelta), # maxPwdAge (Microsoft) + '1.2.840.113556.1.4.78': (format_ad_timedelta, validate_ad_timedelta), # minPwdAge (Microsoft) + '1.2.840.113556.1.4.96': (format_ad_timestamp, validate_zero_and_minus_one_and_positive_int), # pwdLastSet (Microsoft, can be set to -1 only) + '1.2.840.113556.1.4.146': (format_sid, validate_sid), # objectSid (Microsoft) + '1.2.840.113556.1.4.159': (format_ad_timestamp, validate_ad_timestamp), # accountExpires (Microsoft) + '1.2.840.113556.1.4.662': (format_ad_timestamp, validate_ad_timestamp), # lockoutTime (Microsoft) + '1.2.840.113556.1.4.1696': (format_ad_timestamp, validate_ad_timestamp), # lastLogonTimestamp (Microsoft) + '1.3.6.1.4.1.42.2.27.8.1.17': (format_time_with_0_year, validate_time_with_0_year) # pwdAccountLockedTime (Novell) +} + + +def find_attribute_helpers(attr_type, name, custom_formatter): + """ + Tries to format following the OIDs info and format_helper specification. + Search for attribute oid, then attribute name (can be multiple), then attribute syntax + Precedence is: + 1. attribute name + 2. attribute oid(from schema) + 3. attribute names (from oid_info) + 4. attribute syntax (from schema) + Custom formatters can be defined in Server object and have precedence over the standard_formatters + If no formatter is found the raw_value is returned as bytes. + Attributes defined as SINGLE_VALUE in schema are returned as a single object, otherwise are returned as a list of object + Formatter functions can return any kind of object + return a tuple (formatter, validator) + """ + formatter = None + if custom_formatter and isinstance(custom_formatter, dict): # if custom formatters are defined they have precedence over the standard formatters + if name in custom_formatter: # search for attribute name, as returned by the search operation + formatter = custom_formatter[name] + + if not formatter and attr_type and attr_type.oid in custom_formatter: # search for attribute oid as returned by schema + formatter = custom_formatter[attr_type.oid] + if not formatter and attr_type and attr_type.oid_info: + if isinstance(attr_type.oid_info[2], SEQUENCE_TYPES): # search for multiple names defined in oid_info + for attr_name in attr_type.oid_info[2]: + if attr_name in custom_formatter: + formatter = custom_formatter[attr_name] + break + elif attr_type.oid_info[2] in custom_formatter: # search for name defined in oid_info + formatter = custom_formatter[attr_type.oid_info[2]] + + if not formatter and attr_type and attr_type.syntax in custom_formatter: # search for syntax defined in schema + formatter = custom_formatter[attr_type.syntax] + + if not formatter and name in standard_formatter: # search for attribute name, as returned by the search operation + formatter = standard_formatter[name] + + if not formatter and attr_type and attr_type.oid in standard_formatter: # search for attribute oid as returned by schema + formatter = standard_formatter[attr_type.oid] + + if not formatter and attr_type and attr_type.oid_info: + if isinstance(attr_type.oid_info[2], SEQUENCE_TYPES): # search for multiple names defined in oid_info + for attr_name in attr_type.oid_info[2]: + if attr_name in standard_formatter: + formatter = standard_formatter[attr_name] + break + elif attr_type.oid_info[2] in standard_formatter: # search for name defined in oid_info + formatter = standard_formatter[attr_type.oid_info[2]] + if not formatter and attr_type and attr_type.syntax in standard_formatter: # search for syntax defined in schema + formatter = standard_formatter[attr_type.syntax] + + if formatter is None: + return None, None + + return formatter + + +def format_attribute_values(schema, name, values, custom_formatter): + if not values: # RFCs states that attributes must always have values, but a flaky server returns empty values too + return [] + + if not isinstance(values, SEQUENCE_TYPES): + values = [values] + + if schema and schema.attribute_types and name in schema.attribute_types: + attr_type = schema.attribute_types[name] + else: + attr_type = None + + attribute_helpers = find_attribute_helpers(attr_type, name, custom_formatter) + if not isinstance(attribute_helpers, tuple): # custom formatter + formatter = attribute_helpers + else: + formatter = format_unicode if not attribute_helpers[0] else attribute_helpers[0] + + formatted_values = [formatter(raw_value) for raw_value in values] # executes formatter + if formatted_values: + return formatted_values[0] if (attr_type and attr_type.single_value) else formatted_values + else: # RFCs states that attributes must always have values, but AD return empty values in DirSync + return [] + + +def find_attribute_validator(schema, name, custom_validator): + if schema and schema.attribute_types and name in schema.attribute_types: + attr_type = schema.attribute_types[name] + else: + attr_type = None + + attribute_helpers = find_attribute_helpers(attr_type, name, custom_validator) + if not isinstance(attribute_helpers, tuple): # custom validator + validator = attribute_helpers + else: + if not attribute_helpers[1]: + if attr_type and attr_type.single_value: + validator = validate_generic_single_value # validate only single value + else: + validator = always_valid # unknown syntax, accepts single and multi value + else: + validator = attribute_helpers[1] + return validator diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/validators.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/validators.py new file mode 100644 index 0000000..d30b80f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/formatters/validators.py @@ -0,0 +1,502 @@ +""" +""" + +# Created on 2016.08.09 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from binascii import a2b_hex, hexlify +from datetime import datetime +from calendar import timegm +from uuid import UUID +from struct import pack + + +from ... import SEQUENCE_TYPES, STRING_TYPES, NUMERIC_TYPES, INTEGER_TYPES +from .formatters import format_time, format_ad_timestamp +from ...utils.conv import to_raw, to_unicode, ldap_escape_to_bytes, escape_bytes + +# Validators return True if value is valid, False if value is not valid, +# or a value different from True and False that is a valid value to substitute to the input value + + +def check_backslash(value): + if isinstance(value, (bytearray, bytes)): + if b'\\' in value: + value = value.replace(b'\\', b'\\5C') + elif isinstance(value, STRING_TYPES): + if '\\' in value: + value = value.replace('\\', '\\5C') + return value + + +def check_type(input_value, value_type): + if isinstance(input_value, value_type): + return True + + if isinstance(input_value, SEQUENCE_TYPES): + for value in input_value: + if not isinstance(value, value_type): + return False + return True + + return False + + +# noinspection PyUnusedLocal +def always_valid(input_value): + return True + + +def validate_generic_single_value(input_value): + if not isinstance(input_value, SEQUENCE_TYPES): + return True + + try: # object couldn't have a __len__ method + if len(input_value) == 1: + return True + except Exception: + pass + + return False + + +def validate_zero_and_minus_one_and_positive_int(input_value): + """Accept -1 and 0 only (used by pwdLastSet in AD) + """ + if not isinstance(input_value, SEQUENCE_TYPES): + if isinstance(input_value, NUMERIC_TYPES) or isinstance(input_value, STRING_TYPES): + return True if int(input_value) >= -1 else False + return False + else: + if len(input_value) == 1 and (isinstance(input_value[0], NUMERIC_TYPES) or isinstance(input_value[0], STRING_TYPES)): + return True if int(input_value[0]) >= -1 else False + + return False + + +def validate_integer(input_value): + if check_type(input_value, (float, bool)): + return False + if check_type(input_value, INTEGER_TYPES): + return True + + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] # builds a list of valid int values + from decimal import Decimal, InvalidOperation + for element in input_value: + try: #try to convert any type to int, an invalid conversion raise TypeError or ValueError, doublecheck with Decimal type, if both are valid and equal then then int() value is used + value = to_unicode(element) if isinstance(element, bytes) else element + decimal_value = Decimal(value) + int_value = int(value) + if decimal_value == int_value: + valid_values.append(int_value) + else: + return False + except (ValueError, TypeError, InvalidOperation): + return False + + if sequence: + return valid_values + else: + return valid_values[0] + + +def validate_bytes(input_value): + return check_type(input_value, bytes) + + +def validate_boolean(input_value): + # it could be a real bool or the string TRUE or FALSE, # only a single valued is allowed + if validate_generic_single_value(input_value): # valid only if a single value or a sequence with a single element + if isinstance(input_value, SEQUENCE_TYPES): + input_value = input_value[0] + if isinstance(input_value, bool): + if input_value: + return 'TRUE' + else: + return 'FALSE' + if str is not bytes and isinstance(input_value, bytes): # python3 try to converts bytes to string + input_value = to_unicode(input_value) + if isinstance(input_value, STRING_TYPES): + if input_value.lower() == 'true': + return 'TRUE' + elif input_value.lower() == 'false': + return 'FALSE' + return False + + +def validate_time_with_0_year(input_value): + # validates generalized time but accept a 0000 year too + # if datetime object doesn't have a timezone it's considered local time and is adjusted to UTC + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if str is not bytes and isinstance(element, bytes): # python3 try to converts bytes to string + element = to_unicode(element) + if isinstance(element, STRING_TYPES): # tries to check if it is already be a Generalized Time + if element.startswith('0000') or isinstance(format_time(to_raw(element)), datetime): # valid Generalized Time string + valid_values.append(element) + else: + return False + elif isinstance(element, datetime): + changed = True + if element.tzinfo: # a datetime with a timezone + valid_values.append(element.strftime('%Y%m%d%H%M%S%z')) + else: # datetime without timezone, assumed local and adjusted to UTC + offset = datetime.now() - datetime.utcnow() + valid_values.append((element - offset).strftime('%Y%m%d%H%M%SZ')) + else: + return False + + if changed: + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_time(input_value): + # if datetime object doesn't have a timezone it's considered local time and is adjusted to UTC + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if str is not bytes and isinstance(element, bytes): # python3 try to converts bytes to string + element = to_unicode(element) + if isinstance(element, STRING_TYPES): # tries to check if it is already be a Generalized Time + if isinstance(format_time(to_raw(element)), datetime): # valid Generalized Time string + valid_values.append(element) + else: + return False + elif isinstance(element, datetime): + changed = True + if element.tzinfo: # a datetime with a timezone + valid_values.append(element.strftime('%Y%m%d%H%M%S%z')) + else: # datetime without timezone, assumed local and adjusted to UTC + offset = datetime.now() - datetime.utcnow() + valid_values.append((element - offset).strftime('%Y%m%d%H%M%SZ')) + else: + return False + + if changed: + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_ad_timestamp(input_value): + """ + Active Directory stores date/time values as the number of 100-nanosecond intervals + that have elapsed since the 0 hour on January 1, 1601 till the date/time that is being stored. + The time is always stored in Greenwich Mean Time (GMT) in the Active Directory. + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if str is not bytes and isinstance(element, bytes): # python3 try to converts bytes to string + element = to_unicode(element) + if isinstance(element, NUMERIC_TYPES): + if 0 <= element <= 9223372036854775807: # min and max for the AD timestamp starting from 12:00 AM January 1, 1601 + valid_values.append(element) + else: + return False + elif isinstance(element, STRING_TYPES): # tries to check if it is already be a AD timestamp + if isinstance(format_ad_timestamp(to_raw(element)), datetime): # valid Generalized Time string + valid_values.append(element) + else: + return False + elif isinstance(element, datetime): + changed = True + if element.tzinfo: # a datetime with a timezone + valid_values.append(to_raw((timegm(element.utctimetuple()) + 11644473600) * 10000000, encoding='ascii')) + else: # datetime without timezone, assumed local and adjusted to UTC + offset = datetime.now() - datetime.utcnow() + valid_values.append(to_raw((timegm((element - offset).timetuple()) + 11644473600) * 10000000, encoding='ascii')) + else: + return False + + if changed: + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_ad_timedelta(input_value): + """ + Should be validated like an AD timestamp except that since it is a time + delta, it is stored as a negative number. + """ + if not isinstance(input_value, INTEGER_TYPES) or input_value > 0: + return False + return validate_ad_timestamp(input_value * -1) + + +def validate_guid(input_value): + """ + object guid in uuid format (Novell eDirectory) + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if isinstance(element, STRING_TYPES): + try: + valid_values.append(UUID(element).bytes) + changed = True + except ValueError: # try if the value is an escaped ldap byte sequence + try: + x = ldap_escape_to_bytes(element) + valid_values.append(UUID(bytes=x).bytes) + changed = True + continue + except ValueError: + if str is not bytes: # python 3 + pass + else: + valid_values.append(element) + continue + return False + elif isinstance(element, (bytes, bytearray)): # assumes bytes are valid + valid_values.append(element) + else: + return False + + if changed: + # valid_values = [check_backslash(value) for value in valid_values] + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_uuid(input_value): + """ + object entryUUID in uuid format + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if isinstance(element, STRING_TYPES): + try: + valid_values.append(str(UUID(element))) + changed = True + except ValueError: # try if the value is an escaped byte sequence + try: + valid_values.append(str(UUID(element.replace('\\', '')))) + changed = True + continue + except ValueError: + if str is not bytes: # python 3 + pass + else: + valid_values.append(element) + continue + return False + elif isinstance(element, (bytes, bytearray)): # assumes bytes are valid + valid_values.append(element) + else: + return False + + if changed: + # valid_values = [check_backslash(value) for value in valid_values] + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_uuid_le(input_value): + r""" + Active Directory stores objectGUID in uuid_le format, follows RFC4122 and MS-DTYP: + "{07039e68-4373-264d-a0a7-07039e684373}": string representation big endian, converted to little endian (with or without brace curles) + "689e030773434d26a7a007039e684373": packet representation, already in little endian + "\68\9e\03\07\73\43\4d\26\a7\a0\07\03\9e\68\43\73": bytes representation, already in little endian + byte sequence: already in little endian + + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + error = False + if isinstance(element, STRING_TYPES): + if element[0] == '{' and element[-1] == '}': + try: + valid_values.append(UUID(hex=element).bytes_le) # string representation, value in big endian, converts to little endian + changed = True + except ValueError: + error = True + elif '-' in element: + try: + valid_values.append(UUID(hex=element).bytes_le) # string representation, value in big endian, converts to little endian + changed = True + except ValueError: + error = True + elif '\\' in element: + try: + valid_values.append(UUID(bytes_le=ldap_escape_to_bytes(element)).bytes_le) # byte representation, value in little endian + changed = True + except ValueError: + error = True + elif '-' not in element: # value in little endian + try: + valid_values.append(UUID(bytes_le=a2b_hex(element)).bytes_le) # packet representation, value in little endian, converts to little endian + changed = True + except ValueError: + error = True + if error and (str is bytes): # python2 only assume value is bytes and valid + valid_values.append(element) # value is untouched, must be in little endian + elif isinstance(element, (bytes, bytearray)): # assumes bytes are valid uuid + valid_values.append(element) # value is untouched, must be in little endian + else: + return False + + if changed: + # valid_values = [check_backslash(value) for value in valid_values] + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_sid(input_value): + """ + SID= "S-1-" IdentifierAuthority 1*SubAuthority + IdentifierAuthority= IdentifierAuthorityDec / IdentifierAuthorityHex + ; If the identifier authority is < 2^32, the + ; identifier authority is represented as a decimal + ; number + ; If the identifier authority is >= 2^32, + ; the identifier authority is represented in + ; hexadecimal + IdentifierAuthorityDec = 1*10DIGIT + ; IdentifierAuthorityDec, top level authority of a + ; security identifier is represented as a decimal number + IdentifierAuthorityHex = "0x" 12HEXDIG + ; IdentifierAuthorityHex, the top-level authority of a + ; security identifier is represented as a hexadecimal number + SubAuthority= "-" 1*10DIGIT + ; Sub-Authority is always represented as a decimal number + ; No leading "0" characters are allowed when IdentifierAuthority + ; or SubAuthority is represented as a decimal number + ; All hexadecimal digits must be output in string format, + ; pre-pended by "0x" + + Revision (1 byte): An 8-bit unsigned integer that specifies the revision level of the SID. This value MUST be set to 0x01. + SubAuthorityCount (1 byte): An 8-bit unsigned integer that specifies the number of elements in the SubAuthority array. The maximum number of elements allowed is 15. + IdentifierAuthority (6 bytes): A SID_IDENTIFIER_AUTHORITY structure that indicates the authority under which the SID was created. It describes the entity that created the SID. The Identifier Authority value {0,0,0,0,0,5} denotes SIDs created by the NT SID authority. + SubAuthority (variable): A variable length array of unsigned 32-bit integers that uniquely identifies a principal relative to the IdentifierAuthority. Its length is determined by SubAuthorityCount. + + If you have a SID like S-a-b-c-d-e-f-g-... + + Then the bytes are + a (revision) + N (number of dashes minus two) + bbbbbb (six bytes of "b" treated as a 48-bit number in big-endian format) + cccc (four bytes of "c" treated as a 32-bit number in little-endian format) + dddd (four bytes of "d" treated as a 32-bit number in little-endian format) + eeee (four bytes of "e" treated as a 32-bit number in little-endian format) + ffff (four bytes of "f" treated as a 32-bit number in little-endian format) + + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if isinstance(element, STRING_TYPES): + if element.startswith('S-'): + parts = element.split('-') + sid_bytes = pack('q', int(parts[2]))[2:] # authority (in dec) + else: + sid_bytes += pack('>q', int(parts[2], 16))[2:] # authority (in hex) + for sub_auth in parts[3:]: + sid_bytes += pack('. + +import ctypes + +from pyasn1.type.namedtype import NamedTypes, NamedType +from pyasn1.type.tag import Tag, tagClassApplication, tagFormatConstructed +from pyasn1.type.univ import Sequence, OctetString, Integer +from .rfc4511 import ResultCode, LDAPString +from .controls import build_control + + +class SicilyBindResponse(Sequence): + # SicilyBindResponse ::= [APPLICATION 1] SEQUENCE { + # + # resultCode ENUMERATED { + # success (0), + # protocolError (2), + # adminLimitExceeded (11), + # inappropriateAuthentication (48), + # invalidCredentials (49), + # busy (51), + # unavailable (52), + # unwillingToPerform (53), + # other (80) }, + # + # serverCreds OCTET STRING, + # errorMessage LDAPString } + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 1)) + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('serverCreds', OctetString()), + NamedType('errorMessage', LDAPString()) + ) + + +class DirSyncControlRequestValue(Sequence): + # DirSyncRequestValue ::= SEQUENCE { + # Flags integer + # MaxBytes integer + # Cookie OCTET STRING } + componentType = NamedTypes(NamedType('Flags', Integer()), + NamedType('MaxBytes', Integer()), + NamedType('Cookie', OctetString()) + ) + + +class DirSyncControlResponseValue(Sequence): + # DirSyncResponseValue ::= SEQUENCE { + # MoreResults INTEGER + # unused INTEGER + # CookieServer OCTET STRING + # } + componentType = NamedTypes(NamedType('MoreResults', Integer()), + NamedType('unused', Integer()), + NamedType('CookieServer', OctetString()) + ) + + +class SdFlags(Sequence): + # SDFlagsRequestValue ::= SEQUENCE { + # Flags INTEGER + # } + componentType = NamedTypes(NamedType('Flags', Integer()) + ) + + +class ExtendedDN(Sequence): + # A flag value 0 specifies that the GUID and SID values be returned in hexadecimal string + # A flag value of 1 will return the GUID and SID values in standard string format + componentType = NamedTypes(NamedType('option', Integer()) + ) + + +def dir_sync_control(criticality, object_security, ancestors_first, public_data_only, incremental_values, max_length, cookie): + control_value = DirSyncControlRequestValue() + flags = 0x0 + if object_security: + flags |= 0x00000001 + + if ancestors_first: + flags |= 0x00000800 + + if public_data_only: + flags |= 0x00002000 + + if incremental_values: + flags |= 0x80000000 + # converts flags to signed 32 bit (AD expects a 4 bytes long unsigned integer, but ASN.1 Integer type is signed + # so the BER encoder gives back a 5 bytes long signed integer + flags = ctypes.c_long(flags & 0xFFFFFFFF).value + + control_value.setComponentByName('Flags', flags) + control_value.setComponentByName('MaxBytes', max_length) + if cookie: + control_value.setComponentByName('Cookie', cookie) + else: + control_value.setComponentByName('Cookie', OctetString('')) + return build_control('1.2.840.113556.1.4.841', criticality, control_value) + + +def extended_dn_control(criticality=False, hex_format=False): + control_value = ExtendedDN() + control_value.setComponentByName('option', Integer(not hex_format)) + return build_control('1.2.840.113556.1.4.529', criticality, control_value) + + +def show_deleted_control(criticality=False): + return build_control('1.2.840.113556.1.4.417', criticality, value=None) + + +def security_descriptor_control(criticality=False, sdflags=0x0F): + sdcontrol = SdFlags() + sdcontrol.setComponentByName('Flags', sdflags) + return [build_control('1.2.840.113556.1.4.801', criticality, sdcontrol)] + +def persistent_search_control(criticality=False): + return build_control('1.2.840.113556.1.4.528', criticality, value=None) \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/novell.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/novell.py new file mode 100644 index 0000000..af8aeb3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/novell.py @@ -0,0 +1,141 @@ +""" +""" + +# Created on 2014.06.27 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString, Integer, Sequence, SequenceOf +from pyasn1.type.namedtype import NamedType, NamedTypes, OptionalNamedType +from pyasn1.type.tag import Tag, tagFormatSimple, tagClassUniversal, TagSet + +NMAS_LDAP_EXT_VERSION = 1 + + +class Identity(OctetString): + encoding = 'utf-8' + + +class LDAPDN(OctetString): + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 4)) + encoding = 'utf-8' + + +class Password(OctetString): + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 4)) + encoding = 'utf-8' + + +class LDAPOID(OctetString): + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 4)) + encoding = 'utf-8' + + +class GroupCookie(Integer): + tagSet = Integer.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 2)) + + +class NmasVer(Integer): + tagSet = Integer.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 2)) + + +class Error(Integer): + tagSet = Integer.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 2)) + + +class NmasGetUniversalPasswordRequestValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('reqdn', Identity()) + ) + + +class NmasGetUniversalPasswordResponseValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('err', Error()), + OptionalNamedType('passwd', Password()) + ) + + +class NmasSetUniversalPasswordRequestValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('reqdn', Identity()), + NamedType('new_passwd', Password()) + ) + + +class NmasSetUniversalPasswordResponseValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('err', Error()) + ) + + +class ReplicaList(SequenceOf): + componentType = OctetString() + + +class ReplicaInfoRequestValue(Sequence): + tagSet = TagSet() + componentType = NamedTypes(NamedType('server_dn', LDAPDN()), + NamedType('partition_dn', LDAPDN()) + ) + + +class ReplicaInfoResponseValue(Sequence): + # tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + tagSet = TagSet() + componentType = NamedTypes(NamedType('partition_id', Integer()), + NamedType('replica_state', Integer()), + NamedType('modification_time', Integer()), + NamedType('purge_time', Integer()), + NamedType('local_partition_id', Integer()), + NamedType('partition_dn', LDAPDN()), + NamedType('replica_type', Integer()), + NamedType('flags', Integer()) + ) + + +class CreateGroupTypeRequestValue(Sequence): + componentType = NamedTypes(NamedType('createGroupType', LDAPOID()), + OptionalNamedType('createGroupValue', OctetString()) + ) + + +class CreateGroupTypeResponseValue(Sequence): + componentType = NamedTypes(NamedType('createGroupCookie', GroupCookie()), + OptionalNamedType('createGroupValue', OctetString()) + ) + + +class EndGroupTypeRequestValue(Sequence): + componentType = NamedTypes(NamedType('endGroupCookie', GroupCookie()), + OptionalNamedType('endGroupValue', OctetString()) + ) + + +class EndGroupTypeResponseValue(Sequence): + componentType = NamedTypes(OptionalNamedType('endGroupValue', OctetString()) + ) + + +class GroupingControlValue(Sequence): + componentType = NamedTypes(NamedType('groupingCookie', GroupCookie()), + OptionalNamedType('groupValue', OctetString()) + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/oid.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/oid.py new file mode 100644 index 0000000..6dfadd3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/oid.py @@ -0,0 +1,1208 @@ +""" +""" + +# Created on 2013.08.30 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SEQUENCE_TYPES + +# Holds info about OIDs. +# Each OID info is a named tuple with the following attributes: +# oid - the OID number +# type - type of OID +# name - description of OID +# doc - reference document of OID +# +# Source of information is IANA ldap-parameters.txt, oid-registry and products documentation as of 2013.08.21 + + +# OID database definition +OID_CONTROL = 'CONTROL' +OID_EXTENSION = 'EXTENSION' +OID_FEATURE = 'FEATURE' +OID_UNSOLICITED_NOTICE = 'UNSOLICITED_NOTICE' +OID_ATTRIBUTE_TYPE = 'ATTRIBUTE_TYPE' +OID_DIT_CONTENT_RULE = 'DIT_CONTENT_RULE' +OID_LDAP_URL_EXTENSION = 'LDAP_URL_EXTENSION' +OID_FAMILY = 'FAMILY' +OID_MATCHING_RULE = 'MATCHING_RULE' +OID_NAME_FORM = 'NAME_FORM' +OID_OBJECT_CLASS = 'OBJECT_CLASS' +OID_ADMINISTRATIVE_ROLE = 'ADMINISTRATIVE_ROLE' +OID_LDAP_SYNTAX = 'LDAP_SYNTAX' + +# class kind +CLASS_STRUCTURAL = 'STRUCTURAL' +CLASS_ABSTRACT = 'ABSTRACT' +CLASS_AUXILIARY = 'AUXILIARY' + +# attribute kind +ATTRIBUTE_USER_APPLICATION = 'USER_APPLICATION' +ATTRIBUTE_DIRECTORY_OPERATION = 'DIRECTORY_OPERATION' +ATTRIBUTE_DISTRIBUTED_OPERATION = 'DISTRIBUTED_OPERATION' +ATTRIBUTE_DSA_OPERATION = 'DSA_OPERATION' + + +def constant_to_oid_kind(oid_kind): + if oid_kind == OID_CONTROL: + return 'Control' + elif oid_kind == OID_EXTENSION: + return 'Extension' + elif oid_kind == OID_FEATURE: + return 'Feature' + elif oid_kind == OID_UNSOLICITED_NOTICE: + return 'Unsolicited Notice' + elif oid_kind == OID_ATTRIBUTE_TYPE: + return 'Attribute Type' + elif oid_kind == OID_DIT_CONTENT_RULE: + return 'DIT Content Rule' + elif oid_kind == OID_LDAP_URL_EXTENSION: + return 'LDAP URL Extension' + elif oid_kind == OID_FAMILY: + return 'Family' + elif oid_kind == OID_MATCHING_RULE: + return 'Matching Rule' + elif oid_kind == OID_NAME_FORM: + return 'Name Form' + elif oid_kind == OID_OBJECT_CLASS: + return 'Object Class' + elif oid_kind == OID_ADMINISTRATIVE_ROLE: + return 'Administrative Role' + elif oid_kind == OID_LDAP_SYNTAX: + return 'LDAP Syntax' + else: + return 'Unknown' + + +def decode_oids(sequence): + if sequence: + return sorted([Oids.get(oid, (oid, None, None, None)) for oid in sequence if oid]) + return list() + + +def decode_syntax(syntax): + if not syntax: + return None + return Oids.get(syntax, None) + + +def oid_to_string(oid): + s = oid[0] + if oid[2]: + s += ' - ' + ((', '.join(oid[2])) if isinstance(oid[2], SEQUENCE_TYPES) else oid[2]) + s += (' - ' + constant_to_oid_kind(oid[1])) if oid[1] is not None else '' + s += (' - ' + oid[3]) if oid[3] else '' + + return s + +# tuple structure: (oid, kind, name, docs) + +# noinspection PyPep8 +Oids = { # administrative role + '2.5.23.1': ('2.5.23.1', OID_ADMINISTRATIVE_ROLE, 'autonomousArea', 'RFC3672'), + '2.5.23.2': ('2.5.23.2', OID_ADMINISTRATIVE_ROLE, 'accessControlSpecificArea', 'RFC3672'), + '2.5.23.3': ('2.5.23.3', OID_ADMINISTRATIVE_ROLE, 'accessControlInnerArea', 'RFC3672'), + '2.5.23.4': ('2.5.23.4', OID_ADMINISTRATIVE_ROLE, 'subschemaAdminSpecificArea', 'RFC3672'), + '2.5.23.5': ('2.5.23.5', OID_ADMINISTRATIVE_ROLE, 'collectiveAttributeSpecificArea', 'RFC3672'), + '2.5.23.6': ('2.5.23.6', OID_ADMINISTRATIVE_ROLE, 'collectiveAttributeInnerArea', 'RFC3672'), + + # attributes type + '0.9.2342.19200300.100.1.1': ('0.9.2342.19200300.100.1.1', OID_ATTRIBUTE_TYPE, ['uid', 'userId'], 'RFC4519'), + '0.9.2342.19200300.100.1.2': ('0.9.2342.19200300.100.1.2', OID_ATTRIBUTE_TYPE, 'textEncodedORAddress', 'RFC1274'), + '0.9.2342.19200300.100.1.3': ('0.9.2342.19200300.100.1.3', OID_ATTRIBUTE_TYPE, ['mail', 'RFC822Mailbox'], 'RFC4524'), + '0.9.2342.19200300.100.1.4': ('0.9.2342.19200300.100.1.4', OID_ATTRIBUTE_TYPE, 'info', 'RFC4524'), + '0.9.2342.19200300.100.1.5': ('0.9.2342.19200300.100.1.5', OID_ATTRIBUTE_TYPE, ['drink', 'favouriteDrink'], 'RFC4524'), + '0.9.2342.19200300.100.1.6': ('0.9.2342.19200300.100.1.6', OID_ATTRIBUTE_TYPE, 'roomNumber', 'RFC4524'), + '0.9.2342.19200300.100.1.7': ('0.9.2342.19200300.100.1.7', OID_ATTRIBUTE_TYPE, 'photo', 'RFC1274'), + '0.9.2342.19200300.100.1.8': ('0.9.2342.19200300.100.1.8', OID_ATTRIBUTE_TYPE, 'userClass', 'RFC4524'), + '0.9.2342.19200300.100.1.9': ('0.9.2342.19200300.100.1.9', OID_ATTRIBUTE_TYPE, 'host', 'RFC4524'), + '0.9.2342.19200300.100.1.10': ('0.9.2342.19200300.100.1.10', OID_ATTRIBUTE_TYPE, 'manager', 'RFC4524'), + '0.9.2342.19200300.100.1.11': ('0.9.2342.19200300.100.1.11', OID_ATTRIBUTE_TYPE, 'documentIdentifier', 'RFC4524'), + '0.9.2342.19200300.100.1.12': ('0.9.2342.19200300.100.1.12', OID_ATTRIBUTE_TYPE, 'documentTitle', 'RFC4524'), + '0.9.2342.19200300.100.1.13': ('0.9.2342.19200300.100.1.13', OID_ATTRIBUTE_TYPE, 'documentVersion', 'RFC4524'), + '0.9.2342.19200300.100.1.14': ('0.9.2342.19200300.100.1.14', OID_ATTRIBUTE_TYPE, 'documentAuthor', 'RFC4524'), + '0.9.2342.19200300.100.1.15': ('0.9.2342.19200300.100.1.15', OID_ATTRIBUTE_TYPE, 'documentLocation', 'RFC4524'), + '0.9.2342.19200300.100.1.20': ('0.9.2342.19200300.100.1.20', OID_ATTRIBUTE_TYPE, ['homePhone', 'homeTelephone'], 'RFC4524'), + '0.9.2342.19200300.100.1.21': ('0.9.2342.19200300.100.1.21', OID_ATTRIBUTE_TYPE, 'secretary', 'RFC4524'), + '0.9.2342.19200300.100.1.22': ('0.9.2342.19200300.100.1.22', OID_ATTRIBUTE_TYPE, 'otherMailbox', 'RFC1274'), + '0.9.2342.19200300.100.1.23': ('0.9.2342.19200300.100.1.23', OID_ATTRIBUTE_TYPE, 'lastModifiedTime', 'RFC1274'), + '0.9.2342.19200300.100.1.24': ('0.9.2342.19200300.100.1.24', OID_ATTRIBUTE_TYPE, 'lastModifiedBy', 'RFC1274'), + '0.9.2342.19200300.100.1.25': ('0.9.2342.19200300.100.1.25', OID_ATTRIBUTE_TYPE, ['DC', 'domainComponent'], 'RFC4519'), + '0.9.2342.19200300.100.1.26': ('0.9.2342.19200300.100.1.26', OID_ATTRIBUTE_TYPE, 'aRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.27': ('0.9.2342.19200300.100.1.27', OID_ATTRIBUTE_TYPE, 'mDRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.28': ('0.9.2342.19200300.100.1.28', OID_ATTRIBUTE_TYPE, 'mXRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.29': ('0.9.2342.19200300.100.1.29', OID_ATTRIBUTE_TYPE, 'nSRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.30': ('0.9.2342.19200300.100.1.30', OID_ATTRIBUTE_TYPE, 'sOARecord', 'RFC1274'), + '0.9.2342.19200300.100.1.31': ('0.9.2342.19200300.100.1.31', OID_ATTRIBUTE_TYPE, 'cNAMERecord', 'RFC1274'), + '0.9.2342.19200300.100.1.37': ('0.9.2342.19200300.100.1.37', OID_ATTRIBUTE_TYPE, 'associatedDomain', 'RFC4524'), + '0.9.2342.19200300.100.1.38': ('0.9.2342.19200300.100.1.38', OID_ATTRIBUTE_TYPE, 'associatedName', 'RFC4524'), + '0.9.2342.19200300.100.1.39': ('0.9.2342.19200300.100.1.39', OID_ATTRIBUTE_TYPE, 'homePostalAddress', 'RFC4524'), + '0.9.2342.19200300.100.1.40': ('0.9.2342.19200300.100.1.40', OID_ATTRIBUTE_TYPE, 'personalTitle', 'RFC4524'), + '0.9.2342.19200300.100.1.41': ('0.9.2342.19200300.100.1.41', OID_ATTRIBUTE_TYPE, ['mobile', 'mobileTelephoneNumber'], 'RFC4524'), + '0.9.2342.19200300.100.1.42': ('0.9.2342.19200300.100.1.42', OID_ATTRIBUTE_TYPE, ['pager', 'pagerTelephoneNumber'], 'RFC4524'), + '0.9.2342.19200300.100.1.43': ('0.9.2342.19200300.100.1.43', OID_ATTRIBUTE_TYPE, ['co', 'friendlyCountryName'], 'RFC4524'), + '0.9.2342.19200300.100.1.44': ('0.9.2342.19200300.100.1.44', OID_ATTRIBUTE_TYPE, 'uniqueIdentifier', 'RFC4524'), + '0.9.2342.19200300.100.1.45': ('0.9.2342.19200300.100.1.45', OID_ATTRIBUTE_TYPE, 'organizationalStatus', 'RFC4524'), + '0.9.2342.19200300.100.1.46': ('0.9.2342.19200300.100.1.46', OID_ATTRIBUTE_TYPE, 'janetMailbox', 'RFC1274'), + '0.9.2342.19200300.100.1.47': ('0.9.2342.19200300.100.1.47', OID_ATTRIBUTE_TYPE, 'mailPreferenceOption', 'RFC1274'), + '0.9.2342.19200300.100.1.48': ('0.9.2342.19200300.100.1.48', OID_ATTRIBUTE_TYPE, 'buildingName', 'RFC4524'), + '0.9.2342.19200300.100.1.49': ('0.9.2342.19200300.100.1.49', OID_ATTRIBUTE_TYPE, 'dSAQuality', 'RFC1274'), + '0.9.2342.19200300.100.1.50': ('0.9.2342.19200300.100.1.50', OID_ATTRIBUTE_TYPE, 'singleLevelQuality', 'RFC4524'), + '0.9.2342.19200300.100.1.51': ('0.9.2342.19200300.100.1.51', OID_ATTRIBUTE_TYPE, 'subtreeMinimumQuality', 'RFC1274'), + '0.9.2342.19200300.100.1.52': ('0.9.2342.19200300.100.1.52', OID_ATTRIBUTE_TYPE, 'subtreeMaximumQuality', 'RFC1274'), + '0.9.2342.19200300.100.1.53': ('0.9.2342.19200300.100.1.53', OID_ATTRIBUTE_TYPE, 'personalSignature', 'RFC1274'), + '0.9.2342.19200300.100.1.54': ('0.9.2342.19200300.100.1.54', OID_ATTRIBUTE_TYPE, 'dITRedirect', 'RFC1274'), + '0.9.2342.19200300.100.1.55': ('0.9.2342.19200300.100.1.55', OID_ATTRIBUTE_TYPE, 'audio', 'RFC1274'), + '0.9.2342.19200300.100.1.56': ('0.9.2342.19200300.100.1.56', OID_ATTRIBUTE_TYPE, 'documentPublisher', 'RFC4524'), + '0.9.2342.19200300.100.1.60': ('0.9.2342.19200300.100.1.60', OID_ATTRIBUTE_TYPE, 'jpegPhoto', 'RFC2798'), + '1.2.840.113549.1.9.1': ('1.2.840.113549.1.9.1', OID_ATTRIBUTE_TYPE, ['email', 'emailAddress'], 'RFC3280'), + '1.2.840.113556.1.4.478': ('1.2.840.113556.1.4.478', OID_ATTRIBUTE_TYPE, 'calCalURI', 'RFC2739'), + '1.2.840.113556.1.4.479': ('1.2.840.113556.1.4.479', OID_ATTRIBUTE_TYPE, 'calFBURL', 'RFC2739'), + '1.2.840.113556.1.4.480': ('1.2.840.113556.1.4.480', OID_ATTRIBUTE_TYPE, 'calCAPURI', 'RFC2739'), + '1.2.840.113556.1.4.481': ('1.2.840.113556.1.4.481', OID_ATTRIBUTE_TYPE, 'calCalAdrURI', 'RFC2739'), + '1.2.840.113556.1.4.482': ('1.2.840.113556.1.4.482', OID_ATTRIBUTE_TYPE, 'calOtherCalURIs', 'RFC2739'), + '1.2.840.113556.1.4.483': ('1.2.840.113556.1.4.483', OID_ATTRIBUTE_TYPE, 'calOtherFBURLs', 'RFC2739'), + '1.2.840.113556.1.4.484': ('1.2.840.113556.1.4.484', OID_ATTRIBUTE_TYPE, 'calOtherCAPURIs', 'RFC2739'), + '1.2.840.113556.1.4.485': ('1.2.840.113556.1.4.485', OID_ATTRIBUTE_TYPE, 'calOtherCalAdrURIs', 'RFC2739'), + '1.3.18.0.2.4.1107': ('1.3.18.0.2.4.1107', OID_ATTRIBUTE_TYPE, 'printer-xri-supported', 'RFC3712'), + '1.3.18.0.2.4.1108': ('1.3.18.0.2.4.1108', OID_ATTRIBUTE_TYPE, 'printer-aliases', 'RFC3712'), + '1.3.18.0.2.4.1109': ('1.3.18.0.2.4.1109', OID_ATTRIBUTE_TYPE, 'printer-charset-configured', 'RFC3712'), + '1.3.18.0.2.4.1110': ('1.3.18.0.2.4.1110', OID_ATTRIBUTE_TYPE, 'printer-job-priority-supported', 'RFC3712'), + '1.3.18.0.2.4.1111': ('1.3.18.0.2.4.1111', OID_ATTRIBUTE_TYPE, 'printer-job-k-octets-supported', 'RFC3712'), + '1.3.18.0.2.4.1112': ('1.3.18.0.2.4.1112', OID_ATTRIBUTE_TYPE, 'printer-current-operator', 'RFC3712'), + '1.3.18.0.2.4.1113': ('1.3.18.0.2.4.1113', OID_ATTRIBUTE_TYPE, 'printer-service-person', 'RFC3712'), + '1.3.18.0.2.4.1114': ('1.3.18.0.2.4.1114', OID_ATTRIBUTE_TYPE, 'printer-delivery-orientation-supported', 'RFC3712'), + '1.3.18.0.2.4.1115': ('1.3.18.0.2.4.1115', OID_ATTRIBUTE_TYPE, 'printer-stacking-order-supported', 'RFC3712'), + '1.3.18.0.2.4.1116': ('1.3.18.0.2.4.1116', OID_ATTRIBUTE_TYPE, 'printer-output-features-supported', 'RFC3712'), + '1.3.18.0.2.4.1117': ('1.3.18.0.2.4.1117', OID_ATTRIBUTE_TYPE, 'printer-media-local-supported', 'RFC3712'), + '1.3.18.0.2.4.1118': ('1.3.18.0.2.4.1118', OID_ATTRIBUTE_TYPE, 'printer-copies-supported', 'RFC3712'), + '1.3.18.0.2.4.1119': ('1.3.18.0.2.4.1119', OID_ATTRIBUTE_TYPE, 'printer-natural-language-configured', 'RFC3712'), + '1.3.18.0.2.4.1120': ('1.3.18.0.2.4.1120', OID_ATTRIBUTE_TYPE, 'printer-print-quality-supported', 'RFC3712'), + '1.3.18.0.2.4.1121': ('1.3.18.0.2.4.1121', OID_ATTRIBUTE_TYPE, 'printer-resolution-supported', 'RFC3712'), + '1.3.18.0.2.4.1122': ('1.3.18.0.2.4.1122', OID_ATTRIBUTE_TYPE, 'printer-media-supported', 'RFC3712'), + '1.3.18.0.2.4.1123': ('1.3.18.0.2.4.1123', OID_ATTRIBUTE_TYPE, 'printer-sides-supported', 'RFC3712'), + '1.3.18.0.2.4.1124': ('1.3.18.0.2.4.1124', OID_ATTRIBUTE_TYPE, 'printer-number-up-supported', 'RFC3712'), + '1.3.18.0.2.4.1125': ('1.3.18.0.2.4.1125', OID_ATTRIBUTE_TYPE, 'printer-finishings-supported', 'RFC3712'), + '1.3.18.0.2.4.1126': ('1.3.18.0.2.4.1126', OID_ATTRIBUTE_TYPE, 'printer-pages-per-minute-color', 'RFC3712'), + '1.3.18.0.2.4.1127': ('1.3.18.0.2.4.1127', OID_ATTRIBUTE_TYPE, 'printer-pages-per-minute', 'RFC3712'), + '1.3.18.0.2.4.1128': ('1.3.18.0.2.4.1128', OID_ATTRIBUTE_TYPE, 'printer-compression-supported', 'RFC3712'), + '1.3.18.0.2.4.1129': ('1.3.18.0.2.4.1129', OID_ATTRIBUTE_TYPE, 'printer-color-supported', 'RFC3712'), + '1.3.18.0.2.4.1130': ('1.3.18.0.2.4.1130', OID_ATTRIBUTE_TYPE, 'printer-document-format-supported', 'RFC3712'), + '1.3.18.0.2.4.1131': ('1.3.18.0.2.4.1131', OID_ATTRIBUTE_TYPE, 'printer-charset-supported', 'RFC3712'), + '1.3.18.0.2.4.1132': ('1.3.18.0.2.4.1132', OID_ATTRIBUTE_TYPE, 'printer-multiple-document-jobs-supported', 'RFC3712'), + '1.3.18.0.2.4.1133': ('1.3.18.0.2.4.1133', OID_ATTRIBUTE_TYPE, 'printer-ipp-versions-supported', 'RFC3712'), + '1.3.18.0.2.4.1134': ('1.3.18.0.2.4.1134', OID_ATTRIBUTE_TYPE, 'printer-more-info', 'RFC3712'), + '1.3.18.0.2.4.1135': ('1.3.18.0.2.4.1135', OID_ATTRIBUTE_TYPE, 'printer-name', 'RFC3712'), + '1.3.18.0.2.4.1136': ('1.3.18.0.2.4.1136', OID_ATTRIBUTE_TYPE, 'printer-location', 'RFC3712'), + '1.3.18.0.2.4.1137': ('1.3.18.0.2.4.1137', OID_ATTRIBUTE_TYPE, 'printer-generated-natural-language-supported', 'RFC3712'), + '1.3.18.0.2.4.1138': ('1.3.18.0.2.4.1138', OID_ATTRIBUTE_TYPE, 'printer-make-and-model', 'RFC3712'), + '1.3.18.0.2.4.1139': ('1.3.18.0.2.4.1139', OID_ATTRIBUTE_TYPE, 'printer-info', 'RFC3712'), + '1.3.18.0.2.4.1140': ('1.3.18.0.2.4.1140', OID_ATTRIBUTE_TYPE, 'printer-uri', 'RFC3712'), + '1.3.6.1.1.10.4.1': ('1.3.6.1.1.10.4.1', OID_ATTRIBUTE_TYPE, 'uddiBusinessKey', 'RFC4403'), + '1.3.6.1.1.10.4.2': ('1.3.6.1.1.10.4.2', OID_ATTRIBUTE_TYPE, 'uddiAuthorizedName', 'RFC4403'), + '1.3.6.1.1.10.4.3': ('1.3.6.1.1.10.4.3', OID_ATTRIBUTE_TYPE, 'uddiOperator', 'RFC4403'), + '1.3.6.1.1.10.4.4': ('1.3.6.1.1.10.4.4', OID_ATTRIBUTE_TYPE, 'uddiName', 'RFC4403'), + '1.3.6.1.1.10.4.5': ('1.3.6.1.1.10.4.5', OID_ATTRIBUTE_TYPE, 'uddiDescription', 'RFC4403'), + '1.3.6.1.1.10.4.6': ('1.3.6.1.1.10.4.6', OID_ATTRIBUTE_TYPE, 'uddiDiscoveryURLs', 'RFC4403'), + '1.3.6.1.1.10.4.7': ('1.3.6.1.1.10.4.7', OID_ATTRIBUTE_TYPE, 'uddiUseType', 'RFC4403'), + '1.3.6.1.1.10.4.8': ('1.3.6.1.1.10.4.8', OID_ATTRIBUTE_TYPE, 'uddiPersonName', 'RFC4403'), + '1.3.6.1.1.10.4.9': ('1.3.6.1.1.10.4.9', OID_ATTRIBUTE_TYPE, 'uddiPhone', 'RFC4403'), + '1.3.6.1.1.10.4.10': ('1.3.6.1.1.10.4.10', OID_ATTRIBUTE_TYPE, 'uddiEMail', 'RFC4403'), + '1.3.6.1.1.10.4.11': ('1.3.6.1.1.10.4.11', OID_ATTRIBUTE_TYPE, 'uddiSortCode', 'RFC4403'), + '1.3.6.1.1.10.4.12': ('1.3.6.1.1.10.4.12', OID_ATTRIBUTE_TYPE, 'uddiTModelKey', 'RFC4403'), + '1.3.6.1.1.10.4.13': ('1.3.6.1.1.10.4.13', OID_ATTRIBUTE_TYPE, 'uddiAddressLine', 'RFC4403'), + '1.3.6.1.1.10.4.14': ('1.3.6.1.1.10.4.14', OID_ATTRIBUTE_TYPE, 'uddiIdentifierBag', 'RFC4403'), + '1.3.6.1.1.10.4.15': ('1.3.6.1.1.10.4.15', OID_ATTRIBUTE_TYPE, 'uddiCategoryBag', 'RFC4403'), + '1.3.6.1.1.10.4.16': ('1.3.6.1.1.10.4.16', OID_ATTRIBUTE_TYPE, 'uddiKeyedReference', 'RFC4403'), + '1.3.6.1.1.10.4.17': ('1.3.6.1.1.10.4.17', OID_ATTRIBUTE_TYPE, 'uddiServiceKey', 'RFC4403'), + '1.3.6.1.1.10.4.18': ('1.3.6.1.1.10.4.18', OID_ATTRIBUTE_TYPE, 'uddiBindingKey', 'RFC4403'), + '1.3.6.1.1.10.4.19': ('1.3.6.1.1.10.4.19', OID_ATTRIBUTE_TYPE, 'uddiAccessPoint', 'RFC4403'), + '1.3.6.1.1.10.4.20': ('1.3.6.1.1.10.4.20', OID_ATTRIBUTE_TYPE, 'uddiHostingRedirector', 'RFC4403'), + '1.3.6.1.1.10.4.21': ('1.3.6.1.1.10.4.21', OID_ATTRIBUTE_TYPE, 'uddiInstanceDescription', 'RFC4403'), + '1.3.6.1.1.10.4.22': ('1.3.6.1.1.10.4.22', OID_ATTRIBUTE_TYPE, 'uddiInstanceParms', 'RFC4403'), + '1.3.6.1.1.10.4.23': ('1.3.6.1.1.10.4.23', OID_ATTRIBUTE_TYPE, 'uddiOverviewDescription', 'RFC4403'), + '1.3.6.1.1.10.4.24': ('1.3.6.1.1.10.4.24', OID_ATTRIBUTE_TYPE, 'uddiOverviewURL', 'RFC4403'), + '1.3.6.1.1.10.4.25': ('1.3.6.1.1.10.4.25', OID_ATTRIBUTE_TYPE, 'uddiFromKey', 'RFC4403'), + '1.3.6.1.1.10.4.26': ('1.3.6.1.1.10.4.26', OID_ATTRIBUTE_TYPE, 'uddiToKey', 'RFC4403'), + '1.3.6.1.1.10.4.27': ('1.3.6.1.1.10.4.27', OID_ATTRIBUTE_TYPE, 'uddiUUID', 'RFC4403'), + '1.3.6.1.1.10.4.28': ('1.3.6.1.1.10.4.28', OID_ATTRIBUTE_TYPE, 'uddiIsHidden', 'RFC4403'), + '1.3.6.1.1.10.4.29': ('1.3.6.1.1.10.4.29', OID_ATTRIBUTE_TYPE, 'uddiIsProjection', 'RFC4403'), + '1.3.6.1.1.10.4.30': ('1.3.6.1.1.10.4.30', OID_ATTRIBUTE_TYPE, 'uddiLang', 'RFC4403'), + '1.3.6.1.1.10.4.31': ('1.3.6.1.1.10.4.31', OID_ATTRIBUTE_TYPE, 'uddiv3BusinessKey', 'RFC4403'), + '1.3.6.1.1.10.4.32': ('1.3.6.1.1.10.4.32', OID_ATTRIBUTE_TYPE, 'uddiv3ServiceKey', 'RFC4403'), + '1.3.6.1.1.10.4.33': ('1.3.6.1.1.10.4.33', OID_ATTRIBUTE_TYPE, 'uddiv3BindingKey', 'RFC4403'), + '1.3.6.1.1.10.4.34': ('1.3.6.1.1.10.4.34', OID_ATTRIBUTE_TYPE, 'uddiv3TmodelKey', 'RFC4403'), + '1.3.6.1.1.10.4.35': ('1.3.6.1.1.10.4.35', OID_ATTRIBUTE_TYPE, 'uddiv3DigitalSignature', 'RFC4403'), + '1.3.6.1.1.10.4.36': ('1.3.6.1.1.10.4.36', OID_ATTRIBUTE_TYPE, 'uddiv3NodeId', 'RFC4403'), + '1.3.6.1.1.10.4.37': ('1.3.6.1.1.10.4.37', OID_ATTRIBUTE_TYPE, 'uddiv3EntityModificationTime', 'RFC4403'), + '1.3.6.1.1.10.4.38': ('1.3.6.1.1.10.4.38', OID_ATTRIBUTE_TYPE, 'uddiv3SubscriptionKey', 'RFC4403'), + '1.3.6.1.1.10.4.39': ('1.3.6.1.1.10.4.39', OID_ATTRIBUTE_TYPE, 'uddiv3SubscriptionFilter', 'RFC4403'), + '1.3.6.1.1.10.4.40': ('1.3.6.1.1.10.4.40', OID_ATTRIBUTE_TYPE, 'uddiv3NotificationInterval', 'RFC4403'), + '1.3.6.1.1.10.4.41': ('1.3.6.1.1.10.4.41', OID_ATTRIBUTE_TYPE, 'uddiv3MaxEntities', 'RFC4403'), + '1.3.6.1.1.10.4.42': ('1.3.6.1.1.10.4.42', OID_ATTRIBUTE_TYPE, 'uddiv3ExpiresAfter', 'RFC4403'), + '1.3.6.1.1.10.4.43': ('1.3.6.1.1.10.4.43', OID_ATTRIBUTE_TYPE, 'uddiv3BriefResponse', 'RFC4403'), + '1.3.6.1.1.10.4.44': ('1.3.6.1.1.10.4.44', OID_ATTRIBUTE_TYPE, 'uddiv3EntityKey', 'RFC4403'), + '1.3.6.1.1.10.4.45': ('1.3.6.1.1.10.4.45', OID_ATTRIBUTE_TYPE, 'uddiv3EntityCreationTime', 'RFC4403'), + '1.3.6.1.1.10.4.46': ('1.3.6.1.1.10.4.46', OID_ATTRIBUTE_TYPE, 'uddiv3EntityDeletionTime', 'RFC4403'), + '1.3.6.1.1.11.2.1': ('1.3.6.1.1.11.2.1', OID_ATTRIBUTE_TYPE, 'vPIMTelephoneNumber', 'RFC4237'), + '1.3.6.1.1.11.2.2': ('1.3.6.1.1.11.2.2', OID_ATTRIBUTE_TYPE, 'vPIMRfc822Mailbox', 'RFC4237'), + '1.3.6.1.1.11.2.3': ('1.3.6.1.1.11.2.3', OID_ATTRIBUTE_TYPE, 'vPIMSpokenName', 'RFC4237'), + '1.3.6.1.1.11.2.4': ('1.3.6.1.1.11.2.4', OID_ATTRIBUTE_TYPE, 'vPIMSupportedUABehaviors', 'RFC4237'), + '1.3.6.1.1.11.2.5': ('1.3.6.1.1.11.2.5', OID_ATTRIBUTE_TYPE, 'vPIMSupportedAudioMediaTypes', 'RFC4237'), + '1.3.6.1.1.11.2.6': ('1.3.6.1.1.11.2.6', OID_ATTRIBUTE_TYPE, 'vPIMSupportedMessageContext', 'RFC4237'), + '1.3.6.1.1.11.2.7': ('1.3.6.1.1.11.2.7', OID_ATTRIBUTE_TYPE, 'vPIMTextName', 'RFC4237'), + '1.3.6.1.1.11.2.8': ('1.3.6.1.1.11.2.8', OID_ATTRIBUTE_TYPE, 'vPIMExtendedAbsenceStatus', 'RFC4237'), + '1.3.6.1.1.11.2.9': ('1.3.6.1.1.11.2.9', OID_ATTRIBUTE_TYPE, 'vPIMMaxMessageSize', 'RFC4237'), + '1.3.6.1.1.11.2.10': ('1.3.6.1.1.11.2.10', OID_ATTRIBUTE_TYPE, 'vPIMSubMailboxes', 'RFC4237'), + '1.3.6.1.1.16.4': ('1.3.6.1.1.16.4', OID_ATTRIBUTE_TYPE, 'entryUUID', 'RFC4530'), + '1.3.6.1.1.20': ('1.3.6.1.1.20', OID_ATTRIBUTE_TYPE, 'entryDN', 'RFC5020'), + '1.3.6.1.1.6.2.3': ('1.3.6.1.1.6.2.3', OID_ATTRIBUTE_TYPE, 'pcimKeywords', 'RFC3703'), + '1.3.6.1.1.6.2.4': ('1.3.6.1.1.6.2.4', OID_ATTRIBUTE_TYPE, 'pcimGroupName', 'RFC3703'), + '1.3.6.1.1.6.2.5': ('1.3.6.1.1.6.2.5', OID_ATTRIBUTE_TYPE, 'pcimRuleName', 'RFC3703'), + '1.3.6.1.1.6.2.6': ('1.3.6.1.1.6.2.6', OID_ATTRIBUTE_TYPE, 'pcimRuleEnabled', 'RFC3703'), + '1.3.6.1.1.6.2.7': ('1.3.6.1.1.6.2.7', OID_ATTRIBUTE_TYPE, 'pcimRuleConditionListType', 'RFC3703'), + '1.3.6.1.1.6.2.8': ('1.3.6.1.1.6.2.8', OID_ATTRIBUTE_TYPE, 'pcimRuleConditionList', 'RFC3703'), + '1.3.6.1.1.6.2.9': ('1.3.6.1.1.6.2.9', OID_ATTRIBUTE_TYPE, 'pcimRuleActionList', 'RFC3703'), + '1.3.6.1.1.6.2.10': ('1.3.6.1.1.6.2.10', OID_ATTRIBUTE_TYPE, 'pcimRuleValidityPeriodList', 'RFC3703'), + '1.3.6.1.1.6.2.11': ('1.3.6.1.1.6.2.11', OID_ATTRIBUTE_TYPE, 'pcimRuleUsage', 'RFC3703'), + '1.3.6.1.1.6.2.12': ('1.3.6.1.1.6.2.12', OID_ATTRIBUTE_TYPE, 'pcimRulePriority', 'RFC3703'), + '1.3.6.1.1.6.2.13': ('1.3.6.1.1.6.2.13', OID_ATTRIBUTE_TYPE, 'pcimRuleMandatory', 'RFC3703'), + '1.3.6.1.1.6.2.14': ('1.3.6.1.1.6.2.14', OID_ATTRIBUTE_TYPE, 'pcimRuleSequencedActions', 'RFC3703'), + '1.3.6.1.1.6.2.15': ('1.3.6.1.1.6.2.15', OID_ATTRIBUTE_TYPE, 'pcimRoles', 'RFC3703'), + '1.3.6.1.1.6.2.16': ('1.3.6.1.1.6.2.16', OID_ATTRIBUTE_TYPE, 'pcimConditionGroupNumber', 'RFC3703'), + '1.3.6.1.1.6.2.17': ('1.3.6.1.1.6.2.17', OID_ATTRIBUTE_TYPE, 'pcimConditionNegated', 'RFC3703'), + '1.3.6.1.1.6.2.18': ('1.3.6.1.1.6.2.18', OID_ATTRIBUTE_TYPE, 'pcimConditionName', 'RFC3703'), + '1.3.6.1.1.6.2.19': ('1.3.6.1.1.6.2.19', OID_ATTRIBUTE_TYPE, 'pcimConditionDN', 'RFC3703'), + '1.3.6.1.1.6.2.20': ('1.3.6.1.1.6.2.20', OID_ATTRIBUTE_TYPE, 'pcimValidityConditionName', 'RFC3703'), + '1.3.6.1.1.6.2.21': ('1.3.6.1.1.6.2.21', OID_ATTRIBUTE_TYPE, 'pcimTimePeriodConditionDN', 'RFC3703'), + '1.3.6.1.1.6.2.22': ('1.3.6.1.1.6.2.22', OID_ATTRIBUTE_TYPE, 'pcimActionName', 'RFC3703'), + '1.3.6.1.1.6.2.23': ('1.3.6.1.1.6.2.23', OID_ATTRIBUTE_TYPE, 'pcimActionOrder', 'RFC3703'), + '1.3.6.1.1.6.2.24': ('1.3.6.1.1.6.2.24', OID_ATTRIBUTE_TYPE, 'pcimActionDN', 'RFC3703'), + '1.3.6.1.1.6.2.25': ('1.3.6.1.1.6.2.25', OID_ATTRIBUTE_TYPE, 'pcimTPCTime', 'RFC3703'), + '1.3.6.1.1.6.2.26': ('1.3.6.1.1.6.2.26', OID_ATTRIBUTE_TYPE, 'pcimTPCMonthOfYearMask', 'RFC3703'), + '1.3.6.1.1.6.2.27': ('1.3.6.1.1.6.2.27', OID_ATTRIBUTE_TYPE, 'pcimTPCDayOfMonthMask', 'RFC3703'), + '1.3.6.1.1.6.2.28': ('1.3.6.1.1.6.2.28', OID_ATTRIBUTE_TYPE, 'pcimTPCDayOfWeekMask', 'RFC3703'), + '1.3.6.1.1.6.2.29': ('1.3.6.1.1.6.2.29', OID_ATTRIBUTE_TYPE, 'pcimTPCTimeOfDayMask', 'RFC3703'), + '1.3.6.1.1.6.2.30': ('1.3.6.1.1.6.2.30', OID_ATTRIBUTE_TYPE, 'pcimTPCLocalOrUtcTime', 'RFC3703'), + '1.3.6.1.1.6.2.31': ('1.3.6.1.1.6.2.31', OID_ATTRIBUTE_TYPE, 'pcimVendorConstraintData', 'RFC3703'), + '1.3.6.1.1.6.2.32': ('1.3.6.1.1.6.2.32', OID_ATTRIBUTE_TYPE, 'pcimVendorConstraintEncoding', 'RFC3703'), + '1.3.6.1.1.6.2.33': ('1.3.6.1.1.6.2.33', OID_ATTRIBUTE_TYPE, 'pcimVendorActionData', 'RFC3703'), + '1.3.6.1.1.6.2.34': ('1.3.6.1.1.6.2.34', OID_ATTRIBUTE_TYPE, 'pcimVendorActionEncoding', 'RFC3703'), + '1.3.6.1.1.6.2.35': ('1.3.6.1.1.6.2.35', OID_ATTRIBUTE_TYPE, 'pcimPolicyInstanceName', 'RFC3703'), + '1.3.6.1.1.6.2.36': ('1.3.6.1.1.6.2.36', OID_ATTRIBUTE_TYPE, 'pcimRepositoryName', 'RFC3703'), + '1.3.6.1.1.6.2.37': ('1.3.6.1.1.6.2.37', OID_ATTRIBUTE_TYPE, 'pcimSubtreesAuxContainedSet', 'RFC3703'), + '1.3.6.1.1.6.2.38': ('1.3.6.1.1.6.2.38', OID_ATTRIBUTE_TYPE, 'pcimGroupsAuxContainedSet', 'RFC3703'), + '1.3.6.1.1.6.2.39': ('1.3.6.1.1.6.2.39', OID_ATTRIBUTE_TYPE, 'pcimRulesAuxContainedSet', 'RFC3703'), + '1.3.6.1.1.9.2.1': ('1.3.6.1.1.9.2.1', OID_ATTRIBUTE_TYPE, 'pcelsPolicySetName', 'RFC4104'), + '1.3.6.1.1.9.2.2': ('1.3.6.1.1.9.2.2', OID_ATTRIBUTE_TYPE, 'pcelsDecisionStrategy', 'RFC4104'), + '1.3.6.1.1.9.2.3': ('1.3.6.1.1.9.2.3', OID_ATTRIBUTE_TYPE, 'pcelsPolicySetList', 'RFC4104'), + '1.3.6.1.1.9.2.4': ('1.3.6.1.1.9.2.4', OID_ATTRIBUTE_TYPE, 'pcelsPriority', 'RFC4104'), + '1.3.6.1.1.9.2.5': ('1.3.6.1.1.9.2.5', OID_ATTRIBUTE_TYPE, 'pcelsPolicySetDN', 'RFC4104'), + '1.3.6.1.1.9.2.6': ('1.3.6.1.1.9.2.6', OID_ATTRIBUTE_TYPE, 'pcelsConditionListType', 'RFC4104'), + '1.3.6.1.1.9.2.7': ('1.3.6.1.1.9.2.7', OID_ATTRIBUTE_TYPE, 'pcelsConditionList', 'RFC4104'), + '1.3.6.1.1.9.2.8': ('1.3.6.1.1.9.2.8', OID_ATTRIBUTE_TYPE, 'pcelsActionList', 'RFC4104'), + '1.3.6.1.1.9.2.9': ('1.3.6.1.1.9.2.9', OID_ATTRIBUTE_TYPE, 'pcelsSequencedActions', 'RFC4104'), + '1.3.6.1.1.9.2.10': ('1.3.6.1.1.9.2.10', OID_ATTRIBUTE_TYPE, 'pcelsExecutionStrategy', 'RFC4104'), + '1.3.6.1.1.9.2.11': ('1.3.6.1.1.9.2.11', OID_ATTRIBUTE_TYPE, 'pcelsVariableDN', 'RFC4104'), + '1.3.6.1.1.9.2.12': ('1.3.6.1.1.9.2.12', OID_ATTRIBUTE_TYPE, 'pcelsValueDN', 'RFC4104'), + '1.3.6.1.1.9.2.13': ('1.3.6.1.1.9.2.13', OID_ATTRIBUTE_TYPE, 'pcelsIsMirrored', 'RFC4104'), + '1.3.6.1.1.9.2.14': ('1.3.6.1.1.9.2.14', OID_ATTRIBUTE_TYPE, 'pcelsVariableName', 'RFC4104'), + '1.3.6.1.1.9.2.15': ('1.3.6.1.1.9.2.15', OID_ATTRIBUTE_TYPE, 'pcelsExpectedValueList', 'RFC4104'), + '1.3.6.1.1.9.2.16': ('1.3.6.1.1.9.2.16', OID_ATTRIBUTE_TYPE, 'pcelsVariableModelClass', 'RFC4104'), + '1.3.6.1.1.9.2.17': ('1.3.6.1.1.9.2.17', OID_ATTRIBUTE_TYPE, 'pcelsVariableModelProperty', 'RFC4104'), + '1.3.6.1.1.9.2.18': ('1.3.6.1.1.9.2.18', OID_ATTRIBUTE_TYPE, 'pcelsExpectedValueTypes', 'RFC4104'), + '1.3.6.1.1.9.2.19': ('1.3.6.1.1.9.2.19', OID_ATTRIBUTE_TYPE, 'pcelsValueName', 'RFC4104'), + '1.3.6.1.1.9.2.20': ('1.3.6.1.1.9.2.20', OID_ATTRIBUTE_TYPE, 'pcelsIPv4AddrList', 'RFC4104'), + '1.3.6.1.1.9.2.21': ('1.3.6.1.1.9.2.21', OID_ATTRIBUTE_TYPE, 'pcelsIPv6AddrList', 'RFC4104'), + '1.3.6.1.1.9.2.22': ('1.3.6.1.1.9.2.22', OID_ATTRIBUTE_TYPE, 'pcelsMACAddrList', 'RFC4104'), + '1.3.6.1.1.9.2.23': ('1.3.6.1.1.9.2.23', OID_ATTRIBUTE_TYPE, 'pcelsStringList', 'RFC4104'), + '1.3.6.1.1.9.2.24': ('1.3.6.1.1.9.2.24', OID_ATTRIBUTE_TYPE, 'pcelsBitStringList', 'RFC4104'), + '1.3.6.1.1.9.2.25': ('1.3.6.1.1.9.2.25', OID_ATTRIBUTE_TYPE, 'pcelsIntegerList', 'RFC4104'), + '1.3.6.1.1.9.2.26': ('1.3.6.1.1.9.2.26', OID_ATTRIBUTE_TYPE, 'pcelsBoolean', 'RFC4104'), + '1.3.6.1.1.9.2.27': ('1.3.6.1.1.9.2.27', OID_ATTRIBUTE_TYPE, 'pcelsReusableContainerName', 'RFC4104'), + '1.3.6.1.1.9.2.28': ('1.3.6.1.1.9.2.28', OID_ATTRIBUTE_TYPE, 'pcelsReusableContainerList', 'RFC4104'), + '1.3.6.1.1.9.2.29': ('1.3.6.1.1.9.2.29', OID_ATTRIBUTE_TYPE, 'pcelsRole', 'RFC4104'), + '1.3.6.1.1.9.2.30': ('1.3.6.1.1.9.2.30', OID_ATTRIBUTE_TYPE, 'pcelsRoleCollectionName', 'RFC4104'), + '1.3.6.1.1.9.2.31': ('1.3.6.1.1.9.2.31', OID_ATTRIBUTE_TYPE, 'pcelsElementList', 'RFC4104'), + '1.3.6.1.1.9.2.32': ('1.3.6.1.1.9.2.32', OID_ATTRIBUTE_TYPE, 'pcelsFilterName', 'RFC4104'), + '1.3.6.1.1.9.2.33': ('1.3.6.1.1.9.2.33', OID_ATTRIBUTE_TYPE, 'pcelsFilterIsNegated', 'RFC4104'), + '1.3.6.1.1.9.2.34': ('1.3.6.1.1.9.2.34', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrVersion', 'RFC4104'), + '1.3.6.1.1.9.2.35': ('1.3.6.1.1.9.2.35', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourceAddress', 'RFC4104'), + '1.3.6.1.1.9.2.36': ('1.3.6.1.1.9.2.36', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourceAddressEndOfRange', 'RFC4104'), + '1.3.6.1.1.9.2.37': ('1.3.6.1.1.9.2.37', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourceMask', 'RFC4104'), + '1.3.6.1.1.9.2.38': ('1.3.6.1.1.9.2.38', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestAddress', 'RFC4104'), + '1.3.6.1.1.9.2.39': ('1.3.6.1.1.9.2.39', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestAddressEndOfRange', 'RFC4104'), + '1.3.6.1.1.9.2.40': ('1.3.6.1.1.9.2.40', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestMask', 'RFC4104'), + '1.3.6.1.1.9.2.41': ('1.3.6.1.1.9.2.41', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrProtocolID', 'RFC4104'), + '1.3.6.1.1.9.2.42': ('1.3.6.1.1.9.2.42', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourcePortStart', 'RFC4104'), + '1.3.6.1.1.9.2.43': ('1.3.6.1.1.9.2.43', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourcePortEnd', 'RFC4104'), + '1.3.6.1.1.9.2.44': ('1.3.6.1.1.9.2.44', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestPortStart', 'RFC4104'), + '1.3.6.1.1.9.2.45': ('1.3.6.1.1.9.2.45', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestPortEnd', 'RFC4104'), + '1.3.6.1.1.9.2.46': ('1.3.6.1.1.9.2.46', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDSCPList', 'RFC4104'), + '1.3.6.1.1.9.2.47': ('1.3.6.1.1.9.2.47', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrFlowLabel', 'RFC4104'), + '1.3.6.1.1.9.2.48': ('1.3.6.1.1.9.2.48', OID_ATTRIBUTE_TYPE, 'pcels8021HdrSourceMACAddress', 'RFC4104'), + '1.3.6.1.1.9.2.49': ('1.3.6.1.1.9.2.49', OID_ATTRIBUTE_TYPE, 'pcels8021HdrSourceMACMask', 'RFC4104'), + '1.3.6.1.1.9.2.50': ('1.3.6.1.1.9.2.50', OID_ATTRIBUTE_TYPE, 'pcels8021HdrDestMACAddress', 'RFC4104'), + '1.3.6.1.1.9.2.51': ('1.3.6.1.1.9.2.51', OID_ATTRIBUTE_TYPE, 'pcels8021HdrDestMACMask', 'RFC4104'), + '1.3.6.1.1.9.2.52': ('1.3.6.1.1.9.2.52', OID_ATTRIBUTE_TYPE, 'pcels8021HdrProtocolID', 'RFC4104'), + '1.3.6.1.1.9.2.53': ('1.3.6.1.1.9.2.53', OID_ATTRIBUTE_TYPE, 'pcels8021HdrPriority', 'RFC4104'), + '1.3.6.1.1.9.2.54': ('1.3.6.1.1.9.2.54', OID_ATTRIBUTE_TYPE, 'pcels8021HdrVLANID', 'RFC4104'), + '1.3.6.1.1.9.2.55': ('1.3.6.1.1.9.2.55', OID_ATTRIBUTE_TYPE, 'pcelsFilterListName', 'RFC4104'), + '1.3.6.1.1.9.2.56': ('1.3.6.1.1.9.2.56', OID_ATTRIBUTE_TYPE, 'pcelsFilterDirection', 'RFC4104'), + '1.3.6.1.1.9.2.57': ('1.3.6.1.1.9.2.57', OID_ATTRIBUTE_TYPE, 'pcelsFilterEntryList', 'RFC4104'), + '1.3.6.1.1.9.2.58': ('1.3.6.1.1.9.2.58', OID_ATTRIBUTE_TYPE, 'pcelsVendorVariableData', 'RFC4104'), + '1.3.6.1.1.9.2.59': ('1.3.6.1.1.9.2.59', OID_ATTRIBUTE_TYPE, 'pcelsVendorVariableEncoding', 'RFC4104'), + '1.3.6.1.1.9.2.60': ('1.3.6.1.1.9.2.60', OID_ATTRIBUTE_TYPE, 'pcelsVendorValueData', 'RFC4104'), + '1.3.6.1.1.9.2.61': ('1.3.6.1.1.9.2.61', OID_ATTRIBUTE_TYPE, 'pcelsVendorValueEncoding', 'RFC4104'), + '1.3.6.1.1.9.2.62': ('1.3.6.1.1.9.2.62', OID_ATTRIBUTE_TYPE, 'pcelsRuleValidityPeriodList', 'RFC4104'), + '1.3.6.1.4.1.11.1.3.1.1.0': ('1.3.6.1.4.1.11.1.3.1.1.0', OID_ATTRIBUTE_TYPE, 'defaultServerList', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.1': ('1.3.6.1.4.1.11.1.3.1.1.1', OID_ATTRIBUTE_TYPE, 'defaultSearchBase', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.2': ('1.3.6.1.4.1.11.1.3.1.1.2', OID_ATTRIBUTE_TYPE, 'preferredServerList', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.3': ('1.3.6.1.4.1.11.1.3.1.1.3', OID_ATTRIBUTE_TYPE, 'search_time_limit', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.4': ('1.3.6.1.4.1.11.1.3.1.1.4', OID_ATTRIBUTE_TYPE, 'bindTimeLimit', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.5': ('1.3.6.1.4.1.11.1.3.1.1.5', OID_ATTRIBUTE_TYPE, 'followReferrals', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.6': ('1.3.6.1.4.1.11.1.3.1.1.6', OID_ATTRIBUTE_TYPE, 'authenticationMethod', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.7': ('1.3.6.1.4.1.11.1.3.1.1.7', OID_ATTRIBUTE_TYPE, 'profileTTL', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.9': ('1.3.6.1.4.1.11.1.3.1.1.9', OID_ATTRIBUTE_TYPE, 'attributeMap', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.10': ('1.3.6.1.4.1.11.1.3.1.1.10', OID_ATTRIBUTE_TYPE, 'credentialLevel', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.11': ('1.3.6.1.4.1.11.1.3.1.1.11', OID_ATTRIBUTE_TYPE, 'objectclassMap', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.12': ('1.3.6.1.4.1.11.1.3.1.1.12', OID_ATTRIBUTE_TYPE, 'defaultSearchScope', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.13': ('1.3.6.1.4.1.11.1.3.1.1.13', OID_ATTRIBUTE_TYPE, 'serviceCredentialLevel', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.14': ('1.3.6.1.4.1.11.1.3.1.1.14', OID_ATTRIBUTE_TYPE, 'serviceSearchDescriptor', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.15': ('1.3.6.1.4.1.11.1.3.1.1.15', OID_ATTRIBUTE_TYPE, 'serviceAuthenticationMethod', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.16': ('1.3.6.1.4.1.11.1.3.1.1.16', OID_ATTRIBUTE_TYPE, 'dereferenceAliases', 'RFC4876'), + '1.3.6.1.4.1.1466.101.119.3': ('1.3.6.1.4.1.1466.101.119.3', OID_ATTRIBUTE_TYPE, 'entryTtl', 'RFC2589'), + '1.3.6.1.4.1.1466.101.119.4': ('1.3.6.1.4.1.1466.101.119.4', OID_ATTRIBUTE_TYPE, 'dynamicSubtrees', 'RFC2589'), + '1.3.6.1.4.1.1466.101.120.1': ('1.3.6.1.4.1.1466.101.120.1', OID_ATTRIBUTE_TYPE, 'administratorsAddress', 'Mark_Wahl'), + '1.3.6.1.4.1.1466.101.120.5': ('1.3.6.1.4.1.1466.101.120.5', OID_ATTRIBUTE_TYPE, 'namingContexts', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.6': ('1.3.6.1.4.1.1466.101.120.6', OID_ATTRIBUTE_TYPE, 'altServer', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.7': ('1.3.6.1.4.1.1466.101.120.7', OID_ATTRIBUTE_TYPE, 'supportedExtension', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.13': ('1.3.6.1.4.1.1466.101.120.13', OID_ATTRIBUTE_TYPE, 'supportedControl', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.14': ('1.3.6.1.4.1.1466.101.120.14', OID_ATTRIBUTE_TYPE, 'supportedSASLMechanisms', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.15': ('1.3.6.1.4.1.1466.101.120.15', OID_ATTRIBUTE_TYPE, 'supportedLDAPVersion', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.16': ('1.3.6.1.4.1.1466.101.120.16', OID_ATTRIBUTE_TYPE, 'ldapSyntaxes', 'RFC4512'), + '1.3.6.1.4.1.16572.2.2.1': ('1.3.6.1.4.1.16572.2.2.1', OID_ATTRIBUTE_TYPE, 'providerCertificateHash', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.2': ('1.3.6.1.4.1.16572.2.2.2', OID_ATTRIBUTE_TYPE, 'providerCertificate', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.3': ('1.3.6.1.4.1.16572.2.2.3', OID_ATTRIBUTE_TYPE, 'providerName', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.4': ('1.3.6.1.4.1.16572.2.2.4', OID_ATTRIBUTE_TYPE, 'mailReceipt', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.5': ('1.3.6.1.4.1.16572.2.2.5', OID_ATTRIBUTE_TYPE, 'managedDomains', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.6': ('1.3.6.1.4.1.16572.2.2.6', OID_ATTRIBUTE_TYPE, 'LDIFLocationURL', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.7': ('1.3.6.1.4.1.16572.2.2.7', OID_ATTRIBUTE_TYPE, 'providerUnit', 'RFC6109'), + '1.3.6.1.4.1.250.1.57': ('1.3.6.1.4.1.250.1.57', OID_ATTRIBUTE_TYPE, 'labeledURI', 'RFC2079'), + '1.3.6.1.4.1.31103.1.1': ('1.3.6.1.4.1.31103.1.1', OID_ATTRIBUTE_TYPE, 'fedfsUuid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.2': ('1.3.6.1.4.1.31103.1.2', OID_ATTRIBUTE_TYPE, 'fedfsNetAddr', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.3': ('1.3.6.1.4.1.31103.1.3', OID_ATTRIBUTE_TYPE, 'fedfsNetPort', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.4': ('1.3.6.1.4.1.31103.1.4', OID_ATTRIBUTE_TYPE, 'fedfsFsnUuid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.5': ('1.3.6.1.4.1.31103.1.5', OID_ATTRIBUTE_TYPE, 'fedfsNsdbName', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.6': ('1.3.6.1.4.1.31103.1.6', OID_ATTRIBUTE_TYPE, 'fedfsNsdbPort', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.7': ('1.3.6.1.4.1.31103.1.7', OID_ATTRIBUTE_TYPE, 'fedfsNcePrefix', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.8': ('1.3.6.1.4.1.31103.1.8', OID_ATTRIBUTE_TYPE, 'fedfsFslUuid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.9': ('1.3.6.1.4.1.31103.1.9', OID_ATTRIBUTE_TYPE, 'fedfsFslHost', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.10': ('1.3.6.1.4.1.31103.1.10', OID_ATTRIBUTE_TYPE, 'fedfsFslPort', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.11': ('1.3.6.1.4.1.31103.1.11', OID_ATTRIBUTE_TYPE, 'fedfsFslTTL', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.12': ('1.3.6.1.4.1.31103.1.12', OID_ATTRIBUTE_TYPE, 'fedfsAnnotation', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.13': ('1.3.6.1.4.1.31103.1.13', OID_ATTRIBUTE_TYPE, 'fedfsDescr', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.14': ('1.3.6.1.4.1.31103.1.14', OID_ATTRIBUTE_TYPE, 'fedfsNceDN', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.15': ('1.3.6.1.4.1.31103.1.15', OID_ATTRIBUTE_TYPE, 'fedfsFsnTTL', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.100': ('1.3.6.1.4.1.31103.1.100', OID_ATTRIBUTE_TYPE, 'fedfsNfsPath', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.101': ('1.3.6.1.4.1.31103.1.101', OID_ATTRIBUTE_TYPE, 'fedfsNfsMajorVer', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.102': ('1.3.6.1.4.1.31103.1.102', OID_ATTRIBUTE_TYPE, 'fedfsNfsMinorVer', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.103': ('1.3.6.1.4.1.31103.1.103', OID_ATTRIBUTE_TYPE, 'fedfsNfsCurrency', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.104': ('1.3.6.1.4.1.31103.1.104', OID_ATTRIBUTE_TYPE, 'fedfsNfsGenFlagWritable', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.105': ('1.3.6.1.4.1.31103.1.105', OID_ATTRIBUTE_TYPE, 'fedfsNfsGenFlagGoing', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.106': ('1.3.6.1.4.1.31103.1.106', OID_ATTRIBUTE_TYPE, 'fedfsNfsGenFlagSplit', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.107': ('1.3.6.1.4.1.31103.1.107', OID_ATTRIBUTE_TYPE, 'fedfsNfsTransFlagRdma', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.108': ('1.3.6.1.4.1.31103.1.108', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassSimul', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.109': ('1.3.6.1.4.1.31103.1.109', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassHandle', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.110': ('1.3.6.1.4.1.31103.1.110', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassFileid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.111': ('1.3.6.1.4.1.31103.1.111', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassWritever', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.112': ('1.3.6.1.4.1.31103.1.112', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassChange', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.113': ('1.3.6.1.4.1.31103.1.113', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassReaddir', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.114': ('1.3.6.1.4.1.31103.1.114', OID_ATTRIBUTE_TYPE, 'fedfsNfsReadRank', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.115': ('1.3.6.1.4.1.31103.1.115', OID_ATTRIBUTE_TYPE, 'fedfsNfsReadOrder', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.116': ('1.3.6.1.4.1.31103.1.116', OID_ATTRIBUTE_TYPE, 'fedfsNfsWriteRank', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.117': ('1.3.6.1.4.1.31103.1.117', OID_ATTRIBUTE_TYPE, 'fedfsNfsWriteOrder', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.118': ('1.3.6.1.4.1.31103.1.118', OID_ATTRIBUTE_TYPE, 'fedfsNfsVarSub', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.119': ('1.3.6.1.4.1.31103.1.119', OID_ATTRIBUTE_TYPE, 'fedfsNfsValidFor', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.120': ('1.3.6.1.4.1.31103.1.120', OID_ATTRIBUTE_TYPE, 'fedfsNfsURI', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.4203.1.3.5': ('1.3.6.1.4.1.4203.1.3.5', OID_ATTRIBUTE_TYPE, 'supportedFeatures', 'RFC4512'), + '1.3.6.1.4.1.453.7.2.1': ('1.3.6.1.4.1.453.7.2.1', OID_ATTRIBUTE_TYPE, 'textTableKey', 'RFC2293'), + '1.3.6.1.4.1.453.7.2.2': ('1.3.6.1.4.1.453.7.2.2', OID_ATTRIBUTE_TYPE, 'textTableValue', 'RFC2293'), + '1.3.6.1.4.1.453.7.2.3': ('1.3.6.1.4.1.453.7.2.3', OID_ATTRIBUTE_TYPE, ['associatedX400Gateway', 'distinguishedNameTableKey'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.2.6': ('1.3.6.1.4.1.453.7.2.6', OID_ATTRIBUTE_TYPE, 'associatedORAddress', 'RFC2164'), + '1.3.6.1.4.1.453.7.2.7': ('1.3.6.1.4.1.453.7.2.7', OID_ATTRIBUTE_TYPE, 'oRAddressComponentType', 'RFC2164'), + '1.3.6.1.4.1.453.7.2.8': ('1.3.6.1.4.1.453.7.2.8', OID_ATTRIBUTE_TYPE, 'associatedInternetGateway', 'RFC2164'), + '1.3.6.1.4.1.453.7.2.9': ('1.3.6.1.4.1.453.7.2.9', OID_ATTRIBUTE_TYPE, 'mcgamTables', 'RFC2164'), + '2.16.840.1.113730.3.1.34': ('2.16.840.1.113730.3.1.34', OID_ATTRIBUTE_TYPE, 'ref', 'RFC3296'), + '2.5.18.1': ('2.5.18.1', OID_ATTRIBUTE_TYPE, 'createTimestamp', 'RFC4512'), + '2.5.18.2': ('2.5.18.2', OID_ATTRIBUTE_TYPE, 'modifyTimestamp', 'RFC4512'), + '2.5.18.3': ('2.5.18.3', OID_ATTRIBUTE_TYPE, 'creatorsName', 'RFC4512'), + '2.5.18.4': ('2.5.18.4', OID_ATTRIBUTE_TYPE, 'modifiersName', 'RFC4512'), + '2.5.18.5': ('2.5.18.5', OID_ATTRIBUTE_TYPE, 'administrativeRole', 'RFC3672'), + '2.5.18.6': ('2.5.18.6', OID_ATTRIBUTE_TYPE, 'subtreeSpecification', 'RFC3672'), + '2.5.18.7': ('2.5.18.7', OID_ATTRIBUTE_TYPE, 'collectiveExclusions', 'RFC3671'), + '2.5.18.10': ('2.5.18.10', OID_ATTRIBUTE_TYPE, 'subschemaSubentry', 'RFC4512'), + '2.5.18.12': ('2.5.18.12', OID_ATTRIBUTE_TYPE, 'collectiveAttributeSubentries', 'RFC3671'), + '2.5.21.1': ('2.5.21.1', OID_ATTRIBUTE_TYPE, 'dITStructureRules', 'RFC4512'), + '2.5.21.2': ('2.5.21.2', OID_ATTRIBUTE_TYPE, 'dITContentRules', 'RFC4512'), + '2.5.21.4': ('2.5.21.4', OID_ATTRIBUTE_TYPE, 'matchingRules', 'RFC4512'), + '2.5.21.5': ('2.5.21.5', OID_ATTRIBUTE_TYPE, 'attributeTypes', 'RFC4512'), + '2.5.21.6': ('2.5.21.6', OID_ATTRIBUTE_TYPE, 'objectClasses', 'RFC4512'), + '2.5.21.7': ('2.5.21.7', OID_ATTRIBUTE_TYPE, 'nameForms', 'RFC4512'), + '2.5.21.8': ('2.5.21.8', OID_ATTRIBUTE_TYPE, 'matchingRuleUse', 'RFC4512'), + '2.5.21.9': ('2.5.21.9', OID_ATTRIBUTE_TYPE, 'structuralObjectClass', 'RFC4512'), + '2.5.21.10': ('2.5.21.10', OID_ATTRIBUTE_TYPE, 'governingStructureRule', 'RFC4512'), + '2.5.4.0': ('2.5.4.0', OID_ATTRIBUTE_TYPE, 'objectClass', 'RFC4512'), + '2.5.4.1': ('2.5.4.1', OID_ATTRIBUTE_TYPE, ['aliasedEntryName', 'aliasedObjectName'], 'X.501-RFC4512'), + '2.5.4.2': ('2.5.4.2', OID_ATTRIBUTE_TYPE, 'knowledgeInformation', 'RFC2256'), + '2.5.4.3': ('2.5.4.3', OID_ATTRIBUTE_TYPE, ['cn', 'commonName'], 'RFC4519'), + '2.5.4.4': ('2.5.4.4', OID_ATTRIBUTE_TYPE, ['sn', 'surname'], 'RFC4519'), + '2.5.4.5': ('2.5.4.5', OID_ATTRIBUTE_TYPE, 'serialNumber', 'RFC4519'), + '2.5.4.6': ('2.5.4.6', OID_ATTRIBUTE_TYPE, ['c', 'countryName'], 'RFC4519'), + '2.5.4.7': ('2.5.4.7', OID_ATTRIBUTE_TYPE, ['L', 'localityName'], 'RFC4519'), + '2.5.4.7.1': ('2.5.4.7.1', OID_ATTRIBUTE_TYPE, 'c-l', 'RFC3671'), + '2.5.4.8': ('2.5.4.8', OID_ATTRIBUTE_TYPE, ['st', 'stateOrProvinceName'], 'RFC4519-RFC2256'), + '2.5.4.8.1': ('2.5.4.8.1', OID_ATTRIBUTE_TYPE, 'c-st', 'RFC3671'), + '2.5.4.9': ('2.5.4.9', OID_ATTRIBUTE_TYPE, ['street', 'streetAddress'], 'RFC4519-RFC2256'), + '2.5.4.9.1': ('2.5.4.9.1', OID_ATTRIBUTE_TYPE, 'c-street', 'RFC3671'), + '2.5.4.10': ('2.5.4.10', OID_ATTRIBUTE_TYPE, ['o', 'organizationName'], 'RFC4519'), + '2.5.4.10.1': ('2.5.4.10.1', OID_ATTRIBUTE_TYPE, 'c-o', 'RFC3671'), + '2.5.4.11': ('2.5.4.11', OID_ATTRIBUTE_TYPE, ['ou', 'organizationalUnitName'], 'RFC4519'), + '2.5.4.11.1': ('2.5.4.11.1', OID_ATTRIBUTE_TYPE, 'c-ou', 'RFC3671'), + '2.5.4.12': ('2.5.4.12', OID_ATTRIBUTE_TYPE, 'title', 'RFC4519'), + '2.5.4.13': ('2.5.4.13', OID_ATTRIBUTE_TYPE, 'description', 'RFC4519'), + '2.5.4.14': ('2.5.4.14', OID_ATTRIBUTE_TYPE, 'searchGuide', 'RFC4519'), + '2.5.4.15': ('2.5.4.15', OID_ATTRIBUTE_TYPE, 'businessCategory', 'RFC4519'), + '2.5.4.16': ('2.5.4.16', OID_ATTRIBUTE_TYPE, 'postalAddress', 'RFC4519'), + '2.5.4.16.1': ('2.5.4.16.1', OID_ATTRIBUTE_TYPE, 'c-PostalAddress', 'RFC3671'), + '2.5.4.17': ('2.5.4.17', OID_ATTRIBUTE_TYPE, 'postalCode', 'RFC4519'), + '2.5.4.17.1': ('2.5.4.17.1', OID_ATTRIBUTE_TYPE, 'c-PostalCode', 'RFC3671'), + '2.5.4.18': ('2.5.4.18', OID_ATTRIBUTE_TYPE, 'postOfficeBox', 'RFC4519'), + '2.5.4.18.1': ('2.5.4.18.1', OID_ATTRIBUTE_TYPE, 'c-PostOfficeBox', 'RFC3671'), + '2.5.4.19': ('2.5.4.19', OID_ATTRIBUTE_TYPE, 'physicalDeliveryOfficeName', 'RFC4519'), + '2.5.4.19.1': ('2.5.4.19.1', OID_ATTRIBUTE_TYPE, 'c-PhysicalDeliveryOffice', 'RFC3671'), + '2.5.4.20': ('2.5.4.20', OID_ATTRIBUTE_TYPE, 'telephoneNumber', 'RFC4519'), + '2.5.4.20.1': ('2.5.4.20.1', OID_ATTRIBUTE_TYPE, 'c-TelephoneNumber', 'RFC3671'), + '2.5.4.21': ('2.5.4.21', OID_ATTRIBUTE_TYPE, 'telexNumber', 'RFC4519'), + '2.5.4.21.1': ('2.5.4.21.1', OID_ATTRIBUTE_TYPE, 'c-TelexNumber', 'RFC3671'), + '2.5.4.22': ('2.5.4.22', OID_ATTRIBUTE_TYPE, 'teletexTerminalIdentifier', 'RFC4519'), + '2.5.4.23': ('2.5.4.23', OID_ATTRIBUTE_TYPE, 'facsimileTelephoneNumber', 'RFC4519'), + '2.5.4.23.1': ('2.5.4.23.1', OID_ATTRIBUTE_TYPE, 'c-FacsimileTelephoneNumber', 'RFC3671'), + '2.5.4.24': ('2.5.4.24', OID_ATTRIBUTE_TYPE, 'x121Address', 'RFC4519'), + '2.5.4.25': ('2.5.4.25', OID_ATTRIBUTE_TYPE, 'internationaliSDNNumber', 'RFC4519'), + '2.5.4.25.1': ('2.5.4.25.1', OID_ATTRIBUTE_TYPE, 'c-InternationalISDNNumber', 'RFC3671'), + '2.5.4.26': ('2.5.4.26', OID_ATTRIBUTE_TYPE, 'registeredAddress', 'RFC4519'), + '2.5.4.27': ('2.5.4.27', OID_ATTRIBUTE_TYPE, 'destinationIndicator', 'RFC4519'), + '2.5.4.28': ('2.5.4.28', OID_ATTRIBUTE_TYPE, 'preferredDeliveryMethod', 'RFC4519'), + '2.5.4.29': ('2.5.4.29', OID_ATTRIBUTE_TYPE, 'presentationAddress', 'RFC2256'), + '2.5.4.30': ('2.5.4.30', OID_ATTRIBUTE_TYPE, 'supportedApplicationContext', 'RFC2256'), + '2.5.4.31': ('2.5.4.31', OID_ATTRIBUTE_TYPE, 'member', 'RFC4519'), + '2.5.4.32': ('2.5.4.32', OID_ATTRIBUTE_TYPE, 'owner', 'RFC4519'), + '2.5.4.33': ('2.5.4.33', OID_ATTRIBUTE_TYPE, 'roleOccupant', 'RFC4519'), + '2.5.4.34': ('2.5.4.34', OID_ATTRIBUTE_TYPE, 'seeAlso', 'RFC4519'), + '2.5.4.35': ('2.5.4.35', OID_ATTRIBUTE_TYPE, 'userPassword', 'RFC4519'), + '2.5.4.36': ('2.5.4.36', OID_ATTRIBUTE_TYPE, 'userCertificate', 'RFC4523'), + '2.5.4.37': ('2.5.4.37', OID_ATTRIBUTE_TYPE, 'cACertificate', 'RFC4523'), + '2.5.4.38': ('2.5.4.38', OID_ATTRIBUTE_TYPE, 'authorityRevocationList', 'RFC4523'), + '2.5.4.39': ('2.5.4.39', OID_ATTRIBUTE_TYPE, 'certificateRevocationList', 'RFC4523'), + '2.5.4.40': ('2.5.4.40', OID_ATTRIBUTE_TYPE, 'crossCertificatePair', 'RFC4523'), + '2.5.4.41': ('2.5.4.41', OID_ATTRIBUTE_TYPE, 'name', 'RFC4519'), + '2.5.4.42': ('2.5.4.42', OID_ATTRIBUTE_TYPE, 'givenName', 'RFC4519'), + '2.5.4.43': ('2.5.4.43', OID_ATTRIBUTE_TYPE, 'initials', 'RFC4519'), + '2.5.4.44': ('2.5.4.44', OID_ATTRIBUTE_TYPE, 'generationQualifier', 'RFC4519'), + '2.5.4.45': ('2.5.4.45', OID_ATTRIBUTE_TYPE, 'x500UniqueIdentifier', 'RFC4519'), + '2.5.4.46': ('2.5.4.46', OID_ATTRIBUTE_TYPE, 'dnQualifier', 'RFC4519'), + '2.5.4.47': ('2.5.4.47', OID_ATTRIBUTE_TYPE, 'enhancedSearchGuide', 'RFC4519'), + '2.5.4.48': ('2.5.4.48', OID_ATTRIBUTE_TYPE, 'protocolInformation', 'RFC2256'), + '2.5.4.49': ('2.5.4.49', OID_ATTRIBUTE_TYPE, 'distinguishedName', 'RFC4519'), + '2.5.4.50': ('2.5.4.50', OID_ATTRIBUTE_TYPE, 'uniqueMember', 'RFC4519'), + '2.5.4.51': ('2.5.4.51', OID_ATTRIBUTE_TYPE, 'houseIdentifier', 'RFC4519'), + '2.5.4.52': ('2.5.4.52', OID_ATTRIBUTE_TYPE, 'supportedAlgorithms', 'RFC4523'), + '2.5.4.53': ('2.5.4.53', OID_ATTRIBUTE_TYPE, 'deltaRevocationList', 'RFC4523'), + '2.5.4.54': ('2.5.4.54', OID_ATTRIBUTE_TYPE, 'dmdName', 'RFC2256'), + '2.5.4.65': ('2.5.4.65', OID_ATTRIBUTE_TYPE, 'pseudonym', 'RFC3280'), + '2.16.840.1.113719.1.1.4.1.501': ('2.16.840.1.113719.1.1.4.1.501', OID_ATTRIBUTE_TYPE, 'GUID', 'NOVELL'), + '2.16.840.1.113719.1.27.4.50': ('2.16.840.1.113719.1.27.4.50', OID_ATTRIBUTE_TYPE, 'localEntryID', 'NOVELL'), + '2.16.840.1.113730.3.8.3.1': ('2.16.840.1.113730.3.8.3.1', OID_ATTRIBUTE_TYPE, 'ipaUniqueID', 'freeIPA'), + '2.16.840.1.113730.3.8.3.2': ('2.16.840.1.113730.3.8.3.2', OID_ATTRIBUTE_TYPE, 'ipaClientVersion', 'freeIPA'), + '2.16.840.1.113730.3.8.3.3': ('2.16.840.1.113730.3.8.3.3', OID_ATTRIBUTE_TYPE, 'enrolledBy', 'freeIPA'), + '2.16.840.1.113730.3.8.3.4': ('2.16.840.1.113730.3.8.3.4', OID_ATTRIBUTE_TYPE, 'fqdn', 'freeIPA'), + '2.16.840.1.113730.3.8.3.18': ('2.16.840.1.113730.3.8.3.18', OID_ATTRIBUTE_TYPE, 'managedBy', 'freeIPA'), + '2.16.840.1.113730.3.8.3.24': ('2.16.840.1.113730.3.8.3.24', OID_ATTRIBUTE_TYPE, 'ipaEntitlementId', 'freeIPA'), + + # controls + '1.2.826.0.1.3344810.2.3': ('1.2.826.0.1.3344810.2.3', OID_CONTROL, 'Matched Values', 'RFC3876'), + '1.2.840.113556.1.4.319': ('1.2.840.113556.1.4.319', OID_CONTROL, 'LDAP Simple Paged Results', 'RFC2696'), + '1.2.840.113556.1.4.417': ('1.2.840.113556.1.4.417', OID_CONTROL, 'LDAP server show deleted objects', 'MICROSOFT'), + '1.2.840.113556.1.4.473': ('1.2.840.113556.1.4.473', OID_CONTROL, 'Sort Request', 'RFC2891'), + '1.2.840.113556.1.4.474': ('1.2.840.113556.1.4.474', OID_CONTROL, 'Sort Response', 'RFC2891'), + '1.2.840.113556.1.4.521': ('1.2.840.113556.1.4.521', OID_CONTROL, 'Cross-domain move', 'MICROSOFT'), + '1.2.840.113556.1.4.528': ('1.2.840.113556.1.4.528', OID_CONTROL, 'Server search notification', 'MICROSOFT'), + '1.2.840.113556.1.4.529': ('1.2.840.113556.1.4.529', OID_CONTROL, 'Extended DN', 'MICROSOFT'), + '1.2.840.113556.1.4.619': ('1.2.840.113556.1.4.619', OID_CONTROL, 'Lazy commit', 'MICROSOFT'), + '1.2.840.113556.1.4.801': ('1.2.840.113556.1.4.801', OID_CONTROL, 'Security descriptor flags', 'MICROSOFT'), + '1.2.840.113556.1.4.802': ('1.2.840.113556.1.4.802', OID_CONTROL, 'Range option', 'MICROSOFT'), + '1.2.840.113556.1.4.805': ('1.2.840.113556.1.4.805', OID_CONTROL, 'Tree delete', 'MICROSOFT'), + '1.2.840.113556.1.4.841': ('1.2.840.113556.1.4.841', OID_CONTROL, 'Directory synchronization', 'MICROSOFT'), + '1.2.840.113556.1.4.970': ('1.2.840.113556.1.4.970', OID_CONTROL, 'Get stats', 'MICROSOFT'), + '1.2.840.113556.1.4.1338': ('1.2.840.113556.1.4.1338', OID_CONTROL, 'Verify name', 'MICROSOFT'), + '1.2.840.113556.1.4.1339': ('1.2.840.113556.1.4.1339', OID_CONTROL, 'Domain scope', 'MICROSOFT'), + '1.2.840.113556.1.4.1340': ('1.2.840.113556.1.4.1340', OID_CONTROL, 'Search options', 'MICROSOFT'), + '1.2.840.113556.1.4.1341': ('1.2.840.113556.1.4.1341', OID_CONTROL, 'RODC DCPROMO', 'MICROSOFT'), + '1.2.840.113556.1.4.1413': ('1.2.840.113556.1.4.1413', OID_CONTROL, 'Permissive modify', 'MICROSOFT'), + '1.2.840.113556.1.4.1504': ('1.2.840.113556.1.4.1504', OID_CONTROL, 'Attribute scoped query', 'MICROSOFT'), + '1.2.840.113556.1.4.1852': ('1.2.840.113556.1.4.1852', OID_CONTROL, 'User quota', 'MICROSOFT'), + '1.2.840.113556.1.4.1907': ('1.2.840.113556.1.4.1907', OID_CONTROL, 'Server shutdown notify', 'MICROSOFT'), + '1.2.840.113556.1.4.1948': ('1.2.840.113556.1.4.1948', OID_CONTROL, 'Range retrieval no error', 'MICROSOFT'), + '1.2.840.113556.1.4.1974': ('1.2.840.113556.1.4.1974', OID_CONTROL, 'Server force update', 'MICROSOFT'), + '1.2.840.113556.1.4.2026': ('1.2.840.113556.1.4.2026', OID_CONTROL, 'Input DN', 'MICROSOFT'), + '1.2.840.113556.1.4.2064': ('1.2.840.113556.1.4.2064', OID_CONTROL, 'Show recycled', 'MICROSOFT'), + '1.2.840.113556.1.4.2065': ('1.2.840.113556.1.4.2065', OID_CONTROL, 'Show deactivated link', 'MICROSOFT'), + '1.2.840.113556.1.4.2066': ('1.2.840.113556.1.4.2066', OID_CONTROL, 'Policy hints [DEPRECATED]', 'MICROSOFT'), + '1.2.840.113556.1.4.2090': ('1.2.840.113556.1.4.2090', OID_CONTROL, 'DirSync EX', 'MICROSOFT'), + '1.2.840.113556.1.4.2204': ('1.2.840.113556.1.4.2204', OID_CONTROL, 'Tree deleted EX', 'MICROSOFT'), + '1.2.840.113556.1.4.2205': ('1.2.840.113556.1.4.2205', OID_CONTROL, 'Updates stats', 'MICROSOFT'), + '1.2.840.113556.1.4.2206': ('1.2.840.113556.1.4.2206', OID_CONTROL, 'Search hints', 'MICROSOFT'), + '1.2.840.113556.1.4.2211': ('1.2.840.113556.1.4.2211', OID_CONTROL, 'Expected entry count', 'MICROSOFT'), + '1.2.840.113556.1.4.2239': ('1.2.840.113556.1.4.2239', OID_CONTROL, 'Policy hints', 'MICROSOFT'), + '1.2.840.113556.1.4.2255': ('1.2.840.113556.1.4.2255', OID_CONTROL, 'Set owner', 'MICROSOFT'), + '1.2.840.113556.1.4.2256': ('1.2.840.113556.1.4.2256', OID_CONTROL, 'Bypass quota', 'MICROSOFT'), + '1.3.6.1.1.7.1': ('1.3.6.1.1.7.1', OID_CONTROL, 'LCUP Sync Request', 'RFC3928'), + '1.3.6.1.1.7.2': ('1.3.6.1.1.7.2', OID_CONTROL, 'LCUP Sync Update', 'RFC3928'), + '1.3.6.1.1.7.3': ('1.3.6.1.1.7.3', OID_CONTROL, 'LCUP Sync Done', 'RFC3928'), + '1.3.6.1.1.12': ('1.3.6.1.1.12', OID_CONTROL, 'Assertion', 'RFC4528'), + '1.3.6.1.1.13.1': ('1.3.6.1.1.13.1', OID_CONTROL, 'LDAP Pre-read', 'RFC4527'), + '1.3.6.1.1.13.2': ('1.3.6.1.1.13.2', OID_CONTROL, 'LDAP Post-read', 'RFC4527'), + '1.3.6.1.1.21.2': ('1.3.6.1.1.21.2', OID_CONTROL, 'Transaction Specification', 'RFC5805'), + '1.3.6.1.1.22': ('1.3.6.1.1.22', OID_CONTROL, "LDAP Don't Use Copy", 'RFC6171'), + '1.3.6.1.4.1.42.2.27.8.5.1': ('1.3.6.1.4.1.42.2.27.8.5.1', OID_CONTROL, 'Password policy', 'IETF DRAFT behera-ldap-password-policy'), + '1.3.6.1.4.1.42.2.27.9.5.2': ('1.3.6.1.4.1.42.2.27.9.5.2', OID_CONTROL, 'Get effective rights', 'IETF DRAFT draft-ietf-ldapext-acl-model'), + '1.3.6.1.4.1.42.2.27.9.5.8': ('1.3.6.1.4.1.42.2.27.9.5.8', OID_CONTROL, 'Account usability', 'SUN microsystems'), + '1.3.6.1.4.1.1466.29539.12': ('1.3.6.1.4.1.1466.29539.12', OID_CONTROL, 'Chaining loop detect', 'SUN microsystems'), + '1.3.6.1.4.1.4203.1.9.1.1': ('1.3.6.1.4.1.4203.1.9.1.1', OID_CONTROL, 'LDAP content synchronization', 'RFC4533'), + '1.3.6.1.4.1.4203.1.10.1': ('1.3.6.1.4.1.4203.1.10.1', OID_CONTROL, 'Subentries', 'RFC3672'), + '1.3.6.1.4.1.4203.1.10.2': ('1.3.6.1.4.1.4203.1.10.2', OID_CONTROL, 'No-Operation', 'IETF DRAFT draft-zeilenga-ldap-noop'), + '1.3.6.1.4.1.4203.666.5.16': ('1.3.6.1.4.1.4203.666.5.16', OID_CONTROL, 'LDAP Dereference', 'IETF DRAFT draft-masarati-ldap-deref'), + '1.3.6.1.4.1.7628.5.101.1': ('1.3.6.1.4.1.7628.5.101.1', OID_CONTROL, 'LDAP subentries', 'IETF DRAFT draft-ietf-ldup-subentry'), + '1.3.6.1.4.1.26027.1.5.2': ('1.3.6.1.4.1.26027.1.5.2', OID_CONTROL, 'Replication repair', 'OpenDS'), + '2.16.840.1.113719.1.27.101.5': ('2.16.840.1.113719.1.27.101.5', OID_CONTROL, 'Simple password', 'NOVELL'), + '1.3.6.1.4.1.26027.1.6.1': ('1.3.6.1.4.1.26027.1.6.1', OID_CONTROL, 'Password policy state', 'OpenDS'), + '1.3.6.1.4.1.26027.1.6.2': ('1.3.6.1.4.1.26027.1.6.2', OID_CONTROL, 'Get connection ID', 'OpenDS'), + '1.3.6.1.4.1.26027.1.6.3': ('1.3.6.1.4.1.26027.1.6.3', OID_CONTROL, 'Get symmetric key', 'OpenDS'), + '2.16.840.1.113719.1.27.101.6': ('2.16.840.1.113719.1.27.101.6', OID_CONTROL, 'Forward reference', 'NOVELL'), + '2.16.840.1.113719.1.27.103.7': ('2.16.840.1.113719.1.27.103.7', OID_CONTROL, 'Grouping', 'NOVELL'), + '2.16.840.1.113730.3.4.2': ('2.16.840.1.113730.3.4.2', OID_CONTROL, 'ManageDsaIT', 'RFC3296'), + '2.16.840.1.113730.3.4.3': ('2.16.840.1.113730.3.4.3', OID_CONTROL, 'Persistent Search', 'IETF'), + '2.16.840.1.113730.3.4.4': ('2.16.840.1.113730.3.4.4', OID_CONTROL, 'Netscape Password Expired', 'Netscape'), + '2.16.840.1.113730.3.4.5': ('2.16.840.1.113730.3.4.5', OID_CONTROL, 'Netscape Password Expiring', 'Netscape'), + '2.16.840.1.113730.3.4.6': ('2.16.840.1.113730.3.4.6', OID_CONTROL, 'Netscape NT Synchronization Client', 'Netscape'), + '2.16.840.1.113730.3.4.7': ('2.16.840.1.113730.3.4.7', OID_CONTROL, 'Entry Change Notification', 'Netscape'), + '2.16.840.1.113730.3.4.9': ('2.16.840.1.113730.3.4.9', OID_CONTROL, 'Virtual List View Request', 'IETF'), + '2.16.840.1.113730.3.4.10': ('2.16.840.1.113730.3.4.10', OID_CONTROL, 'Virtual List View Response', 'IETF'), + '2.16.840.1.113730.3.4.12': ('2.16.840.1.113730.3.4.12', OID_CONTROL, 'Proxied Authorization (old)', 'Netscape'), + '2.16.840.1.113730.3.4.13': ('2.16.840.1.113730.3.4.13', OID_CONTROL, 'iPlanet Directory Server Replication Update Information', 'Netscape'), + '2.16.840.1.113730.3.4.14': ('2.16.840.1.113730.3.4.14', OID_CONTROL, 'Search on specific database', 'Netscape'), + '2.16.840.1.113730.3.4.15': ('2.16.840.1.113730.3.4.15', OID_CONTROL, 'Authorization Identity Response Control', 'RFC3829'), + '2.16.840.1.113730.3.4.16': ('2.16.840.1.113730.3.4.16', OID_CONTROL, 'Authorization Identity Request Control', 'RFC3829'), + '2.16.840.1.113730.3.4.17': ('2.16.840.1.113730.3.4.17', OID_CONTROL, 'Real attribute only request', 'Netscape'), + '2.16.840.1.113730.3.4.18': ('2.16.840.1.113730.3.4.18', OID_CONTROL, 'Proxy Authorization Control', 'RFC6171'), + '2.16.840.1.113730.3.4.19': ('2.16.840.1.113730.3.4.19', OID_CONTROL, 'Chaining loop detection', 'Netscape'), + '2.16.840.1.113730.3.4.20': ('2.16.840.1.113730.3.4.20', OID_CONTROL, 'Mapping Tree Node - Use one backend [extended]', 'openLDAP'), + '2.16.840.1.113730.3.8.10.6': ('2.16.840.1.113730.3.8.10.6', OID_CONTROL, 'OTP Sync Request', 'freeIPA'), + + # dit content rules + + # extensions + '1.2.840.113556.1.4.1781': ('1.2.840.113556.1.4.1781', OID_EXTENSION, 'Fast concurrent bind', 'MICROSOFT'), + '1.2.840.113556.1.4.2212': ('1.2.840.113556.1.4.2212', OID_EXTENSION, 'Batch request', 'MICROSOFT'), + '1.3.6.1.1.8': ('1.3.6.1.1.8', OID_EXTENSION, 'Cancel Operation', 'RFC3909'), + '1.3.6.1.1.21.1': ('1.3.6.1.1.21.1', OID_EXTENSION, 'Start Transaction Extended Request', 'RFC5805'), + '1.3.6.1.1.21.3': ('1.3.6.1.1.21.3', OID_EXTENSION, 'End Transaction Extended Request', 'RFC5805'), + '1.3.6.1.4.1.1466.101.119.1': ('1.3.6.1.4.1.1466.101.119.1', OID_EXTENSION, 'Dynamic Refresh', 'RFC2589'), + '1.3.6.1.4.1.1466.20037': ('1.3.6.1.4.1.1466.20037', OID_EXTENSION, 'StartTLS', 'RFC4511-RFC4513'), + '1.3.6.1.4.1.4203.1.11.1': ('1.3.6.1.4.1.4203.1.11.1', OID_EXTENSION, 'Modify Password', 'RFC3062'), + '1.3.6.1.4.1.4203.1.11.3': ('1.3.6.1.4.1.4203.1.11.3', OID_EXTENSION, 'Who am I', 'RFC4532'), + '1.3.6.1.1.17.1': ('1.3.6.1.1.17.1', OID_EXTENSION, 'StartLBURPRequest LDAP ExtendedRequest message', 'RFC4373'), + '1.3.6.1.1.17.2': ('1.3.6.1.1.17.2', OID_EXTENSION, 'StartLBURPResponse LDAP ExtendedResponse message', 'RFC4373'), + '1.3.6.1.1.17.3': ('1.3.6.1.1.17.3', OID_EXTENSION, 'EndLBURPRequest LDAP ExtendedRequest message', 'RFC4373'), + '1.3.6.1.1.17.4': ('1.3.6.1.1.17.4', OID_EXTENSION, 'EndLBURPResponse LDAP ExtendedResponse message', 'RFC4373'), + '1.3.6.1.1.17.5': ('1.3.6.1.1.17.5', OID_EXTENSION, 'LBURPUpdateRequest LDAP ExtendedRequest message', 'RFC4373'), + '1.3.6.1.1.17.6': ('1.3.6.1.1.17.6', OID_EXTENSION, 'LBURPUpdateResponse LDAP ExtendedResponse message', 'RFC4373'), + '1.3.6.1.1.19': ('1.3.6.1.1.19', OID_EXTENSION, 'LDAP Turn Operation', 'RFC4531'), + '2.16.840.1.113719.1.14.100.1': ('2.16.840.1.113719.1.14.100.1', OID_EXTENSION, 'getDriverSetRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.2': ('2.16.840.1.113719.1.14.100.2', OID_EXTENSION, 'getDriverSetResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.3': ('2.16.840.1.113719.1.14.100.3', OID_EXTENSION, 'setDriverSetRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.4': ('2.16.840.1.113719.1.14.100.4', OID_EXTENSION, 'setDriverSetResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.5': ('2.16.840.1.113719.1.14.100.5', OID_EXTENSION, 'clearDriverSetRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.6': ('2.16.840.1.113719.1.14.100.6', OID_EXTENSION, 'clearDriverSetResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.7': ('2.16.840.1.113719.1.14.100.7', OID_EXTENSION, 'getDriverStartOptionRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.8': ('2.16.840.1.113719.1.14.100.8', OID_EXTENSION, 'getDriverStartOptionResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.9': ('2.16.840.1.113719.1.14.100.9', OID_EXTENSION, 'setDriverStartOptionRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.10': ('2.16.840.1.113719.1.14.100.10', OID_EXTENSION, 'setDriverStartOptionResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.11': ('2.16.840.1.113719.1.14.100.11', OID_EXTENSION, 'getVersionRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.12': ('2.16.840.1.113719.1.14.100.12', OID_EXTENSION, 'getVersionResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.13': ('2.16.840.1.113719.1.14.100.13', OID_EXTENSION, 'getDriverStateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.14': ('2.16.840.1.113719.1.14.100.14', OID_EXTENSION, 'getDriverStateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.15': ('2.16.840.1.113719.1.14.100.15', OID_EXTENSION, 'startDriverRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.16': ('2.16.840.1.113719.1.14.100.16', OID_EXTENSION, 'startDriverResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.17': ('2.16.840.1.113719.1.14.100.17', OID_EXTENSION, 'stopDriverRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.18': ('2.16.840.1.113719.1.14.100.18', OID_EXTENSION, 'stopDriverResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.19': ('2.16.840.1.113719.1.14.100.19', OID_EXTENSION, 'getDriverStatsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.20': ('2.16.840.1.113719.1.14.100.20', OID_EXTENSION, 'getDriverStatsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.21': ('2.16.840.1.113719.1.14.100.21', OID_EXTENSION, 'driverGetSchemaRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.22': ('2.16.840.1.113719.1.14.100.22', OID_EXTENSION, 'driverGetSchemaResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.23': ('2.16.840.1.113719.1.14.100.23', OID_EXTENSION, 'driverResyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.24': ('2.16.840.1.113719.1.14.100.24', OID_EXTENSION, 'driverResyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.25': ('2.16.840.1.113719.1.14.100.25', OID_EXTENSION, 'migrateAppRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.26': ('2.16.840.1.113719.1.14.100.26', OID_EXTENSION, 'migrateAppResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.27': ('2.16.840.1.113719.1.14.100.27', OID_EXTENSION, 'queueEventRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.28': ('2.16.840.1.113719.1.14.100.28', OID_EXTENSION, 'queueEventResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.29': ('2.16.840.1.113719.1.14.100.29', OID_EXTENSION, 'submitCommandRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.30': ('2.16.840.1.113719.1.14.100.30', OID_EXTENSION, 'submitCommandResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.31': ('2.16.840.1.113719.1.14.100.31', OID_EXTENSION, 'submitEventRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.32': ('2.16.840.1.113719.1.14.100.32', OID_EXTENSION, 'submitEventResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.33': ('2.16.840.1.113719.1.14.100.33', OID_EXTENSION, 'getChunkedResultRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.34': ('2.16.840.1.113719.1.14.100.34', OID_EXTENSION, 'getChunkedResultResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.35': ('2.16.840.1.113719.1.14.100.35', OID_EXTENSION, 'closeChunkedResultRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.36': ('2.16.840.1.113719.1.14.100.36', OID_EXTENSION, 'closeChunkedResultResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.37': ('2.16.840.1.113719.1.14.100.37', OID_EXTENSION, 'checkObjectPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.38': ('2.16.840.1.113719.1.14.100.38', OID_EXTENSION, 'checkObjectPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.39': ('2.16.840.1.113719.1.14.100.39', OID_EXTENSION, 'initDriverObjectRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.40': ('2.16.840.1.113719.1.14.100.40', OID_EXTENSION, 'initDriverObjectResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.41': ('2.16.840.1.113719.1.14.100.41', OID_EXTENSION, 'viewCacheEntriesRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.42': ('2.16.840.1.113719.1.14.100.42', OID_EXTENSION, 'viewCacheEntriesResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.43': ('2.16.840.1.113719.1.14.100.43', OID_EXTENSION, 'deleteCacheEntriesRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.44': ('2.16.840.1.113719.1.14.100.44', OID_EXTENSION, 'deleteCacheEntriesResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.45': ('2.16.840.1.113719.1.14.100.45', OID_EXTENSION, 'getPasswordsStateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.46': ('2.16.840.1.113719.1.14.100.46', OID_EXTENSION, 'getPasswordsStateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.47': ('2.16.840.1.113719.1.14.100.47', OID_EXTENSION, 'regenerateKeyRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.48': ('2.16.840.1.113719.1.14.100.48', OID_EXTENSION, 'regenerateKeyResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.49': ('2.16.840.1.113719.1.14.100.49', OID_EXTENSION, 'getServerCertRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.50': ('2.16.840.1.113719.1.14.100.50', OID_EXTENSION, 'getServerCertResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.51': ('2.16.840.1.113719.1.14.100.51', OID_EXTENSION, 'discoverJobsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.52': ('2.16.840.1.113719.1.14.100.52', OID_EXTENSION, 'discoverJobsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.53': ('2.16.840.1.113719.1.14.100.53', OID_EXTENSION, 'notifyJobUpdateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.54': ('2.16.840.1.113719.1.14.100.54', OID_EXTENSION, 'notifyJobUpdateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.55': ('2.16.840.1.113719.1.14.100.55', OID_EXTENSION, 'startJobRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.56': ('2.16.840.1.113719.1.14.100.56', OID_EXTENSION, 'startJobResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.57': ('2.16.840.1.113719.1.14.100.57', OID_EXTENSION, 'abortJobRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.58': ('2.16.840.1.113719.1.14.100.58', OID_EXTENSION, 'abortJobresponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.59': ('2.16.840.1.113719.1.14.100.59', OID_EXTENSION, 'getJobStateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.60': ('2.16.840.1.113719.1.14.100.60', OID_EXTENSION, 'getJobStateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.61': ('2.16.840.1.113719.1.14.100.61', OID_EXTENSION, 'checkJobConfigRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.62': ('2.16.840.1.113719.1.14.100.62', OID_EXTENSION, 'checkJobConfigResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.63': ('2.16.840.1.113719.1.14.100.63', OID_EXTENSION, 'setLogEventsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.64': ('2.16.840.1.113719.1.14.100.64', OID_EXTENSION, 'setLogEventsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.65': ('2.16.840.1.113719.1.14.100.65', OID_EXTENSION, 'clearLogEventsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.66': ('2.16.840.1.113719.1.14.100.66', OID_EXTENSION, 'clearLogEventsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.67': ('2.16.840.1.113719.1.14.100.67', OID_EXTENSION, 'setAppPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.68': ('2.16.840.1.113719.1.14.100.68', OID_EXTENSION, 'setAppPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.69': ('2.16.840.1.113719.1.14.100.69', OID_EXTENSION, 'clearAppPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.70': ('2.16.840.1.113719.1.14.100.70', OID_EXTENSION, 'clearAppPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.71': ('2.16.840.1.113719.1.14.100.71', OID_EXTENSION, 'setRemoteLoaderPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.72': ('2.16.840.1.113719.1.14.100.72', OID_EXTENSION, 'setRemoteLoaderPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.73': ('2.16.840.1.113719.1.14.100.73', OID_EXTENSION, 'clearRemoteLoaderPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.74': ('2.16.840.1.113719.1.14.100.74', OID_EXTENSION, 'clearRemoteLoaderPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.75': ('2.16.840.1.113719.1.14.100.75', OID_EXTENSION, 'setNamedPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.76': ('2.16.840.1.113719.1.14.100.76', OID_EXTENSION, 'setNamedPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.77': ('2.16.840.1.113719.1.14.100.77', OID_EXTENSION, 'removeNamedPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.78': ('2.16.840.1.113719.1.14.100.78', OID_EXTENSION, 'removeNamedPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.79': ('2.16.840.1.113719.1.14.100.79', OID_EXTENSION, 'removeAllNamedPasswordsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.80': ('2.16.840.1.113719.1.14.100.80', OID_EXTENSION, 'removeAllNamedPasswordsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.81': ('2.16.840.1.113719.1.14.100.81', OID_EXTENSION, 'listNamedPasswordsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.82': ('2.16.840.1.113719.1.14.100.82', OID_EXTENSION, 'listNamedPasswordsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.83': ('2.16.840.1.113719.1.14.100.83', OID_EXTENSION, 'getDefaultReciprocalAttrsMapRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.84': ('2.16.840.1.113719.1.14.100.84', OID_EXTENSION, 'getDefaultReciprocalAttrsMapResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.85': ('2.16.840.1.113719.1.14.100.85', OID_EXTENSION, 'resetDriverStatsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.86': ('2.16.840.1.113719.1.14.100.86', OID_EXTENSION, 'resetDriverStatsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.87': ('2.16.840.1.113719.1.14.100.87', OID_EXTENSION, 'regenerateAllKeysRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.88': ('2.16.840.1.113719.1.14.100.88', OID_EXTENSION, 'regenerateAllKeysResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.89': ('2.16.840.1.113719.1.14.100.89', OID_EXTENSION, 'getDriverGCVRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.90': ('2.16.840.1.113719.1.14.100.90', OID_EXTENSION, 'getDriverGCVResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.91': ('2.16.840.1.113719.1.14.100.91', OID_EXTENSION, 'getNamedPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.92': ('2.16.840.1.113719.1.14.100.92', OID_EXTENSION, 'getNamedPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.1': ('2.16.840.1.113719.1.27.100.1', OID_EXTENSION, 'ndsToLdapResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.2': ('2.16.840.1.113719.1.27.100.2', OID_EXTENSION, 'ndsToLdapRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.3': ('2.16.840.1.113719.1.27.100.3', OID_EXTENSION, 'splitPartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.4': ('2.16.840.1.113719.1.27.100.4', OID_EXTENSION, 'splitPartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.5': ('2.16.840.1.113719.1.27.100.5', OID_EXTENSION, 'mergePartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.6': ('2.16.840.1.113719.1.27.100.6', OID_EXTENSION, 'mergePartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.7': ('2.16.840.1.113719.1.27.100.7', OID_EXTENSION, 'addReplicaRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.8': ('2.16.840.1.113719.1.27.100.8', OID_EXTENSION, 'addReplicaResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.9': ('2.16.840.1.113719.1.27.100.9', OID_EXTENSION, 'refreshLDAPServerRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.10': ('2.16.840.1.113719.1.27.100.10', OID_EXTENSION, 'refreshLDAPServerResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.11': ('2.16.840.1.113719.1.27.100.11', OID_EXTENSION, 'removeReplicaRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.12': ('2.16.840.1.113719.1.27.100.12', OID_EXTENSION, 'removeReplicaResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.13': ('2.16.840.1.113719.1.27.100.13', OID_EXTENSION, 'partitionEntryCountRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.14': ('2.16.840.1.113719.1.27.100.14', OID_EXTENSION, 'partitionEntryCountResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.15': ('2.16.840.1.113719.1.27.100.15', OID_EXTENSION, 'changeReplicaTypeRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.16': ('2.16.840.1.113719.1.27.100.16', OID_EXTENSION, 'changeReplicaTypeResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.17': ('2.16.840.1.113719.1.27.100.17', OID_EXTENSION, 'getReplicaInfoRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.18': ('2.16.840.1.113719.1.27.100.18', OID_EXTENSION, 'getReplicaInfoResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.19': ('2.16.840.1.113719.1.27.100.19', OID_EXTENSION, 'listReplicaRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.20': ('2.16.840.1.113719.1.27.100.20', OID_EXTENSION, 'listReplicaResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.21': ('2.16.840.1.113719.1.27.100.21', OID_EXTENSION, 'receiveAllUpdatesRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.22': ('2.16.840.1.113719.1.27.100.22', OID_EXTENSION, 'receiveAllUpdatesResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.23': ('2.16.840.1.113719.1.27.100.23', OID_EXTENSION, 'sendAllUpdatesRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.24': ('2.16.840.1.113719.1.27.100.24', OID_EXTENSION, 'sendAllUpdatesResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.25': ('2.16.840.1.113719.1.27.100.25', OID_EXTENSION, 'requestPartitionSyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.26': ('2.16.840.1.113719.1.27.100.26', OID_EXTENSION, 'requestPartitionSyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.27': ('2.16.840.1.113719.1.27.100.27', OID_EXTENSION, 'requestSchemaSyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.28': ('2.16.840.1.113719.1.27.100.28', OID_EXTENSION, 'requestSchemaSyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.29': ('2.16.840.1.113719.1.27.100.29', OID_EXTENSION, 'abortPartitionOperationRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.30': ('2.16.840.1.113719.1.27.100.30', OID_EXTENSION, 'abortPartitionOperationResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.31': ('2.16.840.1.113719.1.27.100.31', OID_EXTENSION, 'getBindDNRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.32': ('2.16.840.1.113719.1.27.100.32', OID_EXTENSION, 'getBindDNResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.33': ('2.16.840.1.113719.1.27.100.33', OID_EXTENSION, 'getEffectivePrivilegesRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.34': ('2.16.840.1.113719.1.27.100.34', OID_EXTENSION, 'getEffectivePrivilegesResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.35': ('2.16.840.1.113719.1.27.100.35', OID_EXTENSION, 'setReplicationFilterRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.36': ('2.16.840.1.113719.1.27.100.36', OID_EXTENSION, 'setReplicationFilterResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.37': ('2.16.840.1.113719.1.27.100.37', OID_EXTENSION, 'getReplicationFilterRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.38': ('2.16.840.1.113719.1.27.100.38', OID_EXTENSION, 'getReplicationFilterResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.39': ('2.16.840.1.113719.1.27.100.39', OID_EXTENSION, 'splitOrphanPartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.40': ('2.16.840.1.113719.1.27.100.40', OID_EXTENSION, 'splitOrphanPartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.41': ('2.16.840.1.113719.1.27.100.41', OID_EXTENSION, 'removeOrphanPartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.42': ('2.16.840.1.113719.1.27.100.42', OID_EXTENSION, 'removeOrphanPartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.43': ('2.16.840.1.113719.1.27.100.43', OID_EXTENSION, 'triggerBKLinkerRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.44': ('2.16.840.1.113719.1.27.100.44', OID_EXTENSION, 'triggerBKLinkerResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.45': ('2.16.840.1.113719.1.27.100.45', OID_EXTENSION, 'triggerDRLProcessRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.46': ('2.16.840.1.113719.1.27.100.46', OID_EXTENSION, 'triggerDRLProcessResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.47': ('2.16.840.1.113719.1.27.100.47', OID_EXTENSION, 'triggerJanitorRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.48': ('2.16.840.1.113719.1.27.100.48', OID_EXTENSION, 'triggerJanitorResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.49': ('2.16.840.1.113719.1.27.100.49', OID_EXTENSION, 'triggerLimberRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.50': ('2.16.840.1.113719.1.27.100.50', OID_EXTENSION, 'triggerLimberResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.51': ('2.16.840.1.113719.1.27.100.51', OID_EXTENSION, 'triggerSkulkerRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.52': ('2.16.840.1.113719.1.27.100.52', OID_EXTENSION, 'triggerSkulkerResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.53': ('2.16.840.1.113719.1.27.100.53', OID_EXTENSION, 'triggerSchemaSyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.54': ('2.16.840.1.113719.1.27.100.54', OID_EXTENSION, 'triggerSchemaSyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.55': ('2.16.840.1.113719.1.27.100.55', OID_EXTENSION, 'triggerPartitionPurgeRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.56': ('2.16.840.1.113719.1.27.100.56', OID_EXTENSION, 'triggerPartitionPurgeResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.79': ('2.16.840.1.113719.1.27.100.79', OID_EXTENSION, 'eventMonitorRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.80': ('2.16.840.1.113719.1.27.100.80', OID_EXTENSION, 'eventMonitorResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.81': ('2.16.840.1.113719.1.27.100.81', OID_EXTENSION, 'nldapEventNotification', 'NOVELL'), + '2.16.840.1.113719.1.27.100.84': ('2.16.840.1.113719.1.27.100.84', OID_EXTENSION, 'filteredEventMonitorRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.85': ('2.16.840.1.113719.1.27.100.85', OID_EXTENSION, 'filteredEventMonitorResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.96': ('2.16.840.1.113719.1.27.100.96', OID_EXTENSION, 'ldapBackupRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.97': ('2.16.840.1.113719.1.27.100.97', OID_EXTENSION, 'ldapBackupResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.98': ('2.16.840.1.113719.1.27.100.98', OID_EXTENSION, 'ldapRestoreRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.99': ('2.16.840.1.113719.1.27.100.99', OID_EXTENSION, 'ldapRestoreResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.101': ('2.16.840.1.113719.1.27.100.101', OID_EXTENSION, 'LDAPDNStoX500DNRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.102': ('2.16.840.1.113719.1.27.100.102', OID_EXTENSION, 'LDAPDNStoX500DNResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.103': ('2.16.840.1.113719.1.27.100.103', OID_EXTENSION, 'getPrivilegesListRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.104': ('2.16.840.1.113719.1.27.100.104', OID_EXTENSION, 'getPrivilegesListResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.103.1': ('2.16.840.1.113719.1.27.103.1', OID_EXTENSION, 'createGroupingRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.103.2': ('2.16.840.1.113719.1.27.103.2', OID_EXTENSION, 'endGroupingRequest', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.1': ('2.16.840.1.113719.1.39.42.100.1', OID_EXTENSION, 'NMAS Put Login Configuration', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.3': ('2.16.840.1.113719.1.39.42.100.3', OID_EXTENSION, 'NMAS Get Login Configuration', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.5': ('2.16.840.1.113719.1.39.42.100.5', OID_EXTENSION, 'NMAS Delete Login Configuration', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.7': ('2.16.840.1.113719.1.49.42.100.7', OID_EXTENSION, 'NMAS Put Login Secret', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.9': ('2.16.840.1.113719.1.39.42.100.9', OID_EXTENSION, 'NMAS Delete Login Secret', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.11': ('2.16.840.1.113719.1.39.42.100.11', OID_EXTENSION, 'NMAS Set Universal Password Request', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.12': ('2.16.840.1.113719.1.39.42.100.12', OID_EXTENSION, 'NMAS Set Universal Password Response', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.13': ('2.16.840.1.113719.1.39.42.100.13', OID_EXTENSION, 'NMAS Get Universal Password Request', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.14': ('2.16.840.1.113719.1.39.42.100.14', OID_EXTENSION, 'NMAS Get Universal Password Response', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.15': ('2.16.840.1.113719.1.39.42.100.15', OID_EXTENSION, 'NMAS Delete Universal Password', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.17': ('2.16.840.1.113719.1.39.42.100.17', OID_EXTENSION, 'NMAS Check password against password policy', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.19': ('2.16.840.1.113719.1.39.42.100.19', OID_EXTENSION, 'NMAS Get password policy information', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.21': ('2.16.840.1.113719.1.39.42.100.21', OID_EXTENSION, 'NMAS Change Universal Password', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.23': ('2.16.840.1.113719.1.39.42.100.23', OID_EXTENSION, 'NMAS Graded Authentication management', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.25': ('2.16.840.1.113719.1.39.42.100.25', OID_EXTENSION, 'NMAS management (new with NMAS 3.1.0)', 'NOVELL'), + '2.16.840.1.113719.1.142.1.4.1': ('2.16.840.1.113719.1.142.1.4.1', OID_EXTENSION, 'LBURPIncUpdate', 'NOVELL'), + '2.16.840.1.113719.1.142.1.4.2': ('2.16.840.1.113719.1.142.1.4.2', OID_EXTENSION, 'LBURPFullUpdate', 'NOVELL'), + '2.16.840.1.113719.1.142.100.1': ('2.16.840.1.113719.1.142.100.1', OID_EXTENSION, 'LBURPStartReplRequest', 'NOVELL'), + '2.16.840.1.113719.1.142.100.2': ('2.16.840.1.113719.1.142.100.2', OID_EXTENSION, 'LBURPStartReplResponse', 'NOVELL'), + '2.16.840.1.113719.1.142.100.4': ('2.16.840.1.113719.1.142.100.4', OID_EXTENSION, 'LBURPEndReplRequest', 'NOVELL'), + '2.16.840.1.113719.1.142.100.5': ('2.16.840.1.113719.1.142.100.5', OID_EXTENSION, 'LBURPEndReplResponse', 'NOVELL'), + '2.16.840.1.113719.1.142.100.6': ('2.16.840.1.113719.1.142.100.6', OID_EXTENSION, 'LBURPOperationRequest', 'NOVELL'), + '2.16.840.1.113719.1.142.100.7': ('2.16.840.1.113719.1.142.100.7', OID_EXTENSION, 'LBURPOperationResponse', 'NOVELL'), + '2.16.840.1.113719.1.148.100.1': ('2.16.840.1.113719.1.148.100.1', OID_EXTENSION, 'SSLDAP_GET_SERVICE_INFO_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.2': ('2.16.840.1.113719.1.148.100.2', OID_EXTENSION, 'SSLDAP_GET_SERVICE_INFO_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.3': ('2.16.840.1.113719.1.148.100.3', OID_EXTENSION, 'SSLDAP_READ_SECRET_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.4': ('2.16.840.1.113719.1.148.100.4', OID_EXTENSION, 'SSLDAP_READ_SECRET_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.5': ('2.16.840.1.113719.1.148.100.5', OID_EXTENSION, 'SSLDAP_WRITE_SECRET_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.6': ('2.16.840.1.113719.1.148.100.6', OID_EXTENSION, 'SSLDAP_WRITE_SECRET_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.7': ('2.16.840.1.113719.1.148.100.7', OID_EXTENSION, 'SSLDAP_ADD_SECRET_ID_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.8': ('2.16.840.1.113719.1.148.100.8', OID_EXTENSION, 'SSLDAP_ADD_SECRET_ID_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.9': ('2.16.840.1.113719.1.148.100.9', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.10': ('2.16.840.1.113719.1.148.100.10', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.11': ('2.16.840.1.113719.1.148.100.11', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_STORE_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.12': ('2.16.840.1.113719.1.148.100.12', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_STORE_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.13': ('2.16.840.1.113719.1.148.100.13', OID_EXTENSION, 'SSLDAP_ENUMERATE_SECRET_IDS_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.14': ('2.16.840.1.113719.1.148.100.14', OID_EXTENSION, 'SSLDAP_ENUMERATE_SECRET_IDS_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.15': ('2.16.840.1.113719.1.148.100.15', OID_EXTENSION, 'SSLDAP_UNLOCK_SECRETS_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.16': ('2.16.840.1.113719.1.148.100.16', OID_EXTENSION, 'SSLDAP_UNLOCK_SECRETS_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.17': ('2.16.840.1.113719.1.148.100.17', OID_EXTENSION, 'SSLDAP_SET_EP_MASTER_PASSWORD_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.18': ('2.16.840.1.113719.1.148.100.18', OID_EXTENSION, 'SSLDAP_SET_EP_MASTER_PASSWORD_REPLY', 'NOVELL'), + '2.16.840.1.113730.3.5.1': ('2.16.840.1.113730.3.5.1', OID_EXTENSION, 'Transaction Request Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.2': ('2.16.840.1.113730.3.5.2', OID_EXTENSION, 'Transaction Response Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.3': ('2.16.840.1.113730.3.5.3', OID_EXTENSION, 'Transaction Response Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.4': ('2.16.840.1.113730.3.5.4', OID_EXTENSION, 'iPlanet Replication Response Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.5': ('2.16.840.1.113730.3.5.5', OID_EXTENSION, 'iPlanet End Replication Request Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.6': ('2.16.840.1.113730.3.5.6', OID_EXTENSION, 'iPlanet Replication Entry Request Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.7': ('2.16.840.1.113730.3.5.7', OID_EXTENSION, 'iPlanet Bulk Import Start Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.8': ('2.16.840.1.113730.3.5.8', OID_EXTENSION, 'iPlanet Bulk Import Finished Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.9': ('2.16.840.1.113730.3.5.9', OID_EXTENSION, 'iPlanet Digest Authentication Calculation Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.10': ('2.16.840.1.113730.3.5.10', OID_EXTENSION, 'Distributed Numeric Assignment Extended Request', 'Netscape'), + '2.16.840.1.113730.3.5.11': ('2.16.840.1.113730.3.5.11', OID_EXTENSION, 'Distributed Numeric Assignment Extended Response', 'Netscape'), + '2.16.840.1.113730.3.5.12': ('2.16.840.1.113730.3.5.12', OID_EXTENSION, 'Start replication request', 'Netscape'), + '2.16.840.1.113730.3.5.13': ('2.16.840.1.113730.3.5.13', OID_EXTENSION, 'Start replication response', 'Netscape'), + '2.16.840.1.113730.3.6.5': ('2.16.840.1.113730.3.6.5', OID_EXTENSION, 'Replication CleanAllRUV', 'Netscape'), + '2.16.840.1.113730.3.6.6': ('2.16.840.1.113730.3.6.6', OID_EXTENSION, 'Replication Abort CleanAllRUV', 'Netscape'), + '2.16.840.1.113730.3.6.7': ('2.16.840.1.113730.3.6.7', OID_EXTENSION, 'Replication CleanAllRUV Retrieve MaxCSN', 'Netscape'), + '2.16.840.1.113730.3.6.8': ('2.16.840.1.113730.3.6.8', OID_EXTENSION, 'Replication CleanAllRUV Check Status', 'Netscape'), + '2.16.840.1.113730.3.8.10.1': ('2.16.840.1.113730.3.8.10.1', OID_EXTENSION, 'KeyTab set', 'FreeIPA'), + '2.16.840.1.113730.3.8.10.2': ('2.16.840.1.113730.3.8.10.2', OID_EXTENSION, 'KeyTab ret', 'FreeIPA'), + '2.16.840.1.113730.3.8.10.3': ('2.16.840.1.113730.3.8.10.3', OID_EXTENSION, 'Enrollment join', 'FreeIPA'), + '2.16.840.1.113730.3.8.10.5': ('2.16.840.1.113730.3.8.10.5', OID_EXTENSION, 'KeyTab get', 'FreeIPA'), + + # features (capabilities) + '1.2.840.113556.1.4.800': ('1.2.840.113556.1.4.800', OID_FEATURE, 'Active directory', 'MICROSOFT'), + '1.2.840.113556.1.4.1670': ('1.2.840.113556.1.4.1670', OID_FEATURE, 'Active directory V51', 'MICROSOFT'), + '1.2.840.113556.1.4.1791': ('1.2.840.113556.1.4.1791', OID_FEATURE, 'Active directory LDAP Integration', 'MICROSOFT'), + '1.2.840.113556.1.4.1880': ('1.2.840.113556.1.4.1880', OID_FEATURE, 'Active directory ADAM digest', 'MICROSOFT'), + '1.2.840.113556.1.4.1851': ('1.2.840.113556.1.4.1851', OID_FEATURE, 'Active directory ADAM', 'MICROSOFT'), + '1.2.840.113556.1.4.1920': ('1.2.840.113556.1.4.1920', OID_FEATURE, 'Active directory partial secrets', 'MICROSOFT'), + '1.2.840.113556.1.4.1935': ('1.2.840.113556.1.4.1935', OID_FEATURE, 'Active directory V60', 'MICROSOFT'), + '1.2.840.113556.1.4.2080': ('1.2.840.113556.1.4.2080', OID_FEATURE, 'Active directory V61 R2', 'MICROSOFT'), + '1.2.840.113556.1.4.2237': ('1.2.840.113556.1.4.2237', OID_FEATURE, 'Active directory W8', 'MICROSOFT'), + '1.3.6.1.1.14': ('1.3.6.1.1.14', OID_FEATURE, 'Modify-Increment', 'RFC4525'), + '1.3.6.1.1.17.7': ('1.3.6.1.1.17.7', OID_FEATURE, 'LBURP Incremental Update style OID', 'RFC4373'), + '1.3.6.1.4.1.4203.1.5.1': ('1.3.6.1.4.1.4203.1.5.1', OID_FEATURE, 'All Op Attrs', 'RFC3673'), + '1.3.6.1.4.1.4203.1.5.2': ('1.3.6.1.4.1.4203.1.5.2', OID_FEATURE, 'OC AD Lists', 'RFC4529'), + '1.3.6.1.4.1.4203.1.5.3': ('1.3.6.1.4.1.4203.1.5.3', OID_FEATURE, 'True/False filters', 'RFC4526'), + '1.3.6.1.4.1.4203.1.5.4': ('1.3.6.1.4.1.4203.1.5.4', OID_FEATURE, 'Language Tag Options', 'RFC3866'), + '1.3.6.1.4.1.4203.1.5.5': ('1.3.6.1.4.1.4203.1.5.5', OID_FEATURE, 'language Range Options', 'RFC3866'), + '2.16.840.1.113719.1.27.99.1': ('2.16.840.1.113719.1.27.99.1', OID_FEATURE, 'Superior References', 'NOVELL'), + + # ldap syntaxes + '1.2.840.113556.1.4.903': ('1.2.840.113556.1.4.903', OID_LDAP_SYNTAX, 'Object (DN-binary)', 'MICROSOFT'), + '1.2.840.113556.1.4.904': ('1.2.840.113556.1.4.904', OID_LDAP_SYNTAX, 'Object(DN-string)', 'MICROSOFT'), + '1.2.840.113556.1.4.905': ('1.2.840.113556.1.4.905', OID_LDAP_SYNTAX, 'String (Teletex)', 'MICROSOFT'), + '1.2.840.113556.1.4.906': ('1.2.840.113556.1.4.906', OID_LDAP_SYNTAX, 'Large Integer', 'MICROSOFT'), + '1.2.840.113556.1.4.907': ('1.2.840.113556.1.4.907', OID_LDAP_SYNTAX, 'String (NT-Sec-Desc)', 'MICROSOFT'), + '1.2.840.113556.1.4.1221': ('1.2.840.113556.1.4.1221', OID_LDAP_SYNTAX, 'Object (OR-Name)', 'MICROSOFT'), + '1.2.840.113556.1.4.1362': ('1.2.840.113556.1.4.1362', OID_LDAP_SYNTAX, 'String (Case)', 'MICROSOFT'), + '1.3.6.1.1.16.1': ('1.3.6.1.1.16.1', OID_LDAP_SYNTAX, 'Universally Unique Identifier (UUID)', 'RFC4530'), + '1.3.6.1.4.1.1466.115.121.1.1': ('1.3.6.1.4.1.1466.115.121.1.1', OID_LDAP_SYNTAX, 'ACI item [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.2': ('1.3.6.1.4.1.1466.115.121.1.2', OID_LDAP_SYNTAX, 'Access point [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.3': ('1.3.6.1.4.1.1466.115.121.1.3', OID_LDAP_SYNTAX, 'Attribute Type Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.4': ('1.3.6.1.4.1.1466.115.121.1.4', OID_LDAP_SYNTAX, 'Audio [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.5': ('1.3.6.1.4.1.1466.115.121.1.5', OID_LDAP_SYNTAX, 'Binary [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.6': ('1.3.6.1.4.1.1466.115.121.1.6', OID_LDAP_SYNTAX, 'Bit String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.7': ('1.3.6.1.4.1.1466.115.121.1.7', OID_LDAP_SYNTAX, 'Boolean', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.8': ('1.3.6.1.4.1.1466.115.121.1.8', OID_LDAP_SYNTAX, 'Certificate [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.9': ('1.3.6.1.4.1.1466.115.121.1.9', OID_LDAP_SYNTAX, 'Certificate List [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.10': ('1.3.6.1.4.1.1466.115.121.1.10', OID_LDAP_SYNTAX, 'Certificate Pair [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.11': ('1.3.6.1.4.1.1466.115.121.1.11', OID_LDAP_SYNTAX, 'Country String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.12': ('1.3.6.1.4.1.1466.115.121.1.12', OID_LDAP_SYNTAX, 'DN', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.13': ('1.3.6.1.4.1.1466.115.121.1.13', OID_LDAP_SYNTAX, 'Data Quality Syntax [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.14': ('1.3.6.1.4.1.1466.115.121.1.14', OID_LDAP_SYNTAX, 'Delivery Method', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.15': ('1.3.6.1.4.1.1466.115.121.1.15', OID_LDAP_SYNTAX, 'Directory String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.16': ('1.3.6.1.4.1.1466.115.121.1.16', OID_LDAP_SYNTAX, 'DIT Content Rule Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.17': ('1.3.6.1.4.1.1466.115.121.1.17', OID_LDAP_SYNTAX, 'DIT Structure Rule Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.18': ('1.3.6.1.4.1.1466.115.121.1.18', OID_LDAP_SYNTAX, 'DL Submit Permission [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.19': ('1.3.6.1.4.1.1466.115.121.1.19', OID_LDAP_SYNTAX, 'DSA Quality Syntax [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.20': ('1.3.6.1.4.1.1466.115.121.1.20', OID_LDAP_SYNTAX, 'DSE Type [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.21': ('1.3.6.1.4.1.1466.115.121.1.21', OID_LDAP_SYNTAX, 'Enhanced Guide', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.22': ('1.3.6.1.4.1.1466.115.121.1.22', OID_LDAP_SYNTAX, 'Facsimile Telephone Number', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.23': ('1.3.6.1.4.1.1466.115.121.1.23', OID_LDAP_SYNTAX, 'Fax', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.24': ('1.3.6.1.4.1.1466.115.121.1.24', OID_LDAP_SYNTAX, 'Generalized Time', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.25': ('1.3.6.1.4.1.1466.115.121.1.25', OID_LDAP_SYNTAX, 'Guide [OBSOLETE]', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.26': ('1.3.6.1.4.1.1466.115.121.1.26', OID_LDAP_SYNTAX, 'IA5 String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.27': ('1.3.6.1.4.1.1466.115.121.1.27', OID_LDAP_SYNTAX, 'Integer', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.28': ('1.3.6.1.4.1.1466.115.121.1.28', OID_LDAP_SYNTAX, 'JPEG', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.29': ('1.3.6.1.4.1.1466.115.121.1.29', OID_LDAP_SYNTAX, 'Master and Shadow Access Points [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.30': ('1.3.6.1.4.1.1466.115.121.1.30', OID_LDAP_SYNTAX, 'Matching Rule Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.31': ('1.3.6.1.4.1.1466.115.121.1.31', OID_LDAP_SYNTAX, 'Matching Rule Use Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.32': ('1.3.6.1.4.1.1466.115.121.1.32', OID_LDAP_SYNTAX, 'Mail Preference [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.33': ('1.3.6.1.4.1.1466.115.121.1.33', OID_LDAP_SYNTAX, 'MHS OR Address [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.34': ('1.3.6.1.4.1.1466.115.121.1.34', OID_LDAP_SYNTAX, 'Name And Optional UID', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.35': ('1.3.6.1.4.1.1466.115.121.1.35', OID_LDAP_SYNTAX, 'Name Form Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.36': ('1.3.6.1.4.1.1466.115.121.1.36', OID_LDAP_SYNTAX, 'Numeric String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.37': ('1.3.6.1.4.1.1466.115.121.1.37', OID_LDAP_SYNTAX, 'Object Class Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.38': ('1.3.6.1.4.1.1466.115.121.1.38', OID_LDAP_SYNTAX, 'OID', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.39': ('1.3.6.1.4.1.1466.115.121.1.39', OID_LDAP_SYNTAX, 'Other Mailbox', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.40': ('1.3.6.1.4.1.1466.115.121.1.40', OID_LDAP_SYNTAX, 'Octet String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.41': ('1.3.6.1.4.1.1466.115.121.1.41', OID_LDAP_SYNTAX, 'Postal Address', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.42': ('1.3.6.1.4.1.1466.115.121.1.42', OID_LDAP_SYNTAX, 'Protocol Information [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.43': ('1.3.6.1.4.1.1466.115.121.1.43', OID_LDAP_SYNTAX, 'Presentation Address [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.44': ('1.3.6.1.4.1.1466.115.121.1.44', OID_LDAP_SYNTAX, 'Printable String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.45': ('1.3.6.1.4.1.1466.115.121.1.45', OID_LDAP_SYNTAX, 'Subtree specification [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.46': ('1.3.6.1.4.1.1466.115.121.1.46', OID_LDAP_SYNTAX, 'Supplier Information [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.47': ('1.3.6.1.4.1.1466.115.121.1.47', OID_LDAP_SYNTAX, 'Supplier Or Consumer [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.48': ('1.3.6.1.4.1.1466.115.121.1.48', OID_LDAP_SYNTAX, 'Supplier And Consumer [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.49': ('1.3.6.1.4.1.1466.115.121.1.49', OID_LDAP_SYNTAX, 'Supported Algorithm [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.50': ('1.3.6.1.4.1.1466.115.121.1.50', OID_LDAP_SYNTAX, 'Telephone Number', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.51': ('1.3.6.1.4.1.1466.115.121.1.51', OID_LDAP_SYNTAX, 'Teletex Terminal Identifier', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.52': ('1.3.6.1.4.1.1466.115.121.1.52', OID_LDAP_SYNTAX, 'Telex Number', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.53': ('1.3.6.1.4.1.1466.115.121.1.53', OID_LDAP_SYNTAX, 'UTC Time [DEPRECATED]', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.54': ('1.3.6.1.4.1.1466.115.121.1.54', OID_LDAP_SYNTAX, 'LDAP Syntax Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.55': ('1.3.6.1.4.1.1466.115.121.1.55', OID_LDAP_SYNTAX, 'Modify rights [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.56': ('1.3.6.1.4.1.1466.115.121.1.56', OID_LDAP_SYNTAX, 'LDAP Schema Definition [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.57': ('1.3.6.1.4.1.1466.115.121.1.57', OID_LDAP_SYNTAX, 'LDAP Schema Description [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.58': ('1.3.6.1.4.1.1466.115.121.1.58', OID_LDAP_SYNTAX, 'Substring Assertion', 'RFC4517'), + '2.16.840.1.113719.1.1.5.1.0': ('2.16.840.1.113719.1.1.5.1.0', OID_LDAP_SYNTAX, 'Unknown', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.6': ('2.16.840.1.113719.1.1.5.1.6', OID_LDAP_SYNTAX, 'Case Ignore List', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.12': ('2.16.840.1.113719.1.1.5.1.12', OID_LDAP_SYNTAX, 'Tagged Data', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.13': ('2.16.840.1.113719.1.1.5.1.13', OID_LDAP_SYNTAX, 'Octet List', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.14': ('2.16.840.1.113719.1.1.5.1.14', OID_LDAP_SYNTAX, 'Tagged String', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.15': ('2.16.840.1.113719.1.1.5.1.15', OID_LDAP_SYNTAX, 'Tagged Name And String', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.16': ('2.16.840.1.113719.1.1.5.1.16', OID_LDAP_SYNTAX, 'NDS Replica Pointer', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.17': ('2.16.840.1.113719.1.1.5.1.17', OID_LDAP_SYNTAX, 'NDS ACL', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.19': ('2.16.840.1.113719.1.1.5.1.19', OID_LDAP_SYNTAX, 'NDS Timestamp', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.22': ('2.16.840.1.113719.1.1.5.1.22', OID_LDAP_SYNTAX, 'Counter', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.23': ('2.16.840.1.113719.1.1.5.1.23', OID_LDAP_SYNTAX, 'Tagged Name', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.25': ('2.16.840.1.113719.1.1.5.1.25', OID_LDAP_SYNTAX, 'Typed Name', 'NOVELL'), + + # ldap url extensions + + # matching rules + '1.2.36.79672281.1.13.2': ('1.2.36.79672281.1.13.2', OID_MATCHING_RULE, 'componentFilterMatch', 'RFC3687'), + '1.2.36.79672281.1.13.3': ('1.2.36.79672281.1.13.3', OID_MATCHING_RULE, 'rdnMatch', 'RFC3687'), + '1.2.36.79672281.1.13.5': ('1.2.36.79672281.1.13.5', OID_MATCHING_RULE, 'presentMatch', 'RFC3687'), + '1.2.36.79672281.1.13.6': ('1.2.36.79672281.1.13.6', OID_MATCHING_RULE, 'allComponentsMatch', 'RFC3687'), + '1.2.36.79672281.1.13.7': ('1.2.36.79672281.1.13.7', OID_MATCHING_RULE, 'directoryComponentsMatch', 'RFC3687'), + '1.2.840.113556.1.4.803': ('1.2.840.113556.1.4.803', OID_MATCHING_RULE, 'Bit AND', 'MICROSOFT'), + '1.2.840.113556.1.4.804': ('1.2.840.113556.1.4.804', OID_MATCHING_RULE, 'Bit OR', 'MICROSOFT'), + '1.2.840.113556.1.4.1941': ('1.2.840.113556.1.4.1941', OID_MATCHING_RULE, 'Transitive Evaluation', 'MICROSOFT'), + '1.2.840.113556.1.4.2253': ('1.2.840.113556.1.4.2253', OID_MATCHING_RULE, 'DN with data', 'MICROSOFT'), + '1.3.6.1.1.16.2': ('1.3.6.1.1.16.2', OID_MATCHING_RULE, 'uuidMatch', 'RFC4530'), + '1.3.6.1.1.16.3': ('1.3.6.1.1.16.3', OID_MATCHING_RULE, 'uuidOrderingMatch', 'RFC4530'), + '1.3.6.1.4.1.1466.109.114.1': ('1.3.6.1.4.1.1466.109.114.1', OID_MATCHING_RULE, 'caseExactIA5Match', 'RFC4517'), + '1.3.6.1.4.1.1466.109.114.2': ('1.3.6.1.4.1.1466.109.114.2', OID_MATCHING_RULE, 'caseIgnoreIA5Match', 'RFC4517'), + '1.3.6.1.4.1.1466.109.114.3': ('1.3.6.1.4.1.1466.109.114.3', OID_MATCHING_RULE, 'caseIgnoreIA5SubstringsMatch', 'RFC4517'), + '2.5.13.0': ('2.5.13.0', OID_MATCHING_RULE, 'objectIdentifierMatch', 'RFC4517'), + '2.5.13.1': ('2.5.13.1', OID_MATCHING_RULE, 'distinguishedNameMatch', 'RFC4517'), + '2.5.13.2': ('2.5.13.2', OID_MATCHING_RULE, 'caseIgnoreMatch', 'RFC4517'), + '2.5.13.3': ('2.5.13.3', OID_MATCHING_RULE, 'caseIgnoreOrderingMatch', 'RFC4517'), + '2.5.13.4': ('2.5.13.4', OID_MATCHING_RULE, 'caseIgnoreSubstringsMatch', 'RFC4517'), + '2.5.13.5': ('2.5.13.5', OID_MATCHING_RULE, 'caseExactMatch', 'RFC4517'), + '2.5.13.6': ('2.5.13.6', OID_MATCHING_RULE, 'caseExactOrderingMatch', 'RFC4517'), + '2.5.13.7': ('2.5.13.7', OID_MATCHING_RULE, 'caseExactSubstringsMatch', 'RFC4517'), + '2.5.13.8': ('2.5.13.8', OID_MATCHING_RULE, 'numericStringMatch', 'RFC4517'), + '2.5.13.9': ('2.5.13.9', OID_MATCHING_RULE, 'numericStringOrderingMatch', 'RFC4517'), + '2.5.13.10': ('2.5.13.10', OID_MATCHING_RULE, 'numericStringSubstringsMatch', 'RFC4517'), + '2.5.13.11': ('2.5.13.11', OID_MATCHING_RULE, 'caseIgnoreListMatch', 'RFC4517'), + '2.5.13.12': ('2.5.13.12', OID_MATCHING_RULE, 'caseIgnoreListSubstringsMatch', 'RFC4517'), + '2.5.13.13': ('2.5.13.13', OID_MATCHING_RULE, 'booleanMatch', 'RFC4517'), + '2.5.13.14': ('2.5.13.14', OID_MATCHING_RULE, 'integerMatch', 'RFC4517'), + '2.5.13.15': ('2.5.13.15', OID_MATCHING_RULE, 'integerOrderingMatch', 'RFC4517'), + '2.5.13.16': ('2.5.13.16', OID_MATCHING_RULE, 'bitStringMatch', 'RFC4517'), + '2.5.13.17': ('2.5.13.17', OID_MATCHING_RULE, 'octetStringMatch', 'RFC4517'), + '2.5.13.18': ('2.5.13.18', OID_MATCHING_RULE, 'octetStringOrderingMatch', 'RFC4517'), + '2.5.13.20': ('2.5.13.20', OID_MATCHING_RULE, 'telephoneNumberMatch', 'RFC4517'), + '2.5.13.21': ('2.5.13.21', OID_MATCHING_RULE, 'telephoneNumberSubstringsMatch', 'RFC4517'), + '2.5.13.22': ('2.5.13.22', OID_MATCHING_RULE, 'presentationAddressMatch', 'RFC2252'), + '2.5.13.23': ('2.5.13.23', OID_MATCHING_RULE, 'uniqueMemberMatch', 'RFC4517'), + '2.5.13.24': ('2.5.13.24', OID_MATCHING_RULE, 'protocolInformationMatch', 'RFC2252'), + '2.5.13.27': ('2.5.13.27', OID_MATCHING_RULE, 'generalizedTimeMatch', 'RFC4517'), + '2.5.13.28': ('2.5.13.28', OID_MATCHING_RULE, 'generalizedTimeOrderingMatch', 'RFC4517'), + '2.5.13.29': ('2.5.13.29', OID_MATCHING_RULE, 'integerFirstComponentMatch', 'RFC4517'), + '2.5.13.30': ('2.5.13.30', OID_MATCHING_RULE, 'objectIdentifierFirstComponentMatch', 'RFC4517'), + '2.5.13.31': ('2.5.13.31', OID_MATCHING_RULE, 'directoryStringFirstComponentMatch', 'RFC4517'), + '2.5.13.32': ('2.5.13.32', OID_MATCHING_RULE, 'wordMatch', 'RFC4517'), + '2.5.13.33': ('2.5.13.33', OID_MATCHING_RULE, 'keywordMatch', 'RFC4517'), + '2.5.13.34': ('2.5.13.34', OID_MATCHING_RULE, 'certificateExactMatch', 'RFC4523'), + '2.5.13.35': ('2.5.13.35', OID_MATCHING_RULE, 'certificateMatch', 'RFC4523'), + '2.5.13.36': ('2.5.13.36', OID_MATCHING_RULE, 'certificatePairExactMatch', 'RFC4523'), + '2.5.13.37': ('2.5.13.37', OID_MATCHING_RULE, 'certificatePairMatch', 'RFC4523'), + '2.5.13.38': ('2.5.13.38', OID_MATCHING_RULE, 'certificateListExactMatch', 'RFC4523'), + '2.5.13.39': ('2.5.13.39', OID_MATCHING_RULE, 'certificateListMatch', 'RFC4523'), + '2.5.13.40': ('2.5.13.40', OID_MATCHING_RULE, 'algorithmIdentifierMatch', 'RFC4523'), + '2.5.13.41': ('2.5.13.41', OID_MATCHING_RULE, 'storedPrefixMatch', 'RFC3698'), + + # name forms + '1.3.6.1.1.10.15.1': ('1.3.6.1.1.10.15.1', OID_NAME_FORM, 'uddiBusinessEntityNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.2': ('1.3.6.1.1.10.15.2', OID_NAME_FORM, 'uddiContactNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.3': ('1.3.6.1.1.10.15.3', OID_NAME_FORM, 'uddiAddressNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.4': ('1.3.6.1.1.10.15.4', OID_NAME_FORM, 'uddiBusinessServiceNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.5': ('1.3.6.1.1.10.15.5', OID_NAME_FORM, 'uddiBindingTemplateNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.6': ('1.3.6.1.1.10.15.6', OID_NAME_FORM, 'uddiTModelInstanceInfoNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.7': ('1.3.6.1.1.10.15.7', OID_NAME_FORM, 'uddiTModelNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.8': ('1.3.6.1.1.10.15.8', OID_NAME_FORM, 'uddiPublisherAssertionNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.9': ('1.3.6.1.1.10.15.9', OID_NAME_FORM, 'uddiv3SubscriptionNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.10': ('1.3.6.1.1.10.15.10', OID_NAME_FORM, 'uddiv3EntityObituaryNameForm', 'RFC4403'), + '1.3.6.1.4.1.1466.345': ('1.3.6.1.4.1.1466.345', OID_NAME_FORM, 'domainNameForm', 'RFC2247'), + + # object classes + '0.9.2342.19200300.100.4.3': ('0.9.2342.19200300.100.4.3', OID_OBJECT_CLASS, 'pilotObject', 'RFC1274'), + '0.9.2342.19200300.100.4.4': ('0.9.2342.19200300.100.4.4', OID_OBJECT_CLASS, 'pilotPerson', 'RFC1274'), + '0.9.2342.19200300.100.4.5': ('0.9.2342.19200300.100.4.5', OID_OBJECT_CLASS, 'account', 'RFC4524'), + '0.9.2342.19200300.100.4.6': ('0.9.2342.19200300.100.4.6', OID_OBJECT_CLASS, 'document', 'RFC4524'), + '0.9.2342.19200300.100.4.7': ('0.9.2342.19200300.100.4.7', OID_OBJECT_CLASS, 'room', 'RFC4524'), + '0.9.2342.19200300.100.4.8': ('0.9.2342.19200300.100.4.8', OID_OBJECT_CLASS, 'documentSeries', 'RFC4524'), + '0.9.2342.19200300.100.4.13': ('0.9.2342.19200300.100.4.13', OID_OBJECT_CLASS, 'domain', 'RFC4524'), + '0.9.2342.19200300.100.4.14': ('0.9.2342.19200300.100.4.14', OID_OBJECT_CLASS, 'RFC822LocalPart', 'RFC4524'), + '0.9.2342.19200300.100.4.15': ('0.9.2342.19200300.100.4.15', OID_OBJECT_CLASS, 'dNSDomain', 'RFC1274'), + '0.9.2342.19200300.100.4.17': ('0.9.2342.19200300.100.4.17', OID_OBJECT_CLASS, 'domainRelatedObject', 'RFC4524'), + '0.9.2342.19200300.100.4.18': ('0.9.2342.19200300.100.4.18', OID_OBJECT_CLASS, 'friendlyCountry', 'RFC4524'), + '0.9.2342.19200300.100.4.19': ('0.9.2342.19200300.100.4.19', OID_OBJECT_CLASS, 'simpleSecurityObject', 'RFC4524'), + '0.9.2342.19200300.100.4.20': ('0.9.2342.19200300.100.4.20', OID_OBJECT_CLASS, 'pilotOrganization', 'RFC1274'), + '0.9.2342.19200300.100.4.21': ('0.9.2342.19200300.100.4.21', OID_OBJECT_CLASS, 'pilotDSA', 'RFC1274'), + '0.9.2342.19200300.100.4.22': ('0.9.2342.19200300.100.4.22', OID_OBJECT_CLASS, 'qualityLabelledData', 'RFC1274'), + '1.2.840.113556.1.5.87': ('1.2.840.113556.1.5.87', OID_OBJECT_CLASS, 'calEntry', 'RFC2739'), + '1.3.18.0.2.6.253': ('1.3.18.0.2.6.253', OID_OBJECT_CLASS, 'printerLPR', 'RFC3712'), + '1.3.18.0.2.6.254': ('1.3.18.0.2.6.254', OID_OBJECT_CLASS, 'slpServicePrinter', 'RFC3712'), + '1.3.18.0.2.6.255': ('1.3.18.0.2.6.255', OID_OBJECT_CLASS, 'printerService', 'RFC3712'), + '1.3.18.0.2.6.256': ('1.3.18.0.2.6.256', OID_OBJECT_CLASS, 'printerIPP', 'RFC3712'), + '1.3.18.0.2.6.257': ('1.3.18.0.2.6.257', OID_OBJECT_CLASS, 'printerServiceAuxClass', 'RFC3712'), + '1.3.18.0.2.6.258': ('1.3.18.0.2.6.258', OID_OBJECT_CLASS, 'printerAbstract', 'RFC3712'), + '1.3.6.1.1.10.6.1': ('1.3.6.1.1.10.6.1', OID_OBJECT_CLASS, 'uddiBusinessEntity', 'RFC4403'), + '1.3.6.1.1.10.6.2': ('1.3.6.1.1.10.6.2', OID_OBJECT_CLASS, 'uddiContact', 'RFC4403'), + '1.3.6.1.1.10.6.3': ('1.3.6.1.1.10.6.3', OID_OBJECT_CLASS, 'uddiAddress', 'RFC4403'), + '1.3.6.1.1.10.6.4': ('1.3.6.1.1.10.6.4', OID_OBJECT_CLASS, 'uddiBusinessService', 'RFC4403'), + '1.3.6.1.1.10.6.5': ('1.3.6.1.1.10.6.5', OID_OBJECT_CLASS, 'uddiBindingTemplate', 'RFC4403'), + '1.3.6.1.1.10.6.6': ('1.3.6.1.1.10.6.6', OID_OBJECT_CLASS, 'uddiTModelInstanceInfo', 'RFC4403'), + '1.3.6.1.1.10.6.7': ('1.3.6.1.1.10.6.7', OID_OBJECT_CLASS, 'uddiTModel', 'RFC4403'), + '1.3.6.1.1.10.6.8': ('1.3.6.1.1.10.6.8', OID_OBJECT_CLASS, 'uddiPublisherAssertion', 'RFC4403'), + '1.3.6.1.1.10.6.9': ('1.3.6.1.1.10.6.9', OID_OBJECT_CLASS, 'uddiv3Subscription', 'RFC4403'), + '1.3.6.1.1.10.6.10': ('1.3.6.1.1.10.6.10', OID_OBJECT_CLASS, 'uddiv3EntityObituary', 'RFC4403'), + '1.3.6.1.1.11.1.1': ('1.3.6.1.1.11.1.1', OID_OBJECT_CLASS, 'vPIMUser', 'RFC4237'), + '1.3.6.1.1.3.1': ('1.3.6.1.1.3.1', OID_OBJECT_CLASS, 'uidObject', 'RFC4519'), + '1.3.6.1.1.6.1.1': ('1.3.6.1.1.6.1.1', OID_OBJECT_CLASS, 'pcimPolicy', 'RFC3703'), + '1.3.6.1.1.6.1.2': ('1.3.6.1.1.6.1.2', OID_OBJECT_CLASS, 'pcimGroup', 'RFC3703'), + '1.3.6.1.1.6.1.3': ('1.3.6.1.1.6.1.3', OID_OBJECT_CLASS, 'pcimGroupAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.4': ('1.3.6.1.1.6.1.4', OID_OBJECT_CLASS, 'pcimGroupInstance', 'RFC3703'), + '1.3.6.1.1.6.1.5': ('1.3.6.1.1.6.1.5', OID_OBJECT_CLASS, 'pcimRule', 'RFC3703'), + '1.3.6.1.1.6.1.6': ('1.3.6.1.1.6.1.6', OID_OBJECT_CLASS, 'pcimRuleAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.7': ('1.3.6.1.1.6.1.7', OID_OBJECT_CLASS, 'pcimRuleInstance', 'RFC3703'), + '1.3.6.1.1.6.1.8': ('1.3.6.1.1.6.1.8', OID_OBJECT_CLASS, 'pcimRuleConditionAssociation', 'RFC3703'), + '1.3.6.1.1.6.1.9': ('1.3.6.1.1.6.1.9', OID_OBJECT_CLASS, 'pcimRuleValidityAssociation', 'RFC3703'), + '1.3.6.1.1.6.1.10': ('1.3.6.1.1.6.1.10', OID_OBJECT_CLASS, 'pcimRuleActionAssociation', 'RFC3703'), + '1.3.6.1.1.6.1.11': ('1.3.6.1.1.6.1.11', OID_OBJECT_CLASS, 'pcimConditionAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.12': ('1.3.6.1.1.6.1.12', OID_OBJECT_CLASS, 'pcimTPCAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.13': ('1.3.6.1.1.6.1.13', OID_OBJECT_CLASS, 'pcimConditionVendorAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.14': ('1.3.6.1.1.6.1.14', OID_OBJECT_CLASS, 'pcimActionAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.15': ('1.3.6.1.1.6.1.15', OID_OBJECT_CLASS, 'pcimActionVendorAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.16': ('1.3.6.1.1.6.1.16', OID_OBJECT_CLASS, 'pcimPolicyInstance', 'RFC3703'), + '1.3.6.1.1.6.1.17': ('1.3.6.1.1.6.1.17', OID_OBJECT_CLASS, 'pcimElementAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.18': ('1.3.6.1.1.6.1.18', OID_OBJECT_CLASS, 'pcimRepository', 'RFC3703'), + '1.3.6.1.1.6.1.19': ('1.3.6.1.1.6.1.19', OID_OBJECT_CLASS, 'pcimRepositoryAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.20': ('1.3.6.1.1.6.1.20', OID_OBJECT_CLASS, 'pcimRepositoryInstance', 'RFC3703'), + '1.3.6.1.1.6.1.21': ('1.3.6.1.1.6.1.21', OID_OBJECT_CLASS, 'pcimSubtreesPtrAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.22': ('1.3.6.1.1.6.1.22', OID_OBJECT_CLASS, 'pcimGroupContainmentAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.23': ('1.3.6.1.1.6.1.23', OID_OBJECT_CLASS, 'pcimRuleContainmentAuxClass', 'RFC3703'), + '1.3.6.1.1.9.1.1': ('1.3.6.1.1.9.1.1', OID_OBJECT_CLASS, 'pcelsPolicySet', 'RFC4104'), + '1.3.6.1.1.9.1.2': ('1.3.6.1.1.9.1.2', OID_OBJECT_CLASS, 'pcelsPolicySetAssociation', 'RFC4104'), + '1.3.6.1.1.9.1.3': ('1.3.6.1.1.9.1.3', OID_OBJECT_CLASS, 'pcelsGroup', 'RFC4104'), + '1.3.6.1.1.9.1.4': ('1.3.6.1.1.9.1.4', OID_OBJECT_CLASS, 'pcelsGroupAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.5': ('1.3.6.1.1.9.1.5', OID_OBJECT_CLASS, 'pcelsGroupInstance', 'RFC4104'), + '1.3.6.1.1.9.1.6': ('1.3.6.1.1.9.1.6', OID_OBJECT_CLASS, 'pcelsRule', 'RFC4104'), + '1.3.6.1.1.9.1.7': ('1.3.6.1.1.9.1.7', OID_OBJECT_CLASS, 'pcelsRuleAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.8': ('1.3.6.1.1.9.1.8', OID_OBJECT_CLASS, 'pcelsRuleInstance', 'RFC4104'), + '1.3.6.1.1.9.1.9': ('1.3.6.1.1.9.1.9', OID_OBJECT_CLASS, 'pcelsConditionAssociation', 'RFC4104'), + '1.3.6.1.1.9.1.10': ('1.3.6.1.1.9.1.10', OID_OBJECT_CLASS, 'pcelsActionAssociation', 'RFC4104'), + '1.3.6.1.1.9.1.11': ('1.3.6.1.1.9.1.11', OID_OBJECT_CLASS, 'pcelsSimpleConditionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.12': ('1.3.6.1.1.9.1.12', OID_OBJECT_CLASS, 'pcelsCompoundConditionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.13': ('1.3.6.1.1.9.1.13', OID_OBJECT_CLASS, 'pcelsCompoundFilterConditionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.14': ('1.3.6.1.1.9.1.14', OID_OBJECT_CLASS, 'pcelsSimpleActionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.15': ('1.3.6.1.1.9.1.15', OID_OBJECT_CLASS, 'pcelsCompoundActionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.16': ('1.3.6.1.1.9.1.16', OID_OBJECT_CLASS, 'pcelsVariable', 'RFC4104'), + '1.3.6.1.1.9.1.17': ('1.3.6.1.1.9.1.17', OID_OBJECT_CLASS, 'pcelsExplicitVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.18': ('1.3.6.1.1.9.1.18', OID_OBJECT_CLASS, 'pcelsImplicitVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.19': ('1.3.6.1.1.9.1.19', OID_OBJECT_CLASS, 'pcelsSourceIPv4VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.20': ('1.3.6.1.1.9.1.20', OID_OBJECT_CLASS, 'pcelsSourceIPv6VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.21': ('1.3.6.1.1.9.1.21', OID_OBJECT_CLASS, 'pcelsDestinationIPv4VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.22': ('1.3.6.1.1.9.1.22', OID_OBJECT_CLASS, 'pcelsDestinationIPv6VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.23': ('1.3.6.1.1.9.1.23', OID_OBJECT_CLASS, 'pcelsSourcePortVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.24': ('1.3.6.1.1.9.1.24', OID_OBJECT_CLASS, 'pcelsDestinationPortVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.25': ('1.3.6.1.1.9.1.25', OID_OBJECT_CLASS, 'pcelsIPProtocolVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.26': ('1.3.6.1.1.9.1.26', OID_OBJECT_CLASS, 'pcelsIPVersionVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.27': ('1.3.6.1.1.9.1.27', OID_OBJECT_CLASS, 'pcelsIPToSVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.28': ('1.3.6.1.1.9.1.28', OID_OBJECT_CLASS, 'pcelsDSCPVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.29': ('1.3.6.1.1.9.1.29', OID_OBJECT_CLASS, 'pcelsFlowIdVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.30': ('1.3.6.1.1.9.1.30', OID_OBJECT_CLASS, 'pcelsSourceMACVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.31': ('1.3.6.1.1.9.1.31', OID_OBJECT_CLASS, 'pcelsDestinationMACVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.32': ('1.3.6.1.1.9.1.32', OID_OBJECT_CLASS, 'pcelsVLANVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.33': ('1.3.6.1.1.9.1.33', OID_OBJECT_CLASS, 'pcelsCoSVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.34': ('1.3.6.1.1.9.1.34', OID_OBJECT_CLASS, 'pcelsEthertypeVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.35': ('1.3.6.1.1.9.1.35', OID_OBJECT_CLASS, 'pcelsSourceSAPVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.36': ('1.3.6.1.1.9.1.36', OID_OBJECT_CLASS, 'pcelsDestinationSAPVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.37': ('1.3.6.1.1.9.1.37', OID_OBJECT_CLASS, 'pcelsSNAPOUIVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.38': ('1.3.6.1.1.9.1.38', OID_OBJECT_CLASS, 'pcelsSNAPTypeVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.39': ('1.3.6.1.1.9.1.39', OID_OBJECT_CLASS, 'pcelsFlowDirectionVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.40': ('1.3.6.1.1.9.1.40', OID_OBJECT_CLASS, 'pcelsValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.41': ('1.3.6.1.1.9.1.41', OID_OBJECT_CLASS, 'pcelsIPv4AddrValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.42': ('1.3.6.1.1.9.1.42', OID_OBJECT_CLASS, 'pcelsIPv6AddrValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.43': ('1.3.6.1.1.9.1.43', OID_OBJECT_CLASS, 'pcelsMACAddrValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.44': ('1.3.6.1.1.9.1.44', OID_OBJECT_CLASS, 'pcelsStringValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.45': ('1.3.6.1.1.9.1.45', OID_OBJECT_CLASS, 'pcelsBitStringValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.46': ('1.3.6.1.1.9.1.46', OID_OBJECT_CLASS, 'pcelsIntegerValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.47': ('1.3.6.1.1.9.1.47', OID_OBJECT_CLASS, 'pcelsBooleanValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.48': ('1.3.6.1.1.9.1.48', OID_OBJECT_CLASS, 'pcelsReusableContainer', 'RFC4104'), + '1.3.6.1.1.9.1.49': ('1.3.6.1.1.9.1.49', OID_OBJECT_CLASS, 'pcelsReusableContainerAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.50': ('1.3.6.1.1.9.1.50', OID_OBJECT_CLASS, 'pcelsReusableContainerInstance', 'RFC4104'), + '1.3.6.1.1.9.1.51': ('1.3.6.1.1.9.1.51', OID_OBJECT_CLASS, 'pcelsRoleCollection', 'RFC4104'), + '1.3.6.1.1.9.1.52': ('1.3.6.1.1.9.1.52', OID_OBJECT_CLASS, 'pcelsFilterEntryBase', 'RFC4104'), + '1.3.6.1.1.9.1.53': ('1.3.6.1.1.9.1.53', OID_OBJECT_CLASS, 'pcelsIPHeadersFilter', 'RFC4104'), + '1.3.6.1.1.9.1.54': ('1.3.6.1.1.9.1.54', OID_OBJECT_CLASS, 'pcels8021Filter', 'RFC4104'), + '1.3.6.1.1.9.1.55': ('1.3.6.1.1.9.1.55', OID_OBJECT_CLASS, 'pcelsFilterListAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.56': ('1.3.6.1.1.9.1.56', OID_OBJECT_CLASS, 'pcelsVendorVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.57': ('1.3.6.1.1.9.1.57', OID_OBJECT_CLASS, 'pcelsVendorValueAuxClass', 'RFC4104'), + '1.3.6.1.4.1.11.1.3.1.2.5': ('1.3.6.1.4.1.11.1.3.1.2.5', OID_OBJECT_CLASS, 'DUAConfigProfile', 'RFC4876'), + '1.3.6.1.4.1.1466.101.119.2': ('1.3.6.1.4.1.1466.101.119.2', OID_OBJECT_CLASS, 'dynamicObject', 'RFC2589'), + '1.3.6.1.4.1.1466.101.120.111': ('1.3.6.1.4.1.1466.101.120.111', OID_OBJECT_CLASS, 'extensibleObject', 'RFC4512'), + '1.3.6.1.4.1.1466.344': ('1.3.6.1.4.1.1466.344', OID_OBJECT_CLASS, 'dcObject', 'RFC4519'), + '1.3.6.1.4.1.16572.2.1.1': ('1.3.6.1.4.1.16572.2.1.1', OID_OBJECT_CLASS, 'LDIFLocationURLObject', 'RFC6109'), + '1.3.6.1.4.1.16572.2.1.2': ('1.3.6.1.4.1.16572.2.1.2', OID_OBJECT_CLASS, 'provider', 'RFC6109'), + '1.3.6.1.4.1.250.3.15': ('1.3.6.1.4.1.250.3.15', OID_OBJECT_CLASS, 'labeledURIObject', 'RFC2079'), + '1.3.6.1.4.1.31103.1.1001': ('1.3.6.1.4.1.31103.1.1001', OID_OBJECT_CLASS, 'fedfsNsdbContainerInfo', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.1002': ('1.3.6.1.4.1.31103.1.1002', OID_OBJECT_CLASS, 'fedfsFsn', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.1003': ('1.3.6.1.4.1.31103.1.1003', OID_OBJECT_CLASS, 'fedfsFsl', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.1004': ('1.3.6.1.4.1.31103.1.1004', OID_OBJECT_CLASS, 'fedfsNfsFsl', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.453.7.1.1': ('1.3.6.1.4.1.453.7.1.1', OID_OBJECT_CLASS, ['rFC822ToX400Mapping', 'subtree'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.2': ('1.3.6.1.4.1.453.7.1.2', OID_OBJECT_CLASS, ['x400ToRFC822Mapping', 'table'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.3': ('1.3.6.1.4.1.453.7.1.3', OID_OBJECT_CLASS, ['omittedORAddressComponent', 'tableEntry'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.4': ('1.3.6.1.4.1.453.7.1.4', OID_OBJECT_CLASS, ['mixerGateway', 'textTableEntry'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.5': ('1.3.6.1.4.1.453.7.1.5', OID_OBJECT_CLASS, 'distinguishedNameTableEntry', 'RFC2293'), + '2.16.840.1.113730.3.2.6': ('2.16.840.1.113730.3.2.6', OID_OBJECT_CLASS, 'referral', 'RFC3296'), + '2.5.17.0': ('2.5.17.0', OID_OBJECT_CLASS, 'subentry', 'RFC3672'), + '2.5.20.1': ('2.5.20.1', OID_OBJECT_CLASS, 'subschema', 'RFC4512'), + '2.5.20.2': ('2.5.20.2', OID_OBJECT_CLASS, 'collectiveAttributeSubentry', 'RFC3671'), + '2.5.6.0': ('2.5.6.0', OID_OBJECT_CLASS, 'top', 'RFC4512'), + '2.5.6.1': ('2.5.6.1', OID_OBJECT_CLASS, 'alias', 'RFC4512'), + '2.5.6.2': ('2.5.6.2', OID_OBJECT_CLASS, 'country', 'RFC4519'), + '2.5.6.3': ('2.5.6.3', OID_OBJECT_CLASS, 'locality', 'RFC4519'), + '2.5.6.4': ('2.5.6.4', OID_OBJECT_CLASS, 'organization', 'RFC4519'), + '2.5.6.5': ('2.5.6.5', OID_OBJECT_CLASS, 'organizationalUnit', 'RFC4519'), + '2.5.6.6': ('2.5.6.6', OID_OBJECT_CLASS, 'person', 'RFC4519'), + '2.5.6.7': ('2.5.6.7', OID_OBJECT_CLASS, 'organizationalPerson', 'RFC4519'), + '2.5.6.8': ('2.5.6.8', OID_OBJECT_CLASS, 'organizationalRole', 'RFC4519'), + '2.5.6.9': ('2.5.6.9', OID_OBJECT_CLASS, 'groupOfNames', 'RFC4519'), + '2.5.6.10': ('2.5.6.10', OID_OBJECT_CLASS, 'residentialPerson', 'RFC4519'), + '2.5.6.11': ('2.5.6.11', OID_OBJECT_CLASS, 'applicationProcess', 'RFC4519'), + '2.5.6.12': ('2.5.6.12', OID_OBJECT_CLASS, 'applicationEntity', 'RFC2256'), + '2.5.6.13': ('2.5.6.13', OID_OBJECT_CLASS, 'dSA', 'RFC2256'), + '2.5.6.14': ('2.5.6.14', OID_OBJECT_CLASS, 'device', 'RFC4519'), + '2.5.6.15': ('2.5.6.15', OID_OBJECT_CLASS, 'strongAuthenticationUser', 'RFC4523'), + '2.5.6.16': ('2.5.6.16', OID_OBJECT_CLASS, 'certificationAuthority', 'RFC4523'), + '2.5.6.16.2': ('2.5.6.16.2', OID_OBJECT_CLASS, 'certificationAuthority-V2', 'RFC4523'), + '2.5.6.17': ('2.5.6.17', OID_OBJECT_CLASS, 'groupOfUniqueNames', 'RFC4519'), + '2.5.6.18': ('2.5.6.18', OID_OBJECT_CLASS, 'userSecurityInformation', 'RFC4523'), + '2.5.6.19': ('2.5.6.19', OID_OBJECT_CLASS, 'cRLDistributionPoint', 'RFC4523'), + '2.5.6.20': ('2.5.6.20', OID_OBJECT_CLASS, 'dmd', 'RFC2256'), + '2.5.6.21': ('2.5.6.21', OID_OBJECT_CLASS, 'pkiUser', 'RFC4523'), + '2.5.6.22': ('2.5.6.22', OID_OBJECT_CLASS, 'pkiCA', 'RFC4523'), + '2.5.6.23': ('2.5.6.23', OID_OBJECT_CLASS, 'deltaCRL', 'RFC4523'), + + # unsolicited notices + '1.3.6.1.1.21.4': ('1.3.6.1.1.21.4', OID_UNSOLICITED_NOTICE, 'Aborted Transaction Notice', 'RFC5805'), '1.3.6.1.4.1.1466.20036': ('1.3.6.1.4.1.1466.20036', OID_UNSOLICITED_NOTICE, 'Notice of Disconnection', 'RFC4511')} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/persistentSearch.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/persistentSearch.py new file mode 100644 index 0000000..cb79aa2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/persistentSearch.py @@ -0,0 +1,85 @@ +""" +""" + +# Created on 2016.07.09 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.namedtype import NamedTypes, NamedType, OptionalNamedType +from pyasn1.type.namedval import NamedValues +from pyasn1.type.univ import Sequence, Integer, Boolean, Enumerated +from .rfc4511 import LDAPDN +from .controls import build_control + + +class PersistentSearchControl(Sequence): + # PersistentSearch ::= SEQUENCE { + # changeTypes INTEGER, + # changesOnly BOOLEAN, + # returnECs BOOLEAN + # } + + componentType = NamedTypes(NamedType('changeTypes', Integer()), + NamedType('changesOnly', Boolean()), + NamedType('returnECs', Boolean()) + ) + + +class ChangeType(Enumerated): + # changeType ENUMERATED { + # add (1), + # delete (2), + # modify (4), + # modDN (8) + # } + + namedValues = NamedValues(('add', 1), + ('delete', 2), + ('modify', 4), + ('modDN', 8)) + + +class EntryChangeNotificationControl(Sequence): + # EntryChangeNotification ::= SEQUENCE { + # changeType ENUMERATED { + # add (1), + # delete (2), + # modify (4), + # modDN (8) + # }, + # previousDN LDAPDN OPTIONAL, -- modifyDN ops. only + # changeNumber INTEGER OPTIONAL -- if supported + # } + + # tagSet = TagSet() + # tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatConstructed, 16)) + componentType = NamedTypes(NamedType('changeType', ChangeType()), + OptionalNamedType('previousDN', LDAPDN()), + OptionalNamedType('changeNumber', Integer()) + ) + + +def persistent_search_control(change_types, changes_only=True, return_ecs=True, criticality=False): + control_value = PersistentSearchControl() + control_value.setComponentByName('changeTypes', Integer(change_types)) + control_value.setComponentByName('changesOnly', Boolean(changes_only)) + control_value.setComponentByName('returnECs', Boolean(return_ecs)) + return build_control('2.16.840.1.113730.3.4.3', criticality, control_value) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2696.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2696.py new file mode 100644 index 0000000..66b647b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2696.py @@ -0,0 +1,70 @@ +""" +""" + +# Created on 2013.10.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString, Integer, Sequence +from pyasn1.type.namedtype import NamedTypes, NamedType +from pyasn1.type.constraint import ValueRangeConstraint +from .controls import build_control + +# constants +# maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- + +MAXINT = Integer(2147483647) + +# constraints +rangeInt0ToMaxConstraint = ValueRangeConstraint(0, MAXINT) + + +class Integer0ToMax(Integer): + subtypeSpec = Integer.subtypeSpec + rangeInt0ToMaxConstraint + + +class Size(Integer0ToMax): + # Size INTEGER (0..maxInt) + pass + + +class Cookie(OctetString): + # cookie OCTET STRING + pass + + +class RealSearchControlValue(Sequence): + # realSearchControlValue ::= SEQUENCE { + # size INTEGER (0..maxInt), + # -- requested page size from client + # -- result set size estimate from server + # cookie OCTET STRING + + componentType = NamedTypes(NamedType('size', Size()), + NamedType('cookie', Cookie())) + + +def paged_search_control(criticality=False, size=10, cookie=None): + control_value = RealSearchControlValue() + control_value.setComponentByName('size', Size(size)) + control_value.setComponentByName('cookie', Cookie(cookie if cookie else '')) + + return build_control('1.2.840.113556.1.4.319', criticality, control_value) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2849.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2849.py new file mode 100644 index 0000000..01d7e05 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc2849.py @@ -0,0 +1,295 @@ +""" +""" + +# Created on 2013.12.08 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from base64 import b64encode +from datetime import datetime + +from .. import STRING_TYPES +from ..core.exceptions import LDAPLDIFError, LDAPExtensionError +from ..protocol.persistentSearch import EntryChangeNotificationControl +from ..utils.asn1 import decoder +from ..utils.config import get_config_parameter + +# LDIF converter RFC 2849 compliant + +conf_ldif_line_length = get_config_parameter('LDIF_LINE_LENGTH') + + +def safe_ldif_string(bytes_value): + if not bytes_value: + return True + + # check SAFE-INIT-CHAR: < 127, not NUL, LF, CR, SPACE, COLON, LESS-THAN + if bytes_value[0] > 127 or bytes_value[0] in [0, 10, 13, 32, 58, 60]: + return False + + # check SAFE-CHAR: < 127 not NUL, LF, CR + if 0 in bytes_value or 10 in bytes_value or 13 in bytes_value: + return False + + # check last char for SPACE + if bytes_value[-1] == 32: + return False + + for byte in bytes_value: + if byte > 127: + return False + + return True + + +def _convert_to_ldif(descriptor, value, base64): + if not value: + value = '' + if isinstance(value, STRING_TYPES): + value = bytearray(value, encoding='utf-8') + + if base64 or not safe_ldif_string(value): + try: + encoded = b64encode(value) + except TypeError: + encoded = b64encode(str(value)) # patch for Python 2.6 + if not isinstance(encoded, str): # in Python 3 b64encode returns bytes in Python 2 returns str + encoded = str(encoded, encoding='ascii') # Python 3 + line = descriptor + ':: ' + encoded + else: + if str is not bytes: # Python 3 + value = str(value, encoding='ascii') + else: # Python 2 + value = str(value) + line = descriptor + ': ' + value + + return line + + +def add_controls(controls, all_base64): + lines = [] + if controls: + for control in controls: + line = 'control: ' + control[0] + line += ' ' + ('true' if control[1] else 'false') + if control[2]: + lines.append(_convert_to_ldif(line, control[2], all_base64)) + + return lines + + +def add_attributes(attributes, all_base64): + lines = [] + oc_attr = None + # objectclass first, even if this is not specified in the RFC + for attr in attributes: + if attr.lower() == 'objectclass': + for val in attributes[attr]: + lines.append(_convert_to_ldif(attr, val, all_base64)) + oc_attr = attr + break + + # remaining attributes + for attr in attributes: + if attr != oc_attr and attr in attributes: + for val in attributes[attr]: + lines.append(_convert_to_ldif(attr, val, all_base64)) + + return lines + + +def sort_ldif_lines(lines, sort_order): + # sort lines as per custom sort_order + # sort order is a list of descriptors, lines will be sorted following the same sequence + return sorted(lines, key=lambda x: ldif_sort(x, sort_order)) if sort_order else lines + + +def search_response_to_ldif(entries, all_base64, sort_order=None): + lines = [] + if entries: + for entry in entries: + if not entry or entry['type'] != 'searchResEntry': + continue + if 'dn' in entry: + lines.append(_convert_to_ldif('dn', entry['dn'], all_base64)) + lines.extend(add_attributes(entry['raw_attributes'], all_base64)) + else: + raise LDAPLDIFError('unable to convert to LDIF-CONTENT - missing DN') + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + lines.append('') + + if lines: + lines.append('# total number of entries: ' + str(len(entries))) + + return lines + + +def add_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: add') + lines.extend(add_attributes(entry['attributes'], all_base64)) + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + + else: + raise LDAPLDIFError('unable to convert to LDIF-CHANGE-ADD - missing DN ') + + return lines + + +def delete_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: delete') + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + else: + raise LDAPLDIFError('unable to convert to LDIF-CHANGE-DELETE - missing DN ') + + return lines + + +def modify_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: modify') + if 'changes' in entry: + for change in entry['changes']: + lines.append(['add', 'delete', 'replace', 'increment'][change['operation']] + ': ' + change['attribute']['type']) + for value in change['attribute']['value']: + lines.append(_convert_to_ldif(change['attribute']['type'], value, all_base64)) + lines.append('-') + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + return lines + + +def modify_dn_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: modrdn') if 'newSuperior' in entry and entry['newSuperior'] else lines.append('changetype: moddn') + lines.append(_convert_to_ldif('newrdn', entry['newRdn'], all_base64)) + lines.append('deleteoldrdn: ' + ('1' if entry['deleteOldRdn'] else '0')) + if 'newSuperior' in entry and entry['newSuperior']: + lines.append(_convert_to_ldif('newsuperior', entry['newSuperior'], all_base64)) + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + else: + raise LDAPLDIFError('unable to convert to LDIF-CHANGE-MODDN - missing DN ') + + return lines + + +def operation_to_ldif(operation_type, entries, all_base64=False, sort_order=None): + if operation_type == 'searchResponse': + lines = search_response_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'addRequest': + lines = add_request_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'delRequest': + lines = delete_request_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'modifyRequest': + lines = modify_request_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'modDNRequest': + lines = modify_dn_request_to_ldif(entries, all_base64, sort_order) + else: + lines = [] + + ldif_record = [] + # check max line length and split as per note 2 of RFC 2849 + for line in lines: + if line: + ldif_record.append(line[0:conf_ldif_line_length]) + ldif_record.extend([' ' + line[i: i + conf_ldif_line_length - 1] for i in range(conf_ldif_line_length, len(line), conf_ldif_line_length - 1)] if len(line) > conf_ldif_line_length else []) + else: + ldif_record.append('') + + return ldif_record + + +def add_ldif_header(ldif_lines): + if ldif_lines: + ldif_lines.insert(0, 'version: 1') + + return ldif_lines + + +def ldif_sort(line, sort_order): + for i, descriptor in enumerate(sort_order): + + if line and line.startswith(descriptor): + return i + + return len(sort_order) + 1 + + +def decode_persistent_search_control(change): + if 'controls' in change and '2.16.840.1.113730.3.4.7' in change['controls']: + decoded = dict() + decoded_control, unprocessed = decoder.decode(change['controls']['2.16.840.1.113730.3.4.7']['value'], asn1Spec=EntryChangeNotificationControl()) + if unprocessed: + raise LDAPExtensionError('unprocessed value in EntryChangeNotificationControl') + if decoded_control['changeType'] == 1: # add + decoded['changeType'] = 'add' + elif decoded_control['changeType'] == 2: # delete + decoded['changeType'] = 'delete' + elif decoded_control['changeType'] == 4: # modify + decoded['changeType'] = 'modify' + elif decoded_control['changeType'] == 8: # modify_dn + decoded['changeType'] = 'modify dn' + else: + raise LDAPExtensionError('unknown Persistent Search changeType ' + str(decoded_control['changeType'])) + decoded['changeNumber'] = decoded_control['changeNumber'] if 'changeNumber' in decoded_control and decoded_control['changeNumber'] is not None and decoded_control['changeNumber'].hasValue() else None + decoded['previousDN'] = decoded_control['previousDN'] if 'previousDN' in decoded_control and decoded_control['previousDN'] is not None and decoded_control['previousDN'].hasValue() else None + return decoded + + return None + + +def persistent_search_response_to_ldif(change): + ldif_lines = ['# ' + datetime.now().isoformat()] + control = decode_persistent_search_control(change) + if control: + if control['changeNumber']: + ldif_lines.append('# change number: ' + str(control['changeNumber'])) + ldif_lines.append(control['changeType']) + if control['previousDN']: + ldif_lines.append('# previous dn: ' + str(control['previousDN'])) + ldif_lines += operation_to_ldif('searchResponse', [change]) + + return ldif_lines[:-1] # removes "total number of entries" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc3062.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc3062.py new file mode 100644 index 0000000..c720984 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc3062.py @@ -0,0 +1,91 @@ +""" +""" + +# Created on 2014.04.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString, Sequence +from pyasn1.type.namedtype import NamedTypes, OptionalNamedType +from pyasn1.type.tag import Tag, tagClassContext, tagFormatSimple + +# Modify password extended operation +# passwdModifyOID OBJECT IDENTIFIER ::= 1.3.6.1.4.1.4203.1.11.1 +# PasswdModifyRequestValue ::= SEQUENCE { +# userIdentity [0] OCTET STRING OPTIONAL +# oldPasswd [1] OCTET STRING OPTIONAL +# newPasswd [2] OCTET STRING OPTIONAL } +# +# PasswdModifyResponseValue ::= SEQUENCE { +# genPasswd [0] OCTET STRING OPTIONAL } + + +class UserIdentity(OctetString): + """ + userIdentity [0] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + encoding = 'utf-8' + + +class OldPasswd(OctetString): + """ + oldPasswd [1] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + encoding = 'utf-8' + + +class NewPasswd(OctetString): + """ + newPasswd [2] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 2)) + encoding = 'utf-8' + + +class GenPasswd(OctetString): + """ + newPasswd [2] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + encoding = 'utf-8' + + +class PasswdModifyRequestValue(Sequence): + """ + PasswdModifyRequestValue ::= SEQUENCE { + userIdentity [0] OCTET STRING OPTIONAL + oldPasswd [1] OCTET STRING OPTIONAL + newPasswd [2] OCTET STRING OPTIONAL } + """ + componentType = NamedTypes(OptionalNamedType('userIdentity', UserIdentity()), + OptionalNamedType('oldPasswd', OldPasswd()), + OptionalNamedType('newPasswd', NewPasswd())) + + +class PasswdModifyResponseValue(Sequence): + """ + PasswdModifyResponseValue ::= SEQUENCE { + genPasswd [0] OCTET STRING OPTIONAL } + """ + + componentType = NamedTypes(OptionalNamedType('genPasswd', GenPasswd())) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4511.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4511.py new file mode 100644 index 0000000..07f67be --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4511.py @@ -0,0 +1,1007 @@ +""" +""" + +# Created on 2013.05.15 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +####################### +# ldap ASN.1 Definition +# from RFC4511 - Appendix B +# extended with result codes from IANA ldap-parameters as of 2013.08.21 +# extended with modify_increment from RFC4525 + +######################################################### +# Lightweight-Directory-Access-Protocol-V3 {1 3 6 1 1 18} +# -- Copyright (C) The Internet Society (2006). This version of +# -- this ASN.1 module is part of RFC 4511; see the RFC itself +# -- for full legal notices. +# DEFINITIONS +# IMPLICIT TAGS +# EXTENSIBILITY IMPLIED + +from pyasn1.type.univ import OctetString, Integer, Sequence, Choice, SequenceOf, Boolean, Null, Enumerated, SetOf +from pyasn1.type.namedtype import NamedTypes, NamedType, OptionalNamedType, DefaultedNamedType +from pyasn1.type.constraint import ValueRangeConstraint, SingleValueConstraint, ValueSizeConstraint +from pyasn1.type.namedval import NamedValues +from pyasn1.type.tag import tagClassApplication, tagFormatConstructed, Tag, tagClassContext, tagFormatSimple + + +# constants +# maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- +LDAP_MAX_INT = 2147483647 +MAXINT = Integer(LDAP_MAX_INT) + +# constraints +rangeInt0ToMaxConstraint = ValueRangeConstraint(0, MAXINT) +rangeInt1To127Constraint = ValueRangeConstraint(1, 127) +size1ToMaxConstraint = ValueSizeConstraint(1, MAXINT) +responseValueConstraint = SingleValueConstraint(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 32, 33, 34, 36, 48, 49, 50, 51, 52, 53, 54, 64, 65, 66, 67, 68, 69, 71, 80, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 4096) + +# custom constraints +numericOIDConstraint = None # TODO +distinguishedNameConstraint = None # TODO +nameComponentConstraint = None # TODO +attributeDescriptionConstraint = None # TODO +uriConstraint = None # TODO +attributeSelectorConstraint = None # TODO + + +class Integer0ToMax(Integer): + subtypeSpec = Integer.subtypeSpec + rangeInt0ToMaxConstraint + + +class LDAPString(OctetString): + # LDAPString ::= OCTET STRING -- UTF-8 encoded, -- [ISO10646] characters + encoding = 'utf-8' + + +class MessageID(Integer0ToMax): + # MessageID ::= INTEGER (0 .. maxInt) + pass + + +class LDAPOID(OctetString): + # LDAPOID ::= OCTET STRING -- Constrained to + # -- [RFC4512] + + # subtypeSpec = numericOIDConstraint + pass + + +class LDAPDN(LDAPString): + # LDAPDN ::= LDAPString -- Constrained to + # -- [RFC4514] + + # subtypeSpec = distinguishedName + pass + + +class RelativeLDAPDN(LDAPString): + # RelativeLDAPDN ::= LDAPString -- Constrained to + # -- [RFC4514] + + # subtypeSpec = LDAPString.subtypeSpec + nameComponentConstraint + pass + + +class AttributeDescription(LDAPString): + # AttributeDescription ::= LDAPString -- Constrained to + # -- [RFC4512] + + # subtypeSpec = LDAPString.subtypeSpec + attributeDescriptionConstraint + pass + + +class AttributeValue(OctetString): + # AttributeValue ::= OCTET STRING + encoding = 'utf-8' + + +class AssertionValue(OctetString): + # AssertionValue ::= OCTET STRING + encoding = 'utf-8' + + +class AttributeValueAssertion(Sequence): + # AttributeValueAssertion ::= SEQUENCE { + # attributeDesc AttributeDescription, + # assertionValue AssertionValue } + componentType = NamedTypes(NamedType('attributeDesc', AttributeDescription()), + NamedType('assertionValue', AssertionValue())) + + +class MatchingRuleId(LDAPString): + # MatchingRuleId ::= LDAPString + pass + + +class Vals(SetOf): + # vals SET OF value AttributeValue } + componentType = AttributeValue() + + +class ValsAtLeast1(SetOf): + # vals SET OF value AttributeValue } + componentType = AttributeValue() + subtypeSpec = SetOf.subtypeSpec + size1ToMaxConstraint + + +class PartialAttribute(Sequence): + # PartialAttribute ::= SEQUENCE { + # type AttributeDescription, + # vals SET OF value AttributeValue } + componentType = NamedTypes(NamedType('type', AttributeDescription()), + NamedType('vals', Vals())) + + +class Attribute(Sequence): + # Attribute ::= PartialAttribute(WITH COMPONENTS { + # ..., + # vals (SIZE(1..MAX))}) + componentType = NamedTypes(NamedType('type', AttributeDescription()), + # NamedType('vals', ValsAtLeast1())) + NamedType('vals', Vals())) # changed from ValsAtLeast1() to allow empty member values in groups - this should not be as per rfc4511 4.1.7, but openldap accept it + + +class AttributeList(SequenceOf): + # AttributeList ::= SEQUENCE OF attribute Attribute + componentType = Attribute() + + +class Simple(OctetString): + # simple [0] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + encoding = 'utf-8' + + +class Credentials(OctetString): + # credentials OCTET STRING + encoding = 'utf-8' + + +class SaslCredentials(Sequence): + # SaslCredentials ::= SEQUENCE { + # mechanism LDAPString, + # credentials OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + componentType = NamedTypes(NamedType('mechanism', LDAPString()), + OptionalNamedType('credentials', Credentials())) + + +# not in RFC4511 but used by Microsoft to embed the NTLM protocol in the BindRequest (Sicily Protocol) +class SicilyPackageDiscovery(OctetString): + # sicilyPackageDiscovery [9] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 9)) + encoding = 'utf-8' + + +# not in RFC4511 but used by Microsoft to embed the NTLM protocol in the BindRequest (Sicily Protocol) +class SicilyNegotiate(OctetString): + # sicilyNegotiate [10] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 10)) + encoding = 'utf-8' + + +# not in RFC4511 but used by Microsoft to embed the NTLM protocol in the BindRequest (Sicily Protocol) +class SicilyResponse(OctetString): + # sicilyResponse [11] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 11)) + encoding = 'utf-8' + + +class AuthenticationChoice(Choice): + # AuthenticationChoice ::= CHOICE { + # simple [0] OCTET STRING, + # -- 1 and 2 reserved + # sasl [3] SaslCredentials, + # ... } + + # from https://msdn.microsoft.com/en-us/library/cc223498.aspx # legacy NTLM authentication for Windows Active Directory + # sicilyPackageDiscovery [9] OCTET STRING + # sicilyNegotiate [10] OCTET STRING + # sicilyResponse [11] OCTET STRING } + + componentType = NamedTypes(NamedType('simple', Simple()), + NamedType('sasl', SaslCredentials()), + NamedType('sicilyPackageDiscovery', SicilyPackageDiscovery()), + NamedType('sicilyNegotiate', SicilyNegotiate()), + NamedType('sicilyResponse', SicilyResponse()), + ) + + +class Version(Integer): + # version INTEGER (1 .. 127), + subtypeSpec = Integer.subtypeSpec + rangeInt1To127Constraint + + +class ResultCode(Enumerated): + # resultCode ENUMERATED { + # success (0), + # operationsError (1), + # protocolError (2), + # timeLimitExceeded (3), + # sizeLimitExceeded (4), + # compareFalse (5), + # compareTrue (6), + # authMethodNotSupported (7), + # strongerAuthRequired (8), + # -- 9 reserved -- + # referral (10), + # adminLimitExceeded (11), + # unavailableCriticalExtension (12), + # confidentialityRequired (13), + # saslBindInProgress (14), + # noSuchAttribute (16), + # undefinedAttributeType (17), + # inappropriateMatching (18), + # constraintViolation (19), + # attributeOrValueExists (20), + # invalidAttributeSyntax (21), + # -- 22-31 unused -- + # noSuchObject (32), + # aliasProblem (33), + # invalidDNSyntax (34), + # -- 35 reserved for undefined isLeaf -- + # aliasDereferencingProblem (36), + # -- 37-47 unused -- + # inappropriateAuthentication (48), + # invalidCredentials (49), + # insufficientAccessRights (50), + # busy (51), + # unavailable (52), + # unwillingToPerform (53), + # loopDetect (54), + # -- 55-63 unused -- + # namingViolation (64), + # objectClassViolation (65), + # notAllowedOnNonLeaf (66), + # notAllowedOnRDN (67), + # entryAlreadyExists (68), + # objectClassModsProhibited (69), + # -- 70 reserved for CLDAP -- + # affectsMultipleDSAs (71), + # -- 72-79 unused -- + # other (80), + # ... } + # + # from IANA ldap-parameters: + # lcupResourcesExhausted 113 IESG [RFC3928] + # lcupSecurityViolation 114 IESG [RFC3928] + # lcupInvalidData 115 IESG [RFC3928] + # lcupUnsupportedScheme 116 IESG [RFC3928] + # lcupReloadRequired 117 IESG [RFC3928] + # canceled 118 IESG [RFC3909] + # noSuchOperation 119 IESG [RFC3909] + # tooLate 120 IESG [RFC3909] + # cannotCancel 121 IESG [RFC3909] + # assertionFailed 122 IESG [RFC4528] + # authorizationDenied 123 WELTMAN [RFC4370] + # e-syncRefreshRequired 4096 [Kurt_Zeilenga] [Jong_Hyuk_Choi] [RFC4533] + namedValues = NamedValues(('success', 0), + ('operationsError', 1), + ('protocolError', 2), + ('timeLimitExceeded', 3), + ('sizeLimitExceeded', 4), + ('compareFalse', 5), + ('compareTrue', 6), + ('authMethodNotSupported', 7), + ('strongerAuthRequired', 8), + ('referral', 10), + ('adminLimitExceeded', 11), + ('unavailableCriticalExtension', 12), + ('confidentialityRequired', 13), + ('saslBindInProgress', 14), + ('noSuchAttribute', 16), + ('undefinedAttributeType', 17), + ('inappropriateMatching', 18), + ('constraintViolation', 19), + ('attributeOrValueExists', 20), + ('invalidAttributeSyntax', 21), + ('noSuchObject', 32), + ('aliasProblem', 33), + ('invalidDNSyntax', 34), + ('aliasDereferencingProblem', 36), + ('inappropriateAuthentication', 48), + ('invalidCredentials', 49), + ('insufficientAccessRights', 50), + ('busy', 51), + ('unavailable', 52), + ('unwillingToPerform', 53), + ('loopDetected', 54), + ('namingViolation', 64), + ('objectClassViolation', 65), + ('notAllowedOnNonLeaf', 66), + ('notAllowedOnRDN', 67), + ('entryAlreadyExists', 68), + ('objectClassModsProhibited', 69), + ('affectMultipleDSAs', 71), + ('other', 80), + ('lcupResourcesExhausted', 113), + ('lcupSecurityViolation', 114), + ('lcupInvalidData', 115), + ('lcupUnsupportedScheme', 116), + ('lcupReloadRequired', 117), + ('canceled', 118), + ('noSuchOperation', 119), + ('tooLate', 120), + ('cannotCancel', 121), + ('assertionFailed', 122), + ('authorizationDenied', 123), + ('e-syncRefreshRequired', 4096)) + + subTypeSpec = Enumerated.subtypeSpec + responseValueConstraint + + +class URI(LDAPString): + # URI ::= LDAPString -- limited to characters permitted in + # -- URIs + + # subtypeSpec = LDAPString.subTypeSpec + uriConstrain + pass + + +class Referral(SequenceOf): + # Referral ::= SEQUENCE SIZE (1..MAX) OF uri URI + tagSet = SequenceOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + componentType = URI() + + +class ServerSaslCreds(OctetString): + # serverSaslCreds [7] OCTET STRING OPTIONAL + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 7)) + encoding = 'utf-8' + + +class LDAPResult(Sequence): + # LDAPResult ::= SEQUENCE { + # resultCode ENUMERATED { + # success (0), + # operationsError (1), + # protocolError (2), + # timeLimitExceeded (3), + # sizeLimitExceeded (4), + # compareFalse (5), + # compareTrue (6), + # authMethodNotSupported (7), + # strongerAuthRequired (8), + # -- 9 reserved -- + # referral (10), + # adminLimitExceeded (11), + # unavailableCriticalExtension (12), + # confidentialityRequired (13), + # saslBindInProgress (14), + # noSuchAttribute (16), + # undefinedAttributeType (17), + # inappropriateMatching (18), + # constraintViolation (19), + # attributeOrValueExists (20), + # invalidAttributeSyntax (21), + # -- 22-31 unused -- + # noSuchObject (32), + # aliasProblem (33), + # invalidDNSyntax (34), + # -- 35 reserved for undefined isLeaf -- + # aliasDereferencingProblem (36), + # -- 37-47 unused -- + # inappropriateAuthentication (48), + # invalidCredentials (49), + # insufficientAccessRights (50), + # busy (51), + # unavailable (52), + # unwillingToPerform (53), + # loopDetect (54), + # -- 55-63 unused -- + # namingViolation (64), + # objectClassViolation (65), + # notAllowedOnNonLeaf (66), + # notAllowedOnRDN (67), + # entryAlreadyExists (68), + # objectClassModsProhibited (69), + # -- 70 reserved for CLDAP -- + # affectsMultipleDSAs (71), + # -- 72-79 unused -- + # other (80), + # ... }, + # matchedDN LDAPDN, + # diagnosticMessage LDAPString, + # referral [3] Referral OPTIONAL } + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('matchedDN', LDAPDN()), + NamedType('diagnosticMessage', LDAPString()), + OptionalNamedType('referral', Referral())) + + +class Criticality(Boolean): + # criticality BOOLEAN DEFAULT FALSE + defaultValue = False + + +class ControlValue(OctetString): + # controlValue OCTET STRING + encoding = 'utf-8' + + +class Control(Sequence): + # Control ::= SEQUENCE { + # controlType LDAPOID, + # criticality BOOLEAN DEFAULT FALSE, + # controlValue OCTET STRING OPTIONAL } + componentType = NamedTypes(NamedType('controlType', LDAPOID()), + DefaultedNamedType('criticality', Criticality()), + OptionalNamedType('controlValue', ControlValue())) + + +class Controls(SequenceOf): + # Controls ::= SEQUENCE OF control Control + tagSet = SequenceOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 0)) + componentType = Control() + + +class Scope(Enumerated): + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + namedValues = NamedValues(('baseObject', 0), + ('singleLevel', 1), + ('wholeSubtree', 2)) + + +class DerefAliases(Enumerated): + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + namedValues = NamedValues(('neverDerefAliases', 0), + ('derefInSearching', 1), + ('derefFindingBaseObj', 2), + ('derefAlways', 3)) + + +class TypesOnly(Boolean): + # typesOnly BOOLEAN + pass + + +class Selector(LDAPString): + # -- The LDAPString is constrained to + # -- in Section 4.5.1.8 + + # subtypeSpec = LDAPString.subtypeSpec + attributeSelectorConstraint + pass + + +class AttributeSelection(SequenceOf): + # AttributeSelection ::= SEQUENCE OF selector LDAPString + # -- The LDAPString is constrained to + # -- in Section 4.5.1.8 + componentType = Selector() + + +class MatchingRule(MatchingRuleId): + # matchingRule [1] MatchingRuleId + tagSet = MatchingRuleId.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + + +class Type(AttributeDescription): + # type [2] AttributeDescription + tagSet = AttributeDescription.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 2)) + + +class MatchValue(AssertionValue): + # matchValue [3] AssertionValue, + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 3)) + + +class DnAttributes(Boolean): + # dnAttributes [4] BOOLEAN DEFAULT FALSE } + tagSet = Boolean.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 4)) + defaultValue = Boolean(False) + + +class MatchingRuleAssertion(Sequence): + # MatchingRuleAssertion ::= SEQUENCE { + # matchingRule [1] MatchingRuleId OPTIONAL, + # type [2] AttributeDescription OPTIONAL, + # matchValue [3] AssertionValue, + # dnAttributes [4] BOOLEAN DEFAULT FALSE } + componentType = NamedTypes(OptionalNamedType('matchingRule', MatchingRule()), + OptionalNamedType('type', Type()), + NamedType('matchValue', MatchValue()), + DefaultedNamedType('dnAttributes', DnAttributes())) + + +class Initial(AssertionValue): + # initial [0] AssertionValue, -- can occur at most once + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class Any(AssertionValue): + # any [1] AssertionValue, + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + + +class Final(AssertionValue): + # final [1] AssertionValue, -- can occur at most once + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 2)) + + +class Substring(Choice): + # substring CHOICE { + # initial [0] AssertionValue, -- can occur at most once + # any [1] AssertionValue, + # final [2] AssertionValue } -- can occur at most once + # } + componentType = NamedTypes(NamedType('initial', Initial()), + NamedType('any', Any()), + NamedType('final', Final())) + + +class Substrings(SequenceOf): + # substrings SEQUENCE SIZE (1..MAX) OF substring CHOICE { + # ... + # } + subtypeSpec = SequenceOf.subtypeSpec + size1ToMaxConstraint + componentType = Substring() + + +class SubstringFilter(Sequence): + # SubstringFilter ::= SEQUENCE { + # type AttributeDescription, + # substrings SEQUENCE SIZE (1..MAX) OF substring CHOICE { + # initial [0] AssertionValue, -- can occur at most once + # any [1] AssertionValue, + # final [2] AssertionValue } -- can occur at most once + # } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 4)) + componentType = NamedTypes(NamedType('type', AttributeDescription()), + NamedType('substrings', Substrings())) + + +class And(SetOf): + # and [0] SET SIZE (1..MAX) OF filter Filter + tagSet = SetOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 0)) + subtypeSpec = SetOf.subtypeSpec + size1ToMaxConstraint + + +class Or(SetOf): + # or [1] SET SIZE (1..MAX) OF filter Filter + tagSet = SetOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 1)) + subtypeSpec = SetOf.subtypeSpec + size1ToMaxConstraint + + +class Not(Choice): + # not [2] Filter + pass # defined after Filter definition to allow recursion + + +class EqualityMatch(AttributeValueAssertion): + # equalityMatch [3] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + + +class GreaterOrEqual(AttributeValueAssertion): + # greaterOrEqual [5] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 5)) + + +class LessOrEqual(AttributeValueAssertion): + # lessOrEqual [6] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 6)) + + +class Present(AttributeDescription): + # present [7] AttributeDescription + tagSet = AttributeDescription.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 7)) + + +class ApproxMatch(AttributeValueAssertion): + # approxMatch [8] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 8)) + + +class ExtensibleMatch(MatchingRuleAssertion): + # extensibleMatch [9] MatchingRuleAssertion + tagSet = MatchingRuleAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 9)) + + +class Filter(Choice): + # Filter ::= CHOICE { + # and [0] SET SIZE (1..MAX) OF filter Filter, + # or [1] SET SIZE (1..MAX) OF filter Filter, + # not [2] Filter, + # equalityMatch [3] AttributeValueAssertion, + # substrings [4] SubstringFilter, + # greaterOrEqual [5] AttributeValueAssertion, + # lessOrEqual [6] AttributeValueAssertion, + # present [7] AttributeDescription, + # approxMatch [8] AttributeValueAssertion, + # extensibleMatch [9] MatchingRuleAssertion, + # ... } + componentType = NamedTypes(NamedType('and', And()), + NamedType('or', Or()), + NamedType('notFilter', Not()), + NamedType('equalityMatch', EqualityMatch()), + NamedType('substringFilter', SubstringFilter()), + NamedType('greaterOrEqual', GreaterOrEqual()), + NamedType('lessOrEqual', LessOrEqual()), + NamedType('present', Present()), + NamedType('approxMatch', ApproxMatch()), + NamedType('extensibleMatch', ExtensibleMatch())) + + +And.componentType = Filter() +Or.componentType = Filter() +Not.componentType = NamedTypes(NamedType('innerNotFilter', Filter())) +Not.tagSet = Filter.tagSet.tagExplicitly(Tag(tagClassContext, tagFormatConstructed, 2)) # as per RFC4511 page 23 + + +class PartialAttributeList(SequenceOf): + # PartialAttributeList ::= SEQUENCE OF + # partialAttribute PartialAttribute + componentType = PartialAttribute() + + +class Operation(Enumerated): + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... } + namedValues = NamedValues(('add', 0), + ('delete', 1), + ('replace', 2), + ('increment', 3)) + + +class Change(Sequence): + # change SEQUENCE { + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... }, + # modification PartialAttribute } } + componentType = NamedTypes(NamedType('operation', Operation()), + NamedType('modification', PartialAttribute())) + + +class Changes(SequenceOf): + # changes SEQUENCE OF change SEQUENCE + componentType = Change() + + +class DeleteOldRDN(Boolean): + # deleteoldrdn BOOLEAN + pass + + +class NewSuperior(LDAPDN): + # newSuperior [0] LDAPDN + tagSet = LDAPDN.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class RequestName(LDAPOID): + # requestName [0] LDAPOID + tagSet = LDAPOID.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class RequestValue(OctetString): + # requestValue [1] OCTET STRING + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + encoding = 'utf-8' + + +class ResponseName(LDAPOID): + # responseName [10] LDAPOID + tagSet = LDAPOID.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 10)) + + +class ResponseValue(OctetString): + # responseValue [11] OCTET STRING + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 11)) + encoding = 'utf-8' + + +class IntermediateResponseName(LDAPOID): + # responseName [0] LDAPOID + tagSet = LDAPOID.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class IntermediateResponseValue(OctetString): + # responseValue [1] OCTET STRING + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + encoding = 'utf-8' + + +# operations +class BindRequest(Sequence): + # BindRequest ::= [APPLICATION 0] SEQUENCE { + # version INTEGER (1 .. 127), + # name LDAPDN, + # authentication AuthenticationChoice } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 0)) + componentType = NamedTypes(NamedType('version', Version()), + NamedType('name', LDAPDN()), + NamedType('authentication', AuthenticationChoice())) + + +class BindResponse(Sequence): + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 1)) + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('matchedDN', LDAPDN()), + NamedType('diagnosticMessage', LDAPString()), + OptionalNamedType('referral', Referral()), + OptionalNamedType('serverSaslCreds', ServerSaslCreds())) + + +class UnbindRequest(Null): + # UnbindRequest ::= [APPLICATION 2] NULL + tagSet = Null.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatSimple, 2)) + + +class SearchRequest(Sequence): + # SearchRequest ::= [APPLICATION 3] SEQUENCE { + # baseObject LDAPDN, + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + # ... }, + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + # sizeLimit INTEGER (0 .. maxInt), + # timeLimit INTEGER (0 .. maxInt), + # typesOnly BOOLEAN, + # filter Filter, + # attributes AttributeSelection } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 3)) + componentType = NamedTypes(NamedType('baseObject', LDAPDN()), + NamedType('scope', Scope()), + NamedType('derefAliases', DerefAliases()), + NamedType('sizeLimit', Integer0ToMax()), + NamedType('timeLimit', Integer0ToMax()), + NamedType('typesOnly', TypesOnly()), + NamedType('filter', Filter()), + NamedType('attributes', AttributeSelection())) + + +class SearchResultReference(SequenceOf): + # SearchResultReference ::= [APPLICATION 19] SEQUENCE + # SIZE (1..MAX) OF uri URI + tagSet = SequenceOf.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 19)) + subtypeSpec = SequenceOf.subtypeSpec + size1ToMaxConstraint + componentType = URI() + + +class SearchResultEntry(Sequence): + # SearchResultEntry ::= [APPLICATION 4] SEQUENCE { + # objectName LDAPDN, + # attributes PartialAttributeList } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 4)) + componentType = NamedTypes(NamedType('object', LDAPDN()), + NamedType('attributes', PartialAttributeList())) + + +class SearchResultDone(LDAPResult): + # SearchResultDone ::= [APPLICATION 5] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 5)) + + +class ModifyRequest(Sequence): + # ModifyRequest ::= [APPLICATION 6] SEQUENCE { + # object LDAPDN, + # changes SEQUENCE OF change SEQUENCE { + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... }, + # modification PartialAttribute } } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 6)) + componentType = NamedTypes(NamedType('object', LDAPDN()), + NamedType('changes', Changes())) + + +class ModifyResponse(LDAPResult): + # ModifyResponse ::= [APPLICATION 7] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 7)) + + +class AddRequest(Sequence): + # AddRequest ::= [APPLICATION 8] SEQUENCE { + # entry LDAPDN, + # attributes AttributeList } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 8)) + componentType = NamedTypes(NamedType('entry', LDAPDN()), + NamedType('attributes', AttributeList())) + + +class AddResponse(LDAPResult): + # AddResponse ::= [APPLICATION 9] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 9)) + + +class DelRequest(LDAPDN): + # DelRequest ::= [APPLICATION 10] LDAPDN + tagSet = LDAPDN.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatSimple, 10)) + + +class DelResponse(LDAPResult): + # DelResponse ::= [APPLICATION 11] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 11)) + + +class ModifyDNRequest(Sequence): + # ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { + # entry LDAPDN, + # newrdn RelativeLDAPDN, + # deleteoldrdn BOOLEAN, + # newSuperior [0] LDAPDN OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 12)) + componentType = NamedTypes(NamedType('entry', LDAPDN()), + NamedType('newrdn', RelativeLDAPDN()), + NamedType('deleteoldrdn', DeleteOldRDN()), + OptionalNamedType('newSuperior', NewSuperior())) + + +class ModifyDNResponse(LDAPResult): + # ModifyDNResponse ::= [APPLICATION 13] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 13)) + + +class CompareRequest(Sequence): + # CompareRequest ::= [APPLICATION 14] SEQUENCE { + # entry LDAPDN, + # ava AttributeValueAssertion } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 14)) + componentType = NamedTypes(NamedType('entry', LDAPDN()), + NamedType('ava', AttributeValueAssertion())) + + +class CompareResponse(LDAPResult): + # CompareResponse ::= [APPLICATION 15] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 15)) + + +class AbandonRequest(MessageID): + # AbandonRequest ::= [APPLICATION 16] MessageID + tagSet = MessageID.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatSimple, 16)) + + +class ExtendedRequest(Sequence): + # ExtendedRequest ::= [APPLICATION 23] SEQUENCE { + # requestName [0] LDAPOID, + # requestValue [1] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 23)) + componentType = NamedTypes(NamedType('requestName', RequestName()), + OptionalNamedType('requestValue', RequestValue())) + + +class ExtendedResponse(Sequence): + # ExtendedResponse ::= [APPLICATION 24] SEQUENCE { + # COMPONENTS OF LDAPResult, + # responseName [10] LDAPOID OPTIONAL, + # responseValue [11] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 24)) + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('matchedDN', LDAPDN()), + NamedType('diagnosticMessage', LDAPString()), + OptionalNamedType('referral', Referral()), + OptionalNamedType('responseName', ResponseName()), + OptionalNamedType('responseValue', ResponseValue())) + + +class IntermediateResponse(Sequence): + # IntermediateResponse ::= [APPLICATION 25] SEQUENCE { + # responseName [0] LDAPOID OPTIONAL, + # responseValue [1] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 25)) + componentType = NamedTypes(OptionalNamedType('responseName', IntermediateResponseName()), + OptionalNamedType('responseValue', IntermediateResponseValue())) + + +class ProtocolOp(Choice): + # protocolOp CHOICE { + # bindRequest BindRequest, + # bindResponse BindResponse, + # unbindRequest UnbindRequest, + # searchRequest SearchRequest, + # searchResEntry SearchResultEntry, + # searchResDone SearchResultDone, + # searchResRef SearchResultReference, + # modifyRequest ModifyRequest, + # modifyResponse ModifyResponse, + # addRequest AddRequest, + # addResponse AddResponse, + # delRequest DelRequest, + # delResponse DelResponse, + # modDNRequest ModifyDNRequest, + # modDNResponse ModifyDNResponse, + # compareRequest CompareRequest, + # compareResponse CompareResponse, + # abandonRequest AbandonRequest, + # extendedReq ExtendedRequest, + # extendedResp ExtendedResponse, + # ..., + # intermediateResponse IntermediateResponse } + componentType = NamedTypes(NamedType('bindRequest', BindRequest()), + NamedType('bindResponse', BindResponse()), + NamedType('unbindRequest', UnbindRequest()), + NamedType('searchRequest', SearchRequest()), + NamedType('searchResEntry', SearchResultEntry()), + NamedType('searchResDone', SearchResultDone()), + NamedType('searchResRef', SearchResultReference()), + NamedType('modifyRequest', ModifyRequest()), + NamedType('modifyResponse', ModifyResponse()), + NamedType('addRequest', AddRequest()), + NamedType('addResponse', AddResponse()), + NamedType('delRequest', DelRequest()), + NamedType('delResponse', DelResponse()), + NamedType('modDNRequest', ModifyDNRequest()), + NamedType('modDNResponse', ModifyDNResponse()), + NamedType('compareRequest', CompareRequest()), + NamedType('compareResponse', CompareResponse()), + NamedType('abandonRequest', AbandonRequest()), + NamedType('extendedReq', ExtendedRequest()), + NamedType('extendedResp', ExtendedResponse()), + NamedType('intermediateResponse', IntermediateResponse())) + + +class LDAPMessage(Sequence): + # LDAPMessage ::= SEQUENCE { + # messageID MessageID, + # protocolOp CHOICE { + # bindRequest BindRequest, + # bindResponse BindResponse, + # unbindRequest UnbindRequest, + # searchRequest SearchRequest, + # searchResEntry SearchResultEntry, + # searchResDone SearchResultDone, + # searchResRef SearchResultReference, + # modifyRequest ModifyRequest, + # modifyResponse ModifyResponse, + # addRequest AddRequest, + # addResponse AddResponse, + # delRequest DelRequest, + # delResponse DelResponse, + # modDNRequest ModifyDNRequest, + # modDNResponse ModifyDNResponse, + # compareRequest CompareRequest, + # compareResponse CompareResponse, + # abandonRequest AbandonRequest, + # extendedReq ExtendedRequest, + # extendedResp ExtendedResponse, + # ..., + # intermediateResponse IntermediateResponse }, + # controls [0] Controls OPTIONAL } + componentType = NamedTypes(NamedType('messageID', MessageID()), + NamedType('protocolOp', ProtocolOp()), + OptionalNamedType('controls', Controls())) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4512.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4512.py new file mode 100644 index 0000000..407b2d1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4512.py @@ -0,0 +1,850 @@ +""" +""" + +# Created on 2013.09.11 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep +import re +import json + +from .oid import CLASS_ABSTRACT, CLASS_STRUCTURAL, CLASS_AUXILIARY, ATTRIBUTE_USER_APPLICATION, \ + ATTRIBUTE_DIRECTORY_OPERATION, ATTRIBUTE_DISTRIBUTED_OPERATION, ATTRIBUTE_DSA_OPERATION +from .. import SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from ..utils.conv import escape_bytes, json_hook, check_json_dict, format_json, to_unicode +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..protocol.formatters.standard import format_attribute_values +from .oid import Oids, decode_oids, decode_syntax, oid_to_string +from ..core.exceptions import LDAPSchemaError, LDAPDefinitionError + + +def constant_to_class_kind(value): + if value == CLASS_STRUCTURAL: + return 'Structural' + elif value == CLASS_ABSTRACT: + return 'Abstract' + elif value == CLASS_AUXILIARY: + return 'Auxiliary' + else: + return '' + + +def constant_to_attribute_usage(value): + if value == ATTRIBUTE_USER_APPLICATION: + return 'User Application' + elif value == ATTRIBUTE_DIRECTORY_OPERATION: + return "Directory operation" + elif value == ATTRIBUTE_DISTRIBUTED_OPERATION: + return 'Distributed operation' + elif value == ATTRIBUTE_DSA_OPERATION: + return 'DSA operation' + else: + return 'unknown' + + +def attribute_usage_to_constant(value): + if value == 'userApplications': + return ATTRIBUTE_USER_APPLICATION + elif value == 'directoryOperation': + return ATTRIBUTE_DIRECTORY_OPERATION + elif value == 'distributedOperation': + return ATTRIBUTE_DISTRIBUTED_OPERATION + elif value == 'dSAOperation': + return ATTRIBUTE_DSA_OPERATION + else: + return 'unknown' + + +def quoted_string_to_list(quoted_string): + string = quoted_string.strip() + if not string: + return list() + + if string[0] == '(' and string[-1] == ')': + string = string[1:-1] + elements = string.split("'") + # return [check_escape(element.strip("'").strip()) for element in elements if element.strip()] + return [element.strip("'").strip() for element in elements if element.strip()] + + +def oids_string_to_list(oid_string): + string = oid_string.strip() + if string[0] == '(' and string[-1] == ')': + string = string[1:-1] + elements = string.split('$') + return [element.strip() for element in elements if element.strip()] + + +def extension_to_tuple(extension_string): + string = extension_string.strip() + name, _, values = string.partition(' ') + return name, quoted_string_to_list(values) + + +def list_to_string(list_object): + if not isinstance(list_object, SEQUENCE_TYPES): + return list_object + + r = '' + for element in list_object: + r += (list_to_string(element) if isinstance(element, SEQUENCE_TYPES) else str(element)) + ', ' + + return r[:-2] if r else '' + + +class BaseServerInfo(object): + def __init__(self, raw_attributes): + self.raw = dict(raw_attributes) + + @classmethod + def from_json(cls, json_definition, schema=None, custom_formatter=None): + conf_case_insensitive_schema = get_config_parameter('CASE_INSENSITIVE_SCHEMA_NAMES') + definition = json.loads(json_definition, object_hook=json_hook) + if 'raw' not in definition or 'type' not in definition: + raise LDAPDefinitionError('invalid JSON definition') + + if conf_case_insensitive_schema: + attributes = CaseInsensitiveWithAliasDict() + else: + attributes = dict() + + if schema: + for attribute in definition['raw']: + # attributes[attribute] = format_attribute_values(schema, check_escape(attribute), [check_escape(value) for value in definition['raw'][attribute]], custom_formatter) + attributes[attribute] = format_attribute_values(schema, attribute, [value for value in definition['raw'][attribute]], custom_formatter) + else: + for attribute in definition['raw']: + # attributes[attribute] = [check_escape(value) for value in definition['raw'][attribute]] + attributes[attribute] = [value for value in definition['raw'][attribute]] + + if cls.__name__ != definition['type']: + raise LDAPDefinitionError('JSON info not of type ' + cls.__name__) + + if definition['type'] == 'DsaInfo': + return DsaInfo(attributes, definition['raw']) + elif definition['type'] == 'SchemaInfo': + if 'schema_entry' not in definition: + raise LDAPDefinitionError('invalid schema in JSON') + return SchemaInfo(definition['schema_entry'], attributes, definition['raw']) + + raise LDAPDefinitionError('invalid Info type ' + str(definition['type']) + ' in JSON definition') + + @classmethod + def from_file(cls, target, schema=None, custom_formatter=None): + if isinstance(target, STRING_TYPES): + target = open(target, 'r') + + new = cls.from_json(target.read(), schema=schema, custom_formatter=custom_formatter) + target.close() + return new + + def to_file(self, + target, + indent=4, + sort=True): + if isinstance(target, STRING_TYPES): + target = open(target, 'w+') + + target.writelines(self.to_json(indent=indent, sort=sort)) + target.close() + + def __str__(self): + return self.__repr__() + + def to_json(self, + indent=4, + sort=True): + json_dict = dict() + json_dict['type'] = self.__class__.__name__ + json_dict['raw'] = self.raw + + if isinstance(self, SchemaInfo): + json_dict['schema_entry'] = self.schema_entry + elif isinstance(self, DsaInfo): + pass + else: + raise LDAPDefinitionError('unable to convert ' + str(self) + ' to JSON') + + if str is bytes: # Python 2 + check_json_dict(json_dict) + + return json.dumps(json_dict, ensure_ascii=False, sort_keys=sort, indent=indent, check_circular=True, default=format_json, separators=(',', ': ')) + + +class DsaInfo(BaseServerInfo): + """ + This class contains info about the ldap server (DSA) read from DSE + as defined in RFC4512 and RFC3045. Unknown attributes are stored in the "other" dict + """ + + def __init__(self, attributes, raw_attributes): + BaseServerInfo.__init__(self, raw_attributes) + self.alt_servers = attributes.pop('altServer', None) + self.naming_contexts = attributes.pop('namingContexts', None) + self.supported_controls = decode_oids(attributes.pop('supportedControl', None)) + self.supported_extensions = decode_oids(attributes.pop('supportedExtension', None)) + self.supported_features = decode_oids(attributes.pop('supportedFeatures', None)) + decode_oids(attributes.pop('supportedCapabilities', None)) + self.supported_ldap_versions = attributes.pop('supportedLDAPVersion', None) + self.supported_sasl_mechanisms = attributes.pop('supportedSASLMechanisms', None) + self.vendor_name = attributes.pop('vendorName', None) + self.vendor_version = attributes.pop('vendorVersion', None) + self.schema_entry = attributes.pop('subschemaSubentry', None) + self.other = attributes # remaining schema definition attributes not in RFC4512 + + def __repr__(self): + r = 'DSA info (from DSE):' + linesep + if self.supported_ldap_versions: + if isinstance(self.supported_ldap_versions, SEQUENCE_TYPES): + r += (' Supported LDAP versions: ' + ', '.join([str(s) for s in self.supported_ldap_versions])) if self.supported_ldap_versions else '' + else: + r += (' Supported LDAP versions: ' + str(self.supported_ldap_versions)) + r += linesep + if self.naming_contexts: + if isinstance(self.naming_contexts, SEQUENCE_TYPES): + r += (' Naming contexts: ' + linesep + linesep.join([' ' + str(s) for s in self.naming_contexts])) if self.naming_contexts else '' + else: + r += (' Naming contexts: ' + str(self.naming_contexts)) + r += linesep + if self.alt_servers: + if isinstance(self.alt_servers, SEQUENCE_TYPES): + r += (' Alternative servers: ' + linesep + linesep.join([' ' + str(s) for s in self.alt_servers])) if self.alt_servers else '' + else: + r += (' Alternative servers: ' + str(self.alt_servers)) + r += linesep + if self.supported_controls: + if isinstance(self.supported_controls, SEQUENCE_TYPES): + r += (' Supported controls: ' + linesep + linesep.join([' ' + oid_to_string(s) for s in self.supported_controls])) if self.supported_controls else '' + else: + r += (' Supported controls: ' + str(self.supported_controls)) + r += linesep + if self.supported_extensions: + if isinstance(self.supported_extensions, SEQUENCE_TYPES): + r += (' Supported extensions: ' + linesep + linesep.join([' ' + oid_to_string(s) for s in self.supported_extensions])) if self.supported_extensions else '' + else: + r += (' Supported extensions: ' + str(self.supported_extensions)) + r += linesep + if self.supported_features: + if self.supported_features: + if isinstance(self.supported_features, SEQUENCE_TYPES): + r += (' Supported features: ' + linesep + linesep.join([' ' + oid_to_string(s) for s in self.supported_features])) if self.supported_features else '' + else: + r += (' Supported features: ' + str(self.supported_features)) + r += linesep + if self.supported_sasl_mechanisms: + if isinstance(self.supported_sasl_mechanisms, SEQUENCE_TYPES): + r += (' Supported SASL mechanisms: ' + linesep + ' ' + ', '.join([str(s) for s in self.supported_sasl_mechanisms])) if self.supported_sasl_mechanisms else '' + else: + r += (' Supported SASL mechanisms: ' + str(self.supported_sasl_mechanisms)) + r += linesep + if self.schema_entry: + if isinstance(self.schema_entry, SEQUENCE_TYPES): + r += (' Schema entry: ' + linesep + linesep.join([' ' + str(s) for s in self.schema_entry])) if self.schema_entry else '' + else: + r += (' Schema entry: ' + str(self.schema_entry)) + r += linesep + if self.vendor_name: + if isinstance(self.vendor_name, SEQUENCE_TYPES) and len(self.vendor_name) == 1: + r += 'Vendor name: ' + self.vendor_name[0] + else: + r += 'Vendor name: ' + str(self.vendor_name) + r += linesep + if self.vendor_version: + if isinstance(self.vendor_version, SEQUENCE_TYPES) and len(self.vendor_version) == 1: + r += 'Vendor version: ' + self.vendor_version[0] + else: + r += 'Vendor version: ' + str(self.vendor_version) + r += linesep + r += 'Other:' + linesep + for k, v in self.other.items(): + r += ' ' + str(k) + ': ' + linesep + try: + r += (linesep.join([' ' + str(s) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(v) + except UnicodeDecodeError: + r += (linesep.join([' ' + str(escape_bytes(s)) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(escape_bytes(v)) + r += linesep + return r + + +class SchemaInfo(BaseServerInfo): + """ + This class contains info about the ldap server schema read from an entry (default entry is DSE) + as defined in RFC4512. Unknown attributes are stored in the "other" dict + """ + + def __init__(self, schema_entry, attributes, raw_attributes): + BaseServerInfo.__init__(self, raw_attributes) + self.schema_entry = schema_entry + self.create_time_stamp = attributes.pop('createTimestamp', None) + self.modify_time_stamp = attributes.pop('modifyTimestamp', None) + self.attribute_types = AttributeTypeInfo.from_definition(attributes.pop('attributeTypes', [])) + self.object_classes = ObjectClassInfo.from_definition(attributes.pop('objectClasses', [])) + self.matching_rules = MatchingRuleInfo.from_definition(attributes.pop('matchingRules', [])) + self.matching_rule_uses = MatchingRuleUseInfo.from_definition(attributes.pop('matchingRuleUse', [])) + self.dit_content_rules = DitContentRuleInfo.from_definition(attributes.pop('dITContentRules', [])) + self.dit_structure_rules = DitStructureRuleInfo.from_definition(attributes.pop('dITStructureRules', [])) + self.name_forms = NameFormInfo.from_definition(attributes.pop('nameForms', [])) + self.ldap_syntaxes = LdapSyntaxInfo.from_definition(attributes.pop('ldapSyntaxes', [])) + self.other = attributes # remaining schema definition attributes not in RFC4512 + + # links attributes to class objects + if self.object_classes and self.attribute_types: + for object_class in self.object_classes: # CaseInsensitiveDict return keys while iterating + for attribute in self.object_classes[object_class].must_contain: + try: + self.attribute_types[attribute].mandatory_in.append(object_class) + except KeyError: + pass + for attribute in self.object_classes[object_class].may_contain: + try: + self.attribute_types[attribute].optional_in.append(object_class) + except KeyError: + pass + + def is_valid(self): + if self.object_classes or self.attribute_types or self.matching_rules or self.matching_rule_uses or self.dit_content_rules or self.dit_structure_rules or self.name_forms or self.ldap_syntaxes: + return True + return False + + def __repr__(self): + r = 'DSA Schema from: ' + self.schema_entry + r += linesep + if isinstance(self.attribute_types, SEQUENCE_TYPES): + r += (' Attribute types:' + linesep + ' ' + ', '.join([str(self.attribute_types[s]) for s in self.attribute_types])) if self.attribute_types else '' + else: + r += (' Attribute types:' + str(self.attribute_types)) + r += linesep + if isinstance(self.object_classes, SEQUENCE_TYPES): + r += (' Object classes:' + linesep + ' ' + ', '.join([str(self.object_classes[s]) for s in self.object_classes])) if self.object_classes else '' + else: + r += (' Object classes:' + str(self.object_classes)) + r += linesep + if isinstance(self.matching_rules, SEQUENCE_TYPES): + r += (' Matching rules:' + linesep + ' ' + ', '.join([str(self.matching_rules[s]) for s in self.matching_rules])) if self.matching_rules else '' + else: + r += (' Matching rules:' + str(self.matching_rules)) + r += linesep + if isinstance(self.matching_rule_uses, SEQUENCE_TYPES): + r += (' Matching rule uses:' + linesep + ' ' + ', '.join([str(self.matching_rule_uses[s]) for s in self.matching_rule_uses])) if self.matching_rule_uses else '' + else: + r += (' Matching rule uses:' + str(self.matching_rule_uses)) + r += linesep + if isinstance(self.dit_content_rules, SEQUENCE_TYPES): + r += (' DIT content rules:' + linesep + ' ' + ', '.join([str(self.dit_content_rules[s]) for s in self.dit_content_rules])) if self.dit_content_rules else '' + else: + r += (' DIT content rules:' + str(self.dit_content_rules)) + r += linesep + if isinstance(self.dit_structure_rules, SEQUENCE_TYPES): + r += (' DIT structure rules:' + linesep + ' ' + ', '.join([str(self.dit_structure_rules[s]) for s in self.dit_structure_rules])) if self.dit_structure_rules else '' + else: + r += (' DIT structure rules:' + str(self.dit_structure_rules)) + r += linesep + if isinstance(self.name_forms, SEQUENCE_TYPES): + r += (' Name forms:' + linesep + ' ' + ', '.join([str(self.name_forms[s]) for s in self.name_forms])) if self.name_forms else '' + else: + r += (' Name forms:' + str(self.name_forms)) + r += linesep + if isinstance(self.ldap_syntaxes, SEQUENCE_TYPES): + r += (' LDAP syntaxes:' + linesep + ' ' + ', '.join([str(self.ldap_syntaxes[s]) for s in self.ldap_syntaxes])) if self.ldap_syntaxes else '' + else: + r += (' LDAP syntaxes:' + str(self.ldap_syntaxes)) + r += linesep + r += 'Other:' + linesep + + for k, v in self.other.items(): + r += ' ' + str(k) + ': ' + linesep + try: + r += (linesep.join([' ' + str(s) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(v) + except UnicodeDecodeError: + r += (linesep.join([' ' + str(escape_bytes(s)) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(escape_bytes(v)) + r += linesep + return r + + +class BaseObjectInfo(object): + """ + Base class for objects defined in the schema as per RFC4512 + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + extensions=None, + experimental=None, + definition=None): + + self.oid = oid + self.name = name + self.description = description + self.obsolete = obsolete + self.extensions = extensions + self.experimental = experimental + self.raw_definition = definition + self._oid_info = None + + @property + def oid_info(self): + if self._oid_info is None and self.oid: + self._oid_info = Oids.get(self.oid, '') + + return self._oid_info if self._oid_info else None + + def __str__(self): + return self.__repr__() + + def __repr__(self): + r = ': ' + self.oid + r += ' [OBSOLETE]' if self.obsolete else '' + r += (linesep + ' Short name: ' + list_to_string(self.name)) if self.name else '' + r += (linesep + ' Description: ' + self.description) if self.description else '' + r += '<__desc__>' + r += (linesep + ' Extensions:' + linesep + linesep.join([' ' + s[0] + ': ' + list_to_string(s[1]) for s in self.extensions])) if self.extensions else '' + r += (linesep + ' Experimental:' + linesep + linesep.join([' ' + s[0] + ': ' + list_to_string(s[1]) for s in self.experimental])) if self.experimental else '' + r += (linesep + ' OidInfo: ' + str(self.oid_info)) if self.oid_info else '' + r += linesep + return r + + @classmethod + def from_definition(cls, definitions): + conf_case_insensitive_schema = get_config_parameter('CASE_INSENSITIVE_SCHEMA_NAMES') + conf_ignore_malformed_schema = get_config_parameter('IGNORE_MALFORMED_SCHEMA') + + ret_dict = CaseInsensitiveWithAliasDict() if conf_case_insensitive_schema else dict() + + if not definitions: + return ret_dict + + for object_definition in definitions: + object_definition = to_unicode(object_definition.strip(), from_server=True) + if object_definition[0] == '(' and object_definition[-1] == ')': + if cls is MatchingRuleInfo: + pattern = '| SYNTAX ' + elif cls is ObjectClassInfo: + pattern = '| SUP | ABSTRACT| STRUCTURAL| AUXILIARY| MUST | MAY ' + elif cls is AttributeTypeInfo: + pattern = '| SUP | EQUALITY | ORDERING | SUBSTR | SYNTAX | SINGLE-VALUE| COLLECTIVE| NO-USER-MODIFICATION| USAGE ' + elif cls is MatchingRuleUseInfo: + pattern = '| APPLIES ' + elif cls is LdapSyntaxInfo: + pattern = '' + elif cls is DitContentRuleInfo: + pattern = '| AUX | MUST | MAY | NOT ' + elif cls is DitStructureRuleInfo: + pattern = '| FORM | SUP ' + elif cls is NameFormInfo: + pattern = '| OC | MUST | MAY ' + else: + raise LDAPSchemaError('unknown schema definition class') + + splitted = re.split('( NAME | DESC | OBSOLETE| X-| E-' + pattern + ')', object_definition[1:-1]) + values = splitted[::2] + separators = splitted[1::2] + separators.insert(0, 'OID') + defs = list(zip(separators, values)) + object_def = cls() + for d in defs: + key = d[0].strip() + value = d[1].strip() + if key == 'OID': + object_def.oid = value + elif key == 'NAME': + object_def.name = quoted_string_to_list(value) + elif key == 'DESC': + object_def.description = value.strip("'") + elif key == 'OBSOLETE': + object_def.obsolete = True + elif key == 'SYNTAX': + object_def.syntax = oids_string_to_list(value) + elif key == 'SUP': + object_def.superior = oids_string_to_list(value) + elif key == 'ABSTRACT': + object_def.kind = CLASS_ABSTRACT + elif key == 'STRUCTURAL': + object_def.kind = CLASS_STRUCTURAL + elif key == 'AUXILIARY': + object_def.kind = CLASS_AUXILIARY + elif key == 'MUST': + object_def.must_contain = oids_string_to_list(value) + elif key == 'MAY': + object_def.may_contain = oids_string_to_list(value) + elif key == 'EQUALITY': + object_def.equality = oids_string_to_list(value) + elif key == 'ORDERING': + object_def.ordering = oids_string_to_list(value) + elif key == 'SUBSTR': + object_def.substr = oids_string_to_list(value) + elif key == 'SINGLE-VALUE': + object_def.single_value = True + elif key == 'COLLECTIVE': + object_def.collective = True + elif key == 'NO-USER-MODIFICATION': + object_def.no_user_modification = True + elif key == 'USAGE': + object_def.usage = attribute_usage_to_constant(value) + elif key == 'APPLIES': + object_def.apply_to = oids_string_to_list(value) + elif key == 'AUX': + object_def.auxiliary_classes = oids_string_to_list(value) + elif key == 'FORM': + object_def.name_form = oids_string_to_list(value) + elif key == 'OC': + object_def.object_class = oids_string_to_list(value) + elif key == 'NOT': + object_def.not_contains = oids_string_to_list(value) + elif key == 'X-': + if not object_def.extensions: + object_def.extensions = [] + object_def.extensions.append(extension_to_tuple('X-' + value)) + elif key == 'E-': + if not object_def.experimental: + object_def.experimental = [] + object_def.experimental.append(extension_to_tuple('E-' + value)) + else: + if not conf_ignore_malformed_schema: + raise LDAPSchemaError('malformed schema definition key:' + key + ' - use get_info=NONE in Server definition') + else: + return CaseInsensitiveWithAliasDict() if conf_case_insensitive_schema else dict() + object_def.raw_definition = object_definition + if hasattr(object_def, 'syntax') and object_def.syntax and len(object_def.syntax) == 1: + object_def.min_length = None + if object_def.syntax[0].endswith('}'): + try: + object_def.min_length = int(object_def.syntax[0][object_def.syntax[0].index('{') + 1:-1]) + object_def.syntax[0] = object_def.syntax[0][:object_def.syntax[0].index('{')] + except Exception: + pass + else: + object_def.min_length = None + object_def.syntax[0] = object_def.syntax[0].strip("'") + object_def.syntax = object_def.syntax[0] + if hasattr(object_def, 'name') and object_def.name: + if conf_case_insensitive_schema: + ret_dict[object_def.name[0]] = object_def + ret_dict.set_alias(object_def.name[0], object_def.name[1:] + [object_def.oid], ignore_duplicates=True) + else: + for name in object_def.name: + ret_dict[name] = object_def + else: + ret_dict[object_def.oid] = object_def + + else: + if not conf_ignore_malformed_schema: + raise LDAPSchemaError('malformed schema definition, use get_info=NONE in Server definition') + else: + return CaseInsensitiveWithAliasDict() if conf_case_insensitive_schema else dict() + return ret_dict + + +class MatchingRuleInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.3) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + syntax=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.syntax = syntax + + def __repr__(self): + r = (linesep + ' Syntax: ' + list_to_string(self.syntax)) if self.syntax else '' + return 'Matching rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class MatchingRuleUseInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.4) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + apply_to=None, + extensions=None, + experimental=None, + definition=None): + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.apply_to = apply_to + + def __repr__(self): + r = (linesep + ' Apply to: ' + list_to_string(self.apply_to)) if self.apply_to else '' + return 'Matching rule use' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class ObjectClassInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.1) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + superior=None, + kind=None, + must_contain=None, + may_contain=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.superior = superior + self.kind = kind + self.must_contain = must_contain or [] + self.may_contain = may_contain or [] + + def __repr__(self): + r = '' + r += (linesep + ' Type: ' + constant_to_class_kind(self.kind)) if self.kind else '' + r += (linesep + ' Superior: ' + list_to_string(self.superior)) if self.superior else '' + r += (linesep + ' Must contain attributes: ' + list_to_string(self.must_contain)) if self.must_contain else '' + r += (linesep + ' May contain attributes: ' + list_to_string(self.may_contain)) if self.may_contain else '' + return 'Object class' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class AttributeTypeInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.2) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + superior=None, + equality=None, + ordering=None, + substring=None, + syntax=None, + min_length=None, + single_value=False, + collective=False, + no_user_modification=False, + usage=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.superior = superior + self.equality = equality + self.ordering = ordering + self.substring = substring + self.syntax = syntax + self.min_length = min_length + self.single_value = single_value + self.collective = collective + self.no_user_modification = no_user_modification + self.usage = usage + self.mandatory_in = [] + self.optional_in = [] + + def __repr__(self): + r = '' + r += linesep + ' Single value: ' + str(self.single_value) + r += linesep + ' Collective: True' if self.collective else '' + r += (linesep + ' Superior: ' + list_to_string(self.superior)) if self.superior else '' + r += linesep + ' No user modification: True' if self.no_user_modification else '' + r += (linesep + ' Usage: ' + constant_to_attribute_usage(self.usage)) if self.usage else '' + r += (linesep + ' Equality rule: ' + list_to_string(self.equality)) if self.equality else '' + r += (linesep + ' Ordering rule: ' + list_to_string(self.ordering)) if self.ordering else '' + r += (linesep + ' Substring rule: ' + list_to_string(self.substring)) if self.substring else '' + r += (linesep + ' Syntax: ' + (self.syntax + (' [' + str(decode_syntax(self.syntax)))) + ']') if self.syntax else '' + r += (linesep + ' Minimum length: ' + str(self.min_length)) if isinstance(self.min_length, int) else '' + r += linesep + ' Mandatory in: ' + list_to_string(self.mandatory_in) if self.mandatory_in else '' + r += linesep + ' Optional in: ' + list_to_string(self.optional_in) if self.optional_in else '' + return 'Attribute type' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class LdapSyntaxInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.5) + """ + + def __init__(self, + oid=None, + description=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=None, + description=description, + obsolete=False, + extensions=extensions, + experimental=experimental, + definition=definition) + + def __repr__(self): + return 'LDAP syntax' + BaseObjectInfo.__repr__(self).replace('<__desc__>', '') + + +class DitContentRuleInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.6) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + auxiliary_classes=None, + must_contain=None, + may_contain=None, + not_contains=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + + self.auxiliary_classes = auxiliary_classes + self.must_contain = must_contain + self.may_contain = may_contain + self.not_contains = not_contains + + def __repr__(self): + r = (linesep + ' Auxiliary classes: ' + list_to_string(self.auxiliary_classes)) if self.auxiliary_classes else '' + r += (linesep + ' Must contain: ' + list_to_string(self.must_contain)) if self.must_contain else '' + r += (linesep + ' May contain: ' + list_to_string(self.may_contain)) if self.may_contain else '' + r += (linesep + ' Not contains: ' + list_to_string(self.not_contains)) if self.not_contains else '' + return 'DIT content rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class DitStructureRuleInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.7.1) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + name_form=None, + superior=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.superior = superior + self.name_form = name_form + + def __repr__(self): + r = (linesep + ' Superior rules: ' + list_to_string(self.superior)) if self.superior else '' + r += (linesep + ' Name form: ' + list_to_string(self.name_form)) if self.name_form else '' + return 'DIT content rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class NameFormInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.7.2) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + object_class=None, + must_contain=None, + may_contain=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.object_class = object_class + self.must_contain = must_contain + self.may_contain = may_contain + + def __repr__(self): + r = (linesep + ' Object class: ' + list_to_string(self.object_class)) if self.object_class else '' + r += (linesep + ' Must contain: ' + list_to_string(self.must_contain)) if self.must_contain else '' + r += (linesep + ' May contain: ' + list_to_string(self.may_contain)) if self.may_contain else '' + return 'DIT content rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4527.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4527.py new file mode 100644 index 0000000..6213daa --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/rfc4527.py @@ -0,0 +1,57 @@ +""" +""" + +# Created on 2016.12.23 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import NO_ATTRIBUTES, ALL_ATTRIBUTES, STRING_TYPES +from ..operation.search import build_attribute_selection +from .controls import build_control + + +def _read_control(oid, attributes, criticality=False): + if not attributes: + attributes = [NO_ATTRIBUTES] + elif attributes == ALL_ATTRIBUTES: + attributes = [ALL_ATTRIBUTES] + + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + value = build_attribute_selection(attributes, None) + return build_control(oid, criticality, value) + + +def pre_read_control(attributes, criticality=False): + """Create a pre-read control for a request. + When passed as a control to the controls parameter of an operation, it will + return the value in `Connection.result` before the operation took place. + """ + return _read_control('1.3.6.1.1.13.1', attributes, criticality) + + +def post_read_control(attributes, criticality=False): + """Create a post-read control for a request. + When passed as a control to the controls parameter of an operation, it will + return the value in `Connection.result` after the operation took place. + """ + return _read_control('1.3.6.1.1.13.2', attributes, criticality) + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1158d8652e20bb773e7ee799bc42d63a6b6bdeca GIT binary patch literal 146 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CU-tSXxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!#}LD8D2>IX_3gII%cKKR!M)FS8^*Uaz3?7Kcr4 QeoARhsvXGSVjyM!0Hr@98UO$Q literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/digestMd5.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/digestMd5.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7ba38a6a82fabc20053cb889ce210402830ed76 GIT binary patch literal 3894 zcmaJ^-ESO85wD)vZ?C`OY<%RLJzp+lI6J-s%;lo^NaQmL0<1gifNmtTT2GJdv1ezT z?%5=cb|s|nA0Qri1c_JPxOe^lka%hF1W$g>11L}Ys%O_;JK)*vp6aUZ>Z()N#mnNbuOD*d^b!G{6P&3ncL`Qe31? ziTo1gVO*lPOq~k(73x&UuTrN*e$Ddm$4HjRuam5htkSQs*Eq=<$uSF0kOXPm!jmL1 zoV4&1N&KfRJWXRFv$U2(S*gk8 z*E*WMgDxZLp%?VpA^k0e4;*?;)Cba~g92k-3pyw=a?2B&UdhxV9VI$zCqZb6JI7h5 zO({%*REE%~t@q<-$G9E2YDzNN3v~ufi_hC}H~b^1Y3%v-(Mr}iS~-f2mMxz+Ufz*m z_xO7+@2$kLee~Tyf27hZ4bpgpwO`43{Zy{rIXX5)uy5_(Vl7JONKA^lqh>&K` z`&88@7+j_*tRRL~_&&n}D*)-T3E)xh*Smgj7~VLLwX3aW;;8so0c9Sh(&MjRTU zt*Uu91GFiz$cJ(nu;yjC%vSCOM*sVWJ_6-3xvg+kD4fhY;;{OjP*Zqal%{MA7{2@z zv{4gY!}y#Di$JXNq^IaE6XjA9=8gml!jM^!4odJhaZt{k%Gos4{B%31^ePvOY6|8TgJ|ge5O8D4VtYa5Xc?mBE>R+scZw z#57E>E`SMp$Uinmp>N3Bxs^_@9XRLL4)}I>m_g_^bo!-B{`q}bbRRs^lnZ(cuzZ7$RgGMJD zRWGqS2&FvqpKi=MW@Mb8&a*!sw`UB7(4EX%tmwt>{U)UVq)S=cWOqz$`aWhLXRL?`T zoTbY_9EC~NWUHVYvGh)RFAAF2hl_~p5-#~#=92TfjEhahp*{jvHZt37Xa{SZMbA+S zK&l()G+T1SQcECuO#B#~cg3b4f67)}0h|X4MD18BK5pa2VWRkm%(M)->S@VHg+UfQ z54GZI#1!N7MX2(UfaNfyTzsUmRAlB=uVjQD;;;Q%onkQz(oR}9Sv5Ho8Cd7kf4JN^RcUR@W!{@Tu zlv^#C2CbH<>_kah2T`O@6H;D)zQ+*jZR3GIGyG1u!_ICy8wPBQP<;Q@BktH4?G3k= zHov}HgId?M8;>Z$^{BGn4V8zeio0?6Ij0THdzY?F;SSWDDRJF}Vs5=$ui1A0zv&P( AkpKVy literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/external.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/external.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8829ba7da4e7fbb170309d488fd19455b562804 GIT binary patch literal 412 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 V0%?@;)tlAp)o)jCSFcsy`)}8)vUdOg literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/plain.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/plain.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3352938bf1737123e761cde9421c7053e272d421 GIT binary patch literal 785 zcmZ`%O^?$s5PfzMryHqKsRU@H{R2hXR(wcYRtSkJS`OTDi9&2akP}C?!%}EZ%U?l= z-+=fTTyo{qGdE6*)2*~U;AEa>JfqRPXWySrvtM78`Y{21^@{~>mWQs4;VFEe9>&3~yvRy=77i_reR4WTt zI$gBtt?_l~Yt!!7K6^4II;*+`AA~oBEw6@*_P(tvBUKfK3@ar|$X<}Sp9CA={W$RH zmLCF+(`|GJA`0R#{x-pe!@j~MfoJd>o{BiG+0FknR3w4f=tZ!fk87j<*2b{kj%(xN zS|5jbHY^lfN7xE%1SupgcfY?P(4N~)F=)6NP?*dTxnO4w1{ zbjT{xwyFw>4ioadHQMEA+52~&YPol+S`MNsox74l+Ldc(=>F>+?5K_3I}eAFZ@3yT>=!S>sJ*^eT+E>U3GR%Wgen`%4VrL+a+v2*9S{ z-*sC!L5n7EL cZowTo8zvWxk-b*Wg1V00KE#6=o3VS*Kgx-&r~m)} literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/sasl.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/__pycache__/sasl.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaf0a7883386f0216b0a92e75829f31fa5927d89 GIT binary patch literal 4418 zcma)9&2JmW6`x&_ONydMN%1ETxLdnG%~T(jWXEn&7*Q=N5hBZiDAy<*VY}KLQtR%Q zXO@mANI+5N+6HK^MQ=Sc|3Z7nKhet`dg;mMUW#1W-<#!9B;}%Aa%bngH}B2+nm037 zXJ)E@`xEECd7rU=u#u;L{wH|lU(mRWwb5$K)tRrcHahqhn6I;-z}iKo5nN<`i3J90 z8yQ?;ewhUo)~*0Hm|JH46bq`XUCrPM^QT!*W9?c7PceUn1$EZ0v!KD+4PdLxon~KQ z_F3lEm^;JVI{OL=%rUpY+*w7MXD+~b)qjt<_+L`}OQdb9c{$apZ(#%5X=>?I&vC6a zYt^~~pxhI7=tco`kNC0gb^33~Y{13VdTSeBbMJBM+4jD*{%rp<>&fH&&z^2rJ5Tqm z*0bH+r+fR4H=24nx4p5xOXGJ1j~@#WiS&I!?b=d)83}hwKEX705{bT|IvQz%r-Ya0 zdxTd$(UpVGGv{jmhq7KyDl?Ym<}xQH?7N#=SaG(;4}6e^pdtoLbJQ zsiKz0sg<1iFGa14Q>Sw36^-Rm;xj#H;|>Yk!bk5g+oHCEKxI2BIIocmiv zof)Urb1KY-R`ql0b0pwdfzt4-$c|g&+Kq$H^N=-izQ1e8Qj7~PEC0>r_d*|j-b^BIEVu7@;MINmj>LRw3=7!-yx@}CLS+{ zeID>IG4nh%V-a;cpPRNcV=m0S%}00dtgL;M4Npv$cf62GGdbesO=60X+&70@Q75Cw zM0jC0quG8p5?*o?m@iriP3z%cNlDy?n0!W0Lb~+2A$QGAB+Q=VrWcwmrKGvu!<1p- zId?H8oeLDLMlb7Y5}4CI0-d(IKr^I~^RrlS8ypg>_;iH;Yg(`AWtTkq36jXD4>wd1rz>O)+q_Y$$`yndbc8Q zvap>5o{K)KuDgsGlhLH$t-#bAdR5qQgOpXnsaB;o$Xlu)qvF&j4TuJy>LYtH2 zNtSH56NQP0{C6;{O){L%@!y%6lT5MjUfapL6uL7xl;of5?L;otNrbdPCS@ipOmfH` zJk?d=FOGgVIob=6*CK*O#6im~_9;mcew@6+{_X$G@7T~83&l5)#F>)WQav{#*ZtE; zX&4fAIi)7F=+kOJ?LqQGEtiC0(IZzc3cBFo#O`(}%PtJv+&|fxoHffIq+&>GisDEf zxV=Zyu5UM0joCI2Js0WhP}PBLBv=a6Pxh9!>ysT}A+s&px1i(2X&20(Cle|o9Z#Tx zv8HdMbFSc^WM;~|{WqTGTw2XQm>#D!FSHWMe#==|O{a&@;R=o|@HnEqwwg{2*M*pZ zVxwHED`U{83}Z#U2D{l?W#g4r~a9Vn=t6RkC&4mUXHzZ(FYM^9z*e(x@>5lMU!z9C!NcupSjWdVcI;BLUWV?;Hu{qrgB@nb zg+=m1mB&1Ylm1Dmmvj~%G)tlio6@QWA&5!n@U(Q;PqFCa^mdWxv#!_?j*{Ew_RgP3;KM6ZeSvp@-^0)lSt)F%5J& zO~^fLqa0O$GAK1rPkVl{zuBBl>%-AYG){a#1In+tkf>0CY)`MpkxVS?bT0fDc2PON zA4j3&X_2sL1%i~5KGh}mD_b?@$ejqOByJ5s9B+Al^XK9SVPmSh`ZFkhbAq@ zcHfWeEVSZ7!r!MxMM<+J9eg#<+&sPd}a7D}~z68}qf9TKzxhnwk;- literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/digestMd5.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/digestMd5.py new file mode 100644 index 0000000..9fa4ae8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/digestMd5.py @@ -0,0 +1,159 @@ +""" +""" + +# Created on 2014.01.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from binascii import hexlify +import hashlib +import hmac + +from ... import SEQUENCE_TYPES +from ...protocol.sasl.sasl import abort_sasl_negotiation, send_sasl_negotiation, random_hex_string + + +STATE_KEY = 0 +STATE_VALUE = 1 + + +def md5_h(value): + if not isinstance(value, bytes): + value = value.encode() + + return hashlib.md5(value).digest() + + +def md5_kd(k, s): + if not isinstance(k, bytes): + k = k.encode() + + if not isinstance(s, bytes): + s = s.encode() + + return md5_h(k + b':' + s) + + +def md5_hex(value): + if not isinstance(value, bytes): + value = value.encode() + + return hexlify(value) + + +def md5_hmac(k, s): + if not isinstance(k, bytes): + k = k.encode() + + if not isinstance(s, bytes): + s = s.encode() + + return hmac.new(k, s, digestmod=hashlib.md5).hexdigest() + + +def sasl_digest_md5(connection, controls): + # sasl_credential must be a tuple made up of the following elements: (realm, user, password, authorization_id) or (realm, user, password, authorization_id, enable_signing) + # if realm is None will be used the realm received from the server, if available + if not isinstance(connection.sasl_credentials, SEQUENCE_TYPES) or not len(connection.sasl_credentials) in (4, 5): + return None + + # step One of RFC2831 + result = send_sasl_negotiation(connection, controls, None) + if 'saslCreds' in result and result['saslCreds'] is not None: + server_directives = decode_directives(result['saslCreds']) + else: + return None + + if 'realm' not in server_directives or 'nonce' not in server_directives or 'algorithm' not in server_directives: # mandatory directives, as per RFC2831 + abort_sasl_negotiation(connection, controls) + return None + + # step Two of RFC2831 + charset = server_directives['charset'] if 'charset' in server_directives and server_directives['charset'].lower() == 'utf-8' else 'iso8859-1' + user = connection.sasl_credentials[1].encode(charset) + realm = (connection.sasl_credentials[0] if connection.sasl_credentials[0] else (server_directives['realm'] if 'realm' in server_directives else '')).encode(charset) + password = connection.sasl_credentials[2].encode(charset) + authz_id = connection.sasl_credentials[3].encode(charset) if connection.sasl_credentials[3] else b'' + nonce = server_directives['nonce'].encode(charset) + cnonce = random_hex_string(16).encode(charset) + uri = b'ldap/' + connection.server.host.encode(charset) + qop = b'auth' + if len(connection.sasl_credentials) == 5 and connection.sasl_credentials[4] == 'sign' and not connection.server.ssl: + qop = b'auth-int' + connection._digest_md5_sec_num = 0 + + digest_response = b'username="' + user + b'",' + digest_response += b'realm="' + realm + b'",' + digest_response += (b'authzid="' + authz_id + b'",') if authz_id else b'' + digest_response += b'nonce="' + nonce + b'",' + digest_response += b'cnonce="' + cnonce + b'",' + digest_response += b'digest-uri="' + uri + b'",' + digest_response += b'qop=' + qop + b',' + digest_response += b'nc=00000001' + b',' + if charset == 'utf-8': + digest_response += b'charset="utf-8",' + + a0 = md5_h(b':'.join([user, realm, password])) + a1 = b':'.join([a0, nonce, cnonce, authz_id]) if authz_id else b':'.join([a0, nonce, cnonce]) + a2 = b'AUTHENTICATE:' + uri + (b':00000000000000000000000000000000' if qop in [b'auth-int', b'auth-conf'] else b'') + + if qop == b'auth-int': + connection._digest_md5_kis = md5_h(md5_h(a1) + b"Digest session key to server-to-client signing key magic constant") + connection._digest_md5_kic = md5_h(md5_h(a1) + b"Digest session key to client-to-server signing key magic constant") + + digest_response += b'response="' + md5_hex(md5_kd(md5_hex(md5_h(a1)), b':'.join([nonce, b'00000001', cnonce, qop, md5_hex(md5_h(a2))]))) + b'"' + + result = send_sasl_negotiation(connection, controls, digest_response) + return result + + +def decode_directives(directives_string): + """ + converts directives to dict, unquote values + """ + + # old_directives = dict((attr[0], attr[1].strip('"')) for attr in [line.split('=') for line in directives_string.split(',')]) + state = STATE_KEY + tmp_buffer = '' + quoting = False + key = '' + directives = dict() + for c in directives_string.decode('utf-8'): + if state == STATE_KEY and c == '=': + key = tmp_buffer + tmp_buffer = '' + state = STATE_VALUE + elif state == STATE_VALUE and c == '"' and not quoting and not tmp_buffer: + quoting = True + elif state == STATE_VALUE and c == '"' and quoting: + quoting = False + elif state == STATE_VALUE and c == ',' and not quoting: + directives[key] = tmp_buffer + tmp_buffer = '' + key = '' + state = STATE_KEY + else: + tmp_buffer += c + + if key and tmp_buffer: + directives[key] = tmp_buffer + + return directives diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/external.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/external.py new file mode 100644 index 0000000..7bb8bc1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/external.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2014.01.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...protocol.sasl.sasl import send_sasl_negotiation + + +def sasl_external(connection, controls): + result = send_sasl_negotiation(connection, controls, connection.sasl_credentials) + + return result diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/kerberos.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/kerberos.py new file mode 100644 index 0000000..05ce363 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/kerberos.py @@ -0,0 +1,302 @@ +""" +""" + +# Created on 2015.04.08 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# original code by Hugh Cole-Baker, modified by Peter Foley, modified again by Azaria Zornberg +# it needs the gssapi package +import base64 +import socket + +from ...core.exceptions import LDAPPackageUnavailableError, LDAPCommunicationError +from ...core.rdns import ReverseDnsSetting, get_hostname_by_addr, is_ip_addr + +posix_gssapi_unavailable = True +try: + # noinspection PyPackageRequirements,PyUnresolvedReferences + import gssapi + from gssapi.raw import ChannelBindings + posix_gssapi_unavailable = False +except ImportError: + pass + +windows_gssapi_unavailable = True +# only attempt to import winkerberos if gssapi is unavailable +if posix_gssapi_unavailable: + try: + import winkerberos + windows_gssapi_unavailable = False + except ImportError: + raise LDAPPackageUnavailableError('package gssapi (or winkerberos) missing') + +from .sasl import send_sasl_negotiation, abort_sasl_negotiation + + +NO_SECURITY_LAYER = 1 +INTEGRITY_PROTECTION = 2 +CONFIDENTIALITY_PROTECTION = 4 + + +def get_channel_bindings(ssl_socket): + try: + server_certificate = ssl_socket.getpeercert(True) + except: + # it is not SSL socket + return None + try: + from cryptography import x509 + from cryptography.hazmat.backends import default_backend + from cryptography.hazmat.primitives import hashes + except ImportError: + raise LDAPPackageUnavailableError('package cryptography missing') + cert = x509.load_der_x509_certificate(server_certificate, default_backend()) + hash_algorithm = cert.signature_hash_algorithm + # According to https://tools.ietf.org/html/rfc5929#section-4.1, we have to convert the the hash function for md5 and sha1 + if hash_algorithm.name in ('md5', 'sha1'): + digest = hashes.Hash(hashes.SHA256(), default_backend()) + else: + digest = hashes.Hash(hash_algorithm, default_backend()) + digest.update(server_certificate) + application_data = b'tls-server-end-point:' + digest.finalize() + # posix gssapi and windows winkerberos use different channel bindings classes + if not posix_gssapi_unavailable: + return ChannelBindings(application_data=application_data) + else: + return winkerberos.channelBindings(application_data=application_data) + + +def sasl_gssapi(connection, controls): + """ + Performs a bind using the Kerberos v5 ("GSSAPI") SASL mechanism + from RFC 4752. Does not support any security layers, only authentication! + + sasl_credentials can be empty or a tuple with one or two elements. + The first element determines which service principal to request a ticket for and can be one of the following: + + - None or False, to use the hostname from the Server object + - True to perform a reverse DNS lookup to retrieve the canonical hostname for the hosts IP address + - A string containing the hostname + + The optional second element is what authorization ID to request. + + - If omitted or None, the authentication ID is used as the authorization ID + - If a string, the authorization ID to use. Should start with "dn:" or "user:". + + The optional third element is a raw gssapi credentials structure which can be used over + the implicit use of a krb ccache. + """ + if not posix_gssapi_unavailable: + return _posix_sasl_gssapi(connection, controls) + else: + return _windows_sasl_gssapi(connection, controls) + + +def _common_determine_target_name(connection): + """ Common logic for determining our target name for kerberos negotiation, regardless of whether we are using + gssapi on a posix system or winkerberos on windows. + Returns a string in the form "ldap@" + a target hostname. + The hostname can either be user specified, come from the connection, or resolved using reverse DNS based + on parameters set in sasl_credentials. + The default if no sasl_credentials are specified is to use the host in the connection server object. + """ + # if we don't have any sasl_credentials specified, or the first entry is False (which is the legacy equivalent + # to ReverseDnsSetting.OFF that has value 0) then our gssapi name is just + if (not connection.sasl_credentials or len(connection.sasl_credentials) == 0 + or not connection.sasl_credentials[0]): + return 'ldap@' + connection.server.host + # older code will still be using a boolean True for the equivalent of + # ReverseDnsSetting.REQUIRE_RESOLVE_ALL_ADDRESSES + if connection.sasl_credentials[0] is True: + hostname = get_hostname_by_addr(connection.socket.getpeername()[0]) + target_name = 'ldap@' + hostname + elif connection.sasl_credentials[0] in ReverseDnsSetting.SUPPORTED_VALUES: + rdns_setting = connection.sasl_credentials[0] + # if the rdns_setting is OFF then we won't enter any branch here and will leave hostname as server host, + # so we'll just use the server host, whatever it is + peer_ip = connection.socket.getpeername()[0] + hostname = connection.server.host + if rdns_setting == ReverseDnsSetting.REQUIRE_RESOLVE_ALL_ADDRESSES: + # resolve our peer ip and use it as our target name + hostname = get_hostname_by_addr(peer_ip) + elif rdns_setting == ReverseDnsSetting.REQUIRE_RESOLVE_IP_ADDRESSES_ONLY: + # resolve our peer ip (if the server host is an ip address) and use it as our target name + if is_ip_addr(hostname): + hostname = get_hostname_by_addr(peer_ip) + elif rdns_setting == ReverseDnsSetting.OPTIONAL_RESOLVE_ALL_ADDRESSES: + # try to resolve our peer ip in dns and if we can, use it as our target name. + # if not, just use the server host + resolved_hostname = get_hostname_by_addr(peer_ip, success_required=False) + if resolved_hostname is not None: + hostname = resolved_hostname + elif rdns_setting == ReverseDnsSetting.OPTIONAL_RESOLVE_IP_ADDRESSES_ONLY: + # try to resolve our peer ip in dns if our server host is an ip. if we can, use it as our target + # name. if not, just use the server host + if is_ip_addr(hostname): + resolved_hostname = get_hostname_by_addr(peer_ip, success_required=False) + if resolved_hostname is not None: + hostname = resolved_hostname + # construct our target name + target_name = 'ldap@' + hostname + else: # string hostname directly provided + target_name = 'ldap@' + connection.sasl_credentials[0] + return target_name + + +def _common_determine_authz_id_and_creds(connection): + """ Given our connection, figure out the authorization id (i.e. the kerberos principal) and kerberos credentials + being used for our SASL bind. + On posix systems, we can actively negotiate with raw credentials and receive a kerberos client ticket during our + SASL bind. So credentials can be specified. + However, on windows systems, winkerberos expects to use the credentials cached by the system because windows + machines are generally domain-joined. So no initiation is supported, as the TGT must already be valid prior + to beginning the SASL bind, and the windows system credentials will be used as needed with that. + """ + authz_id = b"" + creds = None + # the default value for credentials is only something we should instantiate on systems using the + # posix GSSAPI, as windows kerberos expects that a tgt already exists (i.e. the machine is domain-joined) + # and does not support initiation from raw credentials + if not posix_gssapi_unavailable: + creds = gssapi.Credentials(name=gssapi.Name(connection.user), usage='initiate', store=connection.cred_store) if connection.user else None + if connection.sasl_credentials: + if len(connection.sasl_credentials) >= 2 and connection.sasl_credentials[1]: + authz_id = connection.sasl_credentials[1].encode("utf-8") + if len(connection.sasl_credentials) >= 3 and connection.sasl_credentials[2]: + if posix_gssapi_unavailable: + raise LDAPPackageUnavailableError('The winkerberos package does not support specifying raw credentials' + 'to initiate GSSAPI Kerberos communication. A ticket granting ticket ' + 'must have already been obtained for the user before beginning a ' + 'SASL bind.') + raw_creds = connection.sasl_credentials[2] + creds = gssapi.Credentials(base=raw_creds, usage='initiate', store=connection.cred_store) + return authz_id, creds + + +def _common_process_end_token_get_security_layers(negotiated_token): + """ Process the response we got at the end of our SASL negotiation wherein the server told us what + minimum security layers we need, and return a bytearray for the client security layers we want. + This function throws an error on a malformed token from the server. + The ldap3 library does not support security layers, and only supports authentication with kerberos, + so an error will be thrown for any tokens that indicate a security layer requirement. + """ + if len(negotiated_token) != 4: + raise LDAPCommunicationError("Incorrect response from server") + + server_security_layers = negotiated_token[0] + if not isinstance(server_security_layers, int): + server_security_layers = ord(server_security_layers) + if server_security_layers in (0, NO_SECURITY_LAYER): + if negotiated_token[1:] != '\x00\x00\x00': + raise LDAPCommunicationError("Server max buffer size must be 0 if no security layer") + if not (server_security_layers & NO_SECURITY_LAYER): + raise LDAPCommunicationError("Server requires a security layer, but this is not implemented") + + # this is here to encourage anyone implementing client security layers to do it + # for both windows and posix + client_security_layers = bytearray([NO_SECURITY_LAYER, 0, 0, 0]) + return client_security_layers + +def _posix_sasl_gssapi(connection, controls): + """ Performs a bind using the Kerberos v5 ("GSSAPI") SASL mechanism + from RFC 4752 using the gssapi package that works natively on most + posix operating systems. + """ + target_name = gssapi.Name(_common_determine_target_name(connection), gssapi.NameType.hostbased_service) + authz_id, creds = _common_determine_authz_id_and_creds(connection) + + ctx = gssapi.SecurityContext(name=target_name, mech=gssapi.MechType.kerberos, creds=creds, + channel_bindings=get_channel_bindings(connection.socket)) + in_token = None + try: + while True: + out_token = ctx.step(in_token) + if out_token is None: + out_token = '' + result = send_sasl_negotiation(connection, controls, out_token) + in_token = result['saslCreds'] + try: + # This raised an exception in gssapi<1.1.2 if the context was + # incomplete, but was fixed in + # https://github.com/pythongssapi/python-gssapi/pull/70 + if ctx.complete: + break + except gssapi.exceptions.MissingContextError: + pass + + unwrapped_token = ctx.unwrap(in_token) + client_security_layers = _common_process_end_token_get_security_layers(unwrapped_token.message) + out_token = ctx.wrap(bytes(client_security_layers)+authz_id, False) + return send_sasl_negotiation(connection, controls, out_token.message) + except (gssapi.exceptions.GSSError, LDAPCommunicationError): + abort_sasl_negotiation(connection, controls) + raise + + +def _windows_sasl_gssapi(connection, controls): + """ Performs a bind using the Kerberos v5 ("GSSAPI") SASL mechanism + from RFC 4752 using the winkerberos package that works natively on most + windows operating systems. + """ + target_name = _common_determine_target_name(connection) + # initiation happens before beginning the SASL bind when using windows kerberos + authz_id, _ = _common_determine_authz_id_and_creds(connection) + gssflags = ( + winkerberos.GSS_C_MUTUAL_FLAG | + winkerberos.GSS_C_SEQUENCE_FLAG | + winkerberos.GSS_C_INTEG_FLAG | + winkerberos.GSS_C_CONF_FLAG + ) + _, ctx = winkerberos.authGSSClientInit(target_name, gssflags=gssflags) + + in_token = b'' + try: + negotiation_complete = False + while not negotiation_complete: + # GSSAPI is a "client goes first" SASL mechanism. Send the first "response" to the server and + # recieve its first challenge. + # Despite this, we can get channel binding, which includes CBTs for windows environments computed from + # the peer certificate, before starting. + status = winkerberos.authGSSClientStep(ctx, base64.b64encode(in_token).decode('utf-8'), + channel_bindings=get_channel_bindings(connection.socket)) + # figure out if we're done with our sasl negotiation + negotiation_complete = (status == winkerberos.AUTH_GSS_COMPLETE) + out_token = winkerberos.authGSSClientResponse(ctx) or '' + out_token_bytes = base64.b64decode(out_token) + result = send_sasl_negotiation(connection, controls, out_token_bytes) + in_token = result['saslCreds'] or b'' + + winkerberos.authGSSClientUnwrap( ctx,base64.b64encode(in_token).decode('utf-8')) + negotiated_token = '' + if winkerberos.authGSSClientResponse(ctx): + negotiated_token = base64.standard_b64decode(winkerberos.authGSSClientResponse(ctx)) + client_security_layers = _common_process_end_token_get_security_layers(negotiated_token) + # manually construct a message indicating use of authorization-only layer + # see winkerberos example: https://github.com/mongodb/winkerberos/blob/master/test/test_winkerberos.py + authz_only_msg = base64.b64encode(bytes(client_security_layers) + authz_id).decode('utf-8') + winkerberos.authGSSClientWrap(ctx, authz_only_msg) + out_token = winkerberos.authGSSClientResponse(ctx) or '' + + return send_sasl_negotiation(connection, controls, base64.b64decode(out_token)) + except (winkerberos.GSSError, LDAPCommunicationError): + abort_sasl_negotiation(connection, controls) + raise diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/plain.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/plain.py new file mode 100644 index 0000000..f7f7456 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/plain.py @@ -0,0 +1,70 @@ +""" +""" + +# Created on 2014.01.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# payload for PLAIN mechanism +# message = [authzid] UTF8NUL authcid UTF8NUL passwd +# authcid = 1*SAFE ; MUST accept up to 255 octets +# authzid = 1*SAFE ; MUST accept up to 255 octets +# passwd = 1*SAFE ; MUST accept up to 255 octets +# UTF8NUL = %x00 ; UTF-8 encoded NUL character +# +# SAFE = UTF1 / UTF2 / UTF3 / UTF4 +# ;; any UTF-8 encoded Unicode character except NUL +# +# UTF1 = %x01-7F ;; except NUL +# UTF2 = %xC2-DF UTF0 +# UTF3 = %xE0 %xA0-BF UTF0 / %xE1-EC 2(UTF0) / +# %xED %x80-9F UTF0 / %xEE-EF 2(UTF0) +# UTF4 = %xF0 %x90-BF 2(UTF0) / %xF1-F3 3(UTF0) / +# %xF4 %x80-8F 2(UTF0) +# UTF0 = %x80-BF + +from ...protocol.sasl.sasl import send_sasl_negotiation +from .sasl import sasl_prep +from ...utils.conv import to_raw, to_unicode + + +def sasl_plain(connection, controls): + authzid = connection.sasl_credentials[0] + authcid = connection.sasl_credentials[1] + passwd = connection.sasl_credentials[2] + + payload = b'' + if authzid: + payload += to_raw(sasl_prep(to_unicode(authzid))) + + payload += b'\0' + + if authcid: + payload += to_raw(sasl_prep(to_unicode(authcid))) + + payload += b'\0' + + if passwd: + payload += to_raw(sasl_prep(to_unicode(passwd))) + + result = send_sasl_negotiation(connection, controls, payload) + + return result diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/sasl.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/sasl.py new file mode 100644 index 0000000..30fe0e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/sasl/sasl.py @@ -0,0 +1,171 @@ +""" +""" + +# Created on 2013.09.11 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import stringprep +from unicodedata import ucd_3_2_0 as unicode32 +from os import urandom +from binascii import hexlify + +from ... import SASL +from ...core.results import RESULT_AUTH_METHOD_NOT_SUPPORTED +from ...core.exceptions import LDAPSASLPrepError, LDAPPasswordIsMandatoryError + + +def sasl_prep(data): + """ + implement SASLPrep profile as per RFC4013: + it defines the "SASLprep" profile of the "stringprep" algorithm [StringPrep]. + The profile is designed for use in Simple Authentication and Security + Layer ([SASL]) mechanisms, such as [PLAIN], [CRAM-MD5], and + [DIGEST-MD5]. It may be applicable where simple user names and + passwords are used. This profile is not intended for use in + preparing identity strings that are not simple user names (e.g., + email addresses, domain names, distinguished names), or where + identity or password strings that are not character data, or require + different handling (e.g., case folding). + """ + + # mapping + prepared_data = '' + for c in data: + if stringprep.in_table_c12(c): + # non-ASCII space characters [StringPrep, C.1.2] that can be mapped to SPACE (U+0020) + prepared_data += ' ' + elif stringprep.in_table_b1(c): + # the "commonly mapped to nothing" characters [StringPrep, B.1] that can be mapped to nothing. + pass + else: + prepared_data += c + + # normalizing + # This profile specifies using Unicode normalization form KC + # The repertoire is Unicode 3.2 as per RFC 4013 (2) + + prepared_data = unicode32.normalize('NFKC', prepared_data) + + if not prepared_data: + raise LDAPSASLPrepError('SASLprep error: unable to normalize string') + + # prohibit + for c in prepared_data: + if stringprep.in_table_c12(c): + # Non-ASCII space characters [StringPrep, C.1.2] + raise LDAPSASLPrepError('SASLprep error: non-ASCII space character present') + elif stringprep.in_table_c21(c): + # ASCII control characters [StringPrep, C.2.1] + raise LDAPSASLPrepError('SASLprep error: ASCII control character present') + elif stringprep.in_table_c22(c): + # Non-ASCII control characters [StringPrep, C.2.2] + raise LDAPSASLPrepError('SASLprep error: non-ASCII control character present') + elif stringprep.in_table_c3(c): + # Private Use characters [StringPrep, C.3] + raise LDAPSASLPrepError('SASLprep error: private character present') + elif stringprep.in_table_c4(c): + # Non-character code points [StringPrep, C.4] + raise LDAPSASLPrepError('SASLprep error: non-character code point present') + elif stringprep.in_table_c5(c): + # Surrogate code points [StringPrep, C.5] + raise LDAPSASLPrepError('SASLprep error: surrogate code point present') + elif stringprep.in_table_c6(c): + # Inappropriate for plain text characters [StringPrep, C.6] + raise LDAPSASLPrepError('SASLprep error: inappropriate for plain text character present') + elif stringprep.in_table_c7(c): + # Inappropriate for canonical representation characters [StringPrep, C.7] + raise LDAPSASLPrepError('SASLprep error: inappropriate for canonical representation character present') + elif stringprep.in_table_c8(c): + # Change display properties or deprecated characters [StringPrep, C.8] + raise LDAPSASLPrepError('SASLprep error: change display property or deprecated character present') + elif stringprep.in_table_c9(c): + # Tagging characters [StringPrep, C.9] + raise LDAPSASLPrepError('SASLprep error: tagging character present') + + # check bidi + # if a string contains any r_and_al_cat character, the string MUST NOT contain any l_cat character. + flag_r_and_al_cat = False + flag_l_cat = False + for c in prepared_data: + if stringprep.in_table_d1(c): + flag_r_and_al_cat = True + elif stringprep.in_table_d2(c): + flag_l_cat = True + + if flag_r_and_al_cat and flag_l_cat: + raise LDAPSASLPrepError('SASLprep error: string cannot contain (R or AL) and L bidirectional chars') + + # If a string contains any r_and_al_cat character, a r_and_al_cat character MUST be the first character of the string + # and a r_and_al_cat character MUST be the last character of the string. + if flag_r_and_al_cat and not stringprep.in_table_d1(prepared_data[0]) and not stringprep.in_table_d2(prepared_data[-1]): + raise LDAPSASLPrepError('r_and_al_cat character present, must be first and last character of the string') + + return prepared_data + + +def validate_simple_password(password, accept_empty=False): + """ + validate simple password as per RFC4013 using sasl_prep: + """ + + if accept_empty and not password: + return password + elif not password: + raise LDAPPasswordIsMandatoryError("simple password can't be empty") + + if not isinstance(password, bytes): # bytes are returned raw, as per RFC (4.2) + password = sasl_prep(password) + if not isinstance(password, bytes): + password = password.encode('utf-8') + + return password + + +def abort_sasl_negotiation(connection, controls): + from ...operation.bind import bind_operation + + request = bind_operation(connection.version, SASL, None, None, '', None) + response = connection.post_send_single_response(connection.send('bindRequest', request, controls)) + if connection.strategy.sync: + result = connection.result + else: + result = connection.get_response(response)[0][0] + + return True if result['result'] == RESULT_AUTH_METHOD_NOT_SUPPORTED else False + + +def send_sasl_negotiation(connection, controls, payload): + from ...operation.bind import bind_operation + + request = bind_operation(connection.version, SASL, None, None, connection.sasl_mechanism, payload) + response = connection.post_send_single_response(connection.send('bindRequest', request, controls)) + + if connection.strategy.sync: + result = connection.result + else: + _, result = connection.get_response(response) + + return result + + +def random_hex_string(size): + return str(hexlify(urandom(size)).decode('ascii')) # str fix for Python 2 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9145bdf8939752a3c6b810efd41bb756789ebf30 GIT binary patch literal 149 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CUrzcZxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!#}LD8D2>IX_3gI5{IVH?dehK0Y%qvm`!Vub}c4 ThfQvNN@-529mworAZ7pnA6_L+ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2d7c25e8c2d72525438576ea00fe6a46e040521 GIT binary patch literal 330815 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⪚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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/edir888.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/edir888.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7c82a5b9c0432177e971a84d732bc2d8a99d3fe GIT binary patch literal 176098 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/edir914.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/edir914.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fe4c3275ef0bc8d6a049959efb35ee91b6baac2 GIT binary patch literal 180366 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 I-GBXm0V_6SI{*Lx literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/slapd24.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/__pycache__/slapd24.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..093f8ef4120e4eef100c563c8d01a4d1251bccd9 GIT binary patch literal 127848 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 F{x{+O5qtmu literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ad2012R2.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ad2012R2.py new file mode 100644 index 0000000..1712613 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ad2012R2.py @@ -0,0 +1,2232 @@ +""" +""" + +# Created on 2014.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +ad_2012_r2_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 1.2.840.113556.1.4.149 NAME 'attributeSecurityGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1703 NAME 'msDS-FilterContainers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.655 NAME 'legacyExchangeDN' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.21 NAME 'cOMProgID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2147 NAME 'msDNS-PropagationTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.301 NAME 'msSFU30KeyAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.686 NAME 'domainID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.23 NAME 'msDFSR-ReplicationGroupGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.818 NAME 'productCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.221 NAME 'sAMAccountName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.375 NAME 'systemFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.814 NAME 'msiScript' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.880 NAME 'fRSTimeLastCommand' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1850 NAME 'msDS-TopQuotaUsage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2052 NAME 'msDS-OIDToGroupLinkBl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.965 NAME 'mSMQSiteName' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1373 NAME 'mS-SQL-Clustered' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.624 NAME 'ipsecOwnersReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1353 NAME 'localizationDisplayId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1637 NAME 'msWMI-StringValidValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2103 NAME 'msDS-MembersOfResourcePropertyList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.480 NAME 'defaultGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.55 NAME 'dBCSPwd' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1330 NAME 'pKICriticalExtensions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.93 NAME 'pwdProperties' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1840 NAME 'msDS-ObjectReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.7 NAME 'subRefs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.845 NAME 'msiScriptName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2242 NAME 'msDS-MaximumRegistrationInactivityPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.713 NAME 'optionsLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.942 NAME 'mSMQVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2138 NAME 'msDNS-NSEC3Iterations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.471 NAME 'trustParent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1237 NAME 'mSMQRoutingService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.649 NAME 'primaryInternationalISDNNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1627 NAME 'msWMI-ID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2006 NAME 'msTSExpireDate4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2003 NAME 'msTSExpireDate3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2000 NAME 'msTSExpireDate2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113549.1.9.8 NAME 'unstructuredAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.340 NAME 'msSFU30Domains' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.2069 NAME 'msDS-EnabledFeatureBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.6 NAME 'shadowMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1412 NAME 'primaryGroupToken' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.358 NAME 'netbootInitialization' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2136 NAME 'msDNS-NSEC3HashAlgorithm' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.1 NAME 'instanceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.846 NAME 'msiScriptSize' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.20 NAME 'msDFSR-RdcMinFileSizeInKb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.663 NAME 'partialAttributeDeletionList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2078 NAME 'msTSSecondaryDesktopBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1995 NAME 'msTSManagingLS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.371 NAME 'rIDAllocationPool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.677 NAME 'replTopologyStayOfExecution' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.3 NAME 'replPropertyMetaData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2036 NAME 'msDFS-Commentv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.329 NAME 'versionNumberLo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.234 NAME 'printEndTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1673 NAME 'msPKI-OID-User-Notice' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.684 NAME 'certificateAuthorityObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.290 NAME 'printNumberUp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1625 NAME 'msWMI-ClassDefinition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1784 NAME 'msDS-LogonTimeSyncInterval' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1910 NAME 'unixUserPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.129 NAME 'trustAuthIncoming' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1319 NAME 'aCSNonReservedTokenSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1628 NAME 'msWMI-IntDefault' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1249 NAME 'proxiedObjectName' SYNTAX '1.2.840.113556.1.4.903' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2173 NAME 'msKds-PublicKeyLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.27 NAME 'destinationIndicator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.2187 NAME 'msDS-ValueTypeReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.897 NAME 'aCSMaxAggregatePeakRatePerUser' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1335 NAME 'pKIEnrollmentAccess' SYNTAX '1.2.840.113556.1.4.907' )", + "( 1.2.840.113556.1.4.1708 NAME 'msDS-ReplValueMetaData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1690 NAME 'adminMultiselectPropertyPages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.35 NAME 'userPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2200 NAME 'msDS-GroupMSAMembership' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.500 NAME 'fRSServiceCommand' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2038 NAME 'msDFS-TargetListv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.27 NAME 'msDFSR-DeletedSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1648 NAME 'msWMI-TargetPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1793 NAME 'msDS-NonMembers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.3.6.1.1.1.1.22 NAME 'macAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.265 NAME 'notes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2274 NAME 'msDS-CloudIssuerPublicCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1982 NAME 'msTSMaxConnectionTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1959 NAME 'msDS-isGC' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1424 NAME 'msCOM-PartitionSetLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.516 NAME 'serverReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1977 NAME 'msTSHomeDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1369 NAME 'mS-SQL-ServiceAccount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.530 NAME 'nonSecurityMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.506 NAME 'objectCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1386 NAME 'mS-SQL-GPSLongitude' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1437 NAME 'msPKI-Supersede-Templates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1707 NAME 'msDS-ReplAttributeMetaData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.652 NAME 'assistant' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1644 NAME 'msWMI-SourceOrganization' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1443 NAME 'msDS-Site-Affinity' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.286 NAME 'printRateUnit' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1444 NAME 'msDS-Preferred-GC-Site' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.589 NAME 'meetingBandwidth' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.1706 NAME 'msDS-NCReplOutboundNeighbors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1709 NAME 'msDS-HasInstantiatedNCs' SYNTAX '1.2.840.113556.1.4.903' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.79 NAME 'minPwdLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1952 NAME 'ms-net-ieee-80211-GP-PolicyData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.865 NAME 'pekList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.26 NAME 'registeredAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2179 NAME 'msKds-CreateTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2149 NAME 'msDNS-NSEC3CurrentSalt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1815 NAME 'msDS-TasksForAzRoleBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2148 NAME 'msDNS-NSEC3UserSalt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2197 NAME 'msDS-ManagedPasswordId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1407 NAME 'mS-SQL-ThirdParty' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.510 NAME 'serviceBindingInformation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1416 NAME 'mSMQSiteNameEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1426 NAME 'msCOM-UserPartitionSetLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1303 NAME 'tokenGroupsNoGCAcceptable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.596 NAME 'msExchHouseIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2233 NAME 'msDS-cloudExtensionAttribute20' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.335 NAME 'currentLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.20 NAME 'homePhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1441 NAME 'msDS-Cached-Membership' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.14 NAME 'msDFSR-Schedule' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.622 NAME 'ipsecDataType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.645 NAME 'userCert' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.367 NAME 'rpcNsCodeset' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.223 NAME 'serverName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.950 NAME 'mSMQServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2250 NAME 'msDS-DeviceOSVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.332 NAME 'birthLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1440 NAME 'msDs-Schema-Extensions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1348 NAME 'gPCMachineExtensionNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1833 NAME 'msDS-ExternalKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.858 NAME 'netbootTools' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1717 NAME 'msDS-AdditionalDnsHostName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.770 NAME 'aCSEnableACSService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.170 NAME 'systemOnly' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.32 NAME 'domainPolicyObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.766 NAME 'aCSAllocableRSVPBandwidth' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.9 NAME 'helpData32' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1805 NAME 'msDS-AzGenerateAudits' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.276 NAME 'driverVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1317 NAME 'aCSMinimumDelayVariation' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.302 NAME 'sAMAccountType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.610 NAME 'employeeNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.30 NAME 'attributeID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTTL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1843 NAME 'msDRM-IdentityCertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.13.3.103 NAME 'msDFSR-ComputerReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1989 NAME 'msTSWorkDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1674 NAME 'msPKI-Certificate-Application-Policy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.716 NAME 'mscopeId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.514 NAME 'physicalLocationObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.570 NAME 'meetingProtocol' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.2.370 NAME 'objectClassCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.15 NAME 'msDFSR-Keywords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.812 NAME 'createWizardExt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.61 NAME 'lockOutObservationWindow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.750 NAME 'groupType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1459 NAME 'msDS-Behavior-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.937 NAME 'mSMQSignKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.913 NAME 'allowedAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.120 NAME 'uSNChanged' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.340 NAME 'rightsGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.277 NAME 'otherHomePhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1309 NAME 'mSMQInterval2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1439 NAME 'msPKI-Certificate-Policy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1308 NAME 'mSMQInterval1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1383 NAME 'mS-SQL-ConnectionURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2176 NAME 'msKds-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.859 NAME 'netbootLocallyInstalledOSes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.967 NAME 'mSMQSignCertificatesMig' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2232 NAME 'msDS-cloudExtensionAttribute19' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2231 NAME 'msDS-cloudExtensionAttribute18' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2230 NAME 'msDS-cloudExtensionAttribute17' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2229 NAME 'msDS-cloudExtensionAttribute16' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2228 NAME 'msDS-cloudExtensionAttribute15' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2227 NAME 'msDS-cloudExtensionAttribute14' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2226 NAME 'msDS-cloudExtensionAttribute13' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2225 NAME 'msDS-cloudExtensionAttribute12' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2142 NAME 'msDNS-SecureDelegationPollingPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2224 NAME 'msDS-cloudExtensionAttribute11' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.718 NAME 'dhcpProperties' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2223 NAME 'msDS-cloudExtensionAttribute10' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.157 NAME 'serverRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1394 NAME 'mS-SQL-AllowAnonymousSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.563 NAME 'shellPropertyPages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1315 NAME 'aCSMinimumPolicedSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.273 NAME 'printStatus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.644 NAME 'showInAddressBook' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.626 NAME 'ipsecISAKMPReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1925 NAME 'msDS-hasFullReplicaNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.940 NAME 'mSMQCSPName' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.30 NAME 'msDFSR-MinDurationCacheInMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.243 NAME 'printColor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2193 NAME 'msDS-TDOIngressBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1993 NAME 'msTSExpireDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 2.5.4.2 NAME 'knowledgeInformation' SYNTAX '1.2.840.113556.1.4.905' )", + "( 1.2.840.113556.1.4.908 NAME 'extendedClassInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.953 NAME 'mSMQSiteID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2040 NAME 'msDFS-LinkSecurityDescriptorv2' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1343 NAME 'dSUIAdminNotification' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1700 NAME 'msTAPI-ConferenceBlob' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.486 NAME 'fRSWorkingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.62 NAME 'scriptPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1810 NAME 'msDS-TasksForAzTask' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.13.3.31 NAME 'msDFSR-MaxAgeInCacheInMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.19 NAME 'cOMClassID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.108 NAME 'remoteSourceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.704 NAME 'dhcpServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.876 NAME 'fRSMemberReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2261 NAME 'msDS-DeviceLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.82 NAME 'moniker' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.289 NAME 'printMediaReady' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1209 NAME 'shortServerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.910 NAME 'fromEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.636 NAME 'privilegeAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2025 NAME 'msDS-IsUserCachableAtRodc' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1715 NAME 'msDS-SPNSuffixes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.562 NAME 'adminPropertyPages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 2.5.4.49 NAME 'distinguishedName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1356 NAME 'validAccesses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2053 NAME 'msImaging-PSPIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.459 NAME 'machineWidePolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1403 NAME 'mS-SQL-AllowKnownPullSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.283 NAME 'assetNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.885 NAME 'terminalServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2012 NAME 'msDS-MinimumPasswordAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.7 NAME 'msDFSR-ConflictPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1831 NAME 'msDS-ByteArray' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.135 NAME 'trustAuthOutgoing' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2258 NAME 'msDS-RegisteredOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.608 NAME 'queryPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.109 NAME 'replicaSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2296 NAME 'msDS-AssignedAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.402 NAME 'helpData16' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.232 NAME 'defaultPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1388 NAME 'mS-SQL-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.364 NAME 'operatingSystemVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2284 NAME 'msDS-ServiceTGTLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1460 NAME 'msDS-User-Account-Control-Computed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.75 NAME 'maxRenewAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.285 NAME 'printRate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.911 NAME 'allowedChildClasses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.615 NAME 'personalTitle' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1225 NAME 'mSMQPrevSiteGates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2131 NAME 'msDNS-SignWithNSEC3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2007 NAME 'msTSLicenseVersion4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 0.9.2342.19200300.100.1.3 NAME 'mail' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2004 NAME 'msTSLicenseVersion3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2001 NAME 'msTSLicenseVersion2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.507 NAME 'volumeCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.137 NAME 'uNCName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2022 NAME 'msDS-ResultantPSO' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.168 NAME 'modifiedCount' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1809 NAME 'msDS-OperationsForAzTaskBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.328 NAME 'versionNumberHi' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2099 NAME 'msDS-ClaimAttributeSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.754 NAME 'rpcNsEntryFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.778 NAME 'aCSDSBMDeadTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.917 NAME 'mSMQQueueType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.326 NAME 'packageName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.422 NAME 'domainPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2241 NAME 'msDS-RegistrationQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.3 NAME 'msDFSR-RootPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1817 NAME 'msDS-AzApplicationVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.436 NAME 'directReports' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.240 NAME 'printOrientationsSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.574 NAME 'meetingLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.43 NAME 'fRSVersionGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.30 NAME 'supportedApplicationContext' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.26 NAME 'rDNAttID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1409 NAME 'masteredBy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.752 NAME 'userSharedFolderOther' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2199 NAME 'msDS-ManagedPasswordInterval' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1932 NAME 'msDS-IsFullReplicaFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.22 NAME 'msDFSR-RootFence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.789 NAME 'transportDLLName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.499 NAME 'contextMenu' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.202 NAME 'auditingPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.11 NAME 'msDFSR-TombstoneExpiryInMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1364 NAME 'mS-SQL-RegisteredOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.8 NAME 'userClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.775 NAME 'aCSMaxSizeOfRSVPLogFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.144 NAME 'operatorCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1238 NAME 'mSMQDsService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1984 NAME 'msTSReconnectionAction' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2286 NAME 'msDS-AssignedAuthNPolicySiloBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2180 NAME 'msImaging-ThumbprintHash' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.68 NAME 'machineArchitecture' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.1311 NAME 'printDuplexSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1795 NAME 'msDS-AzDomainTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1992 NAME 'msTSProperty02' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.583 NAME 'meetingURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1991 NAME 'msTSProperty01' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.635 NAME 'privilegeValue' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2100 NAME 'msDS-ClaimTypeAppliesToClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.115 NAME 'invocationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2288 NAME 'msDS-AuthNPolicySiloMembersBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1681 NAME 'msWMI-intFlags4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1680 NAME 'msWMI-intFlags3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1679 NAME 'msWMI-intFlags2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1678 NAME 'msWMI-intFlags1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.100 NAME 'msDFSR-MemberReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.100 NAME 'priorValue' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1379 NAME 'mS-SQL-Vines' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1377 NAME 'mS-SQL-TCPIP' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2172 NAME 'msKds-SecretAgreementParam' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2222 NAME 'msDS-cloudExtensionAttribute9' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2221 NAME 'msDS-cloudExtensionAttribute8' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2220 NAME 'msDS-cloudExtensionAttribute7' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2219 NAME 'msDS-cloudExtensionAttribute6' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2218 NAME 'msDS-cloudExtensionAttribute5' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.661 NAME 'isDefunct' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2217 NAME 'msDS-cloudExtensionAttribute4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.653 NAME 'managedBy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2216 NAME 'msDS-cloudExtensionAttribute3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2215 NAME 'msDS-cloudExtensionAttribute2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2214 NAME 'msDS-cloudExtensionAttribute1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.588 NAME 'meetingEndTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' )", + "( 1.2.840.113556.1.4.498 NAME 'creationWizard' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1915 NAME 'msRADIUS-FramedIpv6Prefix' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.12 NAME 'msDFSR-FileFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.24 NAME 'x121Address' SYNTAX '1.3.6.1.4.1.1466.115.121.1.36' )", + "( 1.2.840.113556.1.4.637 NAME 'privilegeHolder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.214 NAME 'originalDisplayTableMSDOS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.211 NAME 'schedule' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1228 NAME 'mSMQDsServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.64 NAME 'logonHours' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.883 NAME 'msRRASVendorAttributeEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.58 NAME 'localeID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.97 NAME 'preferredOU' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2033 NAME 'msDFS-NamespaceIdentityGUIDv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1334 NAME 'pKIDefaultCSPs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1411 NAME 'ms-DS-MachineAccountQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.891 NAME 'gPLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.617 NAME 'homePostalAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.320 NAME 'implementedCategories' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.19 NAME 'uSNCreated' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.651 NAME 'otherMailbox' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.345 NAME 'msSFU30NSMAPFieldPosition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.618 NAME 'wellKnownObjects' SYNTAX '1.2.840.113556.1.4.903' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2160 NAME 'msDS-ClaimIsSingleValued' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.1 NAME 'msDFSR-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.874 NAME 'fRSFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1713 NAME 'MSMQ-SecuredSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.825 NAME 'enrollmentProviders' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.666 NAME 'syncAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.665 NAME 'syncMembership' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.48 NAME 'keywords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2169 NAME 'msKds-KDFAlgorithmID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.370 NAME 'rIDAvailablePool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.214 NAME 'nextLevelStore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1145 NAME 'msRADIUSCallbackNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.303 NAME 'msSFU30IntraFieldSeparator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.346 NAME 'desktopProfile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.20 NAME 'cOMInterfaceID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.279 NAME 'printMinXExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1213 NAME 'assocNTAccount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.671 NAME 'msiFileList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2032 NAME 'msDFS-GenerationGUIDv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2279 NAME 'msDS-UserTGTLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.10 NAME 'msDFSR-ReplicationGroupType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1790 NAME 'msDS-PerUserTrustTombstonesQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1124 NAME 'msNPCallingStationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.487 NAME 'fRSRootPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1807 NAME 'msDS-MembersForAzRoleBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1823 NAME 'msieee80211-ID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.791 NAME 'transportType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.674 NAME 'rootTrust' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1641 NAME 'msWMI-PropertyName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.25 NAME 'mayContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.4.1438 NAME 'msPKI-RA-Policies' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.769 NAME 'aCSEventLogLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.945 NAME 'mSMQSiteGates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.25 NAME 'internationalISDNNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.36' )", + "( 1.2.840.113556.1.4.1979 NAME 'msTSAllowLogon' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.274 NAME 'printSpooling' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.242 NAME 'printCollate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1345 NAME 'dSUIShellMaximum' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.693 NAME 'pendingCACertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2257 NAME 'msDS-DeviceObjectVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.852 NAME 'netbootCurrentClientCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.534 NAME 'fRSLevelLimit' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1685 NAME 'msWMI-Parm4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1684 NAME 'msWMI-Parm3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1988 NAME 'msTSDefaultToMainPrinter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1913 NAME 'msRADIUS-FramedInterfaceId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.353 NAME 'displayNamePrintable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1696 NAME 'lastLogonTimestamp' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1683 NAME 'msWMI-Parm2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.330 NAME 'lastUpdateSequence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.696 NAME 'currentParentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.689 NAME 'cRLObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1682 NAME 'msWMI-Parm1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.22 NAME 'governsID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1632 NAME 'msWMI-Int8Default' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.169 NAME 'logonCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.772 NAME 'aCSPolicyName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.38 NAME 'authorityRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1212 NAME 'isEphemeral' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.324 NAME 'packageType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1435 NAME 'msPKI-Template-Minor-Revision' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2010 NAME 'msTSLSProperty02' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1961 NAME 'msDS-SiteName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2009 NAME 'msTSLSProperty01' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1336 NAME 'replInterval' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2066 NAME 'msDS-RequiredDomainBehaviorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2185 NAME 'msDS-GeoCoordinatesLongitude' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2182 NAME 'msDS-AllowedToActOnBehalfOfOtherIdentity' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.8 NAME 'msDFSR-ConflictSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.357 NAME 'nTMixedDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2191 NAME 'msDS-IngressClaimsTransformationPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1892 NAME 'msPKIRoamingTimeStamp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2174 NAME 'msKds-PrivateKeyLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.324 NAME 'addressEntryDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.218 NAME 'applicationName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1318 NAME 'aCSNonReservedPeakRate' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2023 NAME 'msDS-PasswordSettingsPrecedence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.99 NAME 'priorSetTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.914 NAME 'allowedAttributesEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.271 NAME 'printOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1996 NAME 'msDS-UserPasswordExpiryTimeComputed' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.930 NAME 'mSMQServiceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1780 NAME 'hideFromAB' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.578 NAME 'meetingContactInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2020 NAME 'msDS-PSOAppliesTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1944 NAME 'msDS-PhoneticDepartment' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1792 NAME 'msDS-AzLDAPQuery' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.251 NAME 'cOMTreatAsClassId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.14 NAME 'builtinModifiedCount' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.7 NAME 'shadowMax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.325 NAME 'setupCommand' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1647 NAME 'msWMI-TargetObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.420 NAME 'publicKeyPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1714 NAME 'MSMQ-MulticastAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1677 NAME 'msWMI-Genus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2281 NAME 'msDS-ComputerTGTLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1671 NAME 'msPKI-OID-Attribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.36 NAME 'dMDLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.810 NAME 'createDialog' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2140 NAME 'msDNS-DSRecordSetTTL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1358 NAME 'schemaInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1624 NAME 'msWMI-ChangeDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1975 NAME 'msDS-RevealedListBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1962 NAME 'msDS-PromotionSettings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.229 NAME 'driverName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.378 NAME 'dnsAllowDynamic' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1246 NAME 'interSiteTopologyGenerator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.817 NAME 'localizedDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2235 NAME 'msDS-ReplValueMetaDataExt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1933 NAME 'msDS-IsDomainFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2213 NAME 'msDS-RIDPoolAllocationEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.73 NAME 'lockoutThreshold' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.50 NAME 'lastContentIndexed' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.824 NAME 'signatureAlgorithms' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.860 NAME 'netbootServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.40 NAME 'msDFSR-StagingCleanupTriggerInPercent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1695 NAME 'msMQ-Recipient-FormatName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1966 NAME 'msTPM-OwnerInformation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.156 NAME 'comment' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.650 NAME 'mhsORAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.929 NAME 'mSMQInRoutingServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1787 NAME 'msDS-AllowedToDelegateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1389 NAME 'mS-SQL-Language' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.18 NAME 'msDFSR-ContentSetGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.8 NAME 'possSuperiors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.4.912 NAME 'allowedChildClassesEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2132 NAME 'msDNS-NSEC3OptOut' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.136 NAME 'trustType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1879 NAME 'msDS-SourceObjectDN' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.533 NAME 'fRSReplicaSetGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1434 NAME 'msPKI-Template-Schema-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.241 NAME 'printMaxCopies' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.961 NAME 'mSMQSiteForeign' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' )", + "( 1.2.840.113556.1.4.1808 NAME 'msDS-OperationsForAzTask' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1242 NAME 'dNReferenceUpdate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.5 NAME 'drink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1923 NAME 'msDS-KrbTgtLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1402 NAME 'mS-SQL-Publisher' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2018 NAME 'msDS-LockoutDuration' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.688 NAME 'cAWEBURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.23 NAME 'bootParameter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.536 NAME 'fRSExtensions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.233 NAME 'printStartTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1788 NAME 'msDS-PerUserTrustQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.159 NAME 'accountExpires' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1390 NAME 'mS-SQL-Description' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.224 NAME 'defaultSecurityDescriptor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113549.1.9.2 NAME 'unstructuredName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.695 NAME 'pendingParentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1375 NAME 'mS-SQL-MultiProtocol' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2152 NAME 'msAuthz-LastEffectiveSecurityPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.56 NAME 'localPolicyFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1392 NAME 'mS-SQL-InformationDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2159 NAME 'msDS-ClaimIsValueSpaceRestricted' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.708 NAME 'dhcpSites' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.717 NAME 'dhcpState' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.762 NAME 'aCSServiceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.132 NAME 'trustDirection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.312 NAME 'rpcNsObjectID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1395 NAME 'mS-SQL-Alias' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.18.2 NAME 'modifyTimeStamp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2145 NAME 'msDNS-DNSKEYRecords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.301 NAME 'wbemPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.0 NAME 'objectClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.21 NAME 'msDFSR-DfsPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1429 NAME 'msPKI-RA-Signature' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1699 NAME 'msTAPI-ProtocolId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2086 NAME 'msSPP-PhoneLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.120 NAME 'schemaFlagsEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1945 NAME 'msDS-PhoneticCompanyName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.916 NAME 'canonicalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.702 NAME 'dhcpObjName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2238 NAME 'msds-memberTransitive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.133 NAME 'trustPartner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.927 NAME 'mSMQSites' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.867 NAME 'altSecurityIdentities' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.615 NAME 'shellContextMenu' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.866 NAME 'pekKeyChangeInterval' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2046 NAME 'addressBookRoots2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.27 NAME 'currentValue' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.166 NAME 'groupMembershipSAM' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1926 NAME 'msDS-NeverRevealGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.13.3.28 NAME 'msDFSR-ReadOnly' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1314 NAME 'aCSMaximumSDUSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.457 NAME 'localPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1189 NAME 'msRASSavedCallbackNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1918 NAME 'msRADIUS-SavedFramedIpv6Route' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 2.5.21.2 NAME 'dITContentRules' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.895 NAME 'transportAddressAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1418 NAME 'tokenGroupsGlobalAndUniversal' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.850 NAME 'netbootLimitClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.944 NAME 'mSMQSite2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.943 NAME 'mSMQSite1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1664 NAME 'msDS-Replication-Notify-Subsequent-DSA-Delay' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.537 NAME 'dynamicLDAPServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2249 NAME 'msDS-DeviceOSType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.35 NAME 'employeeID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2137 NAME 'msDNS-NSEC3RandomSaltLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2151 NAME 'msAuthz-ProposedSecurityPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.267 NAME 'uSNDSALastObjRemoved' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.963 NAME 'mSMQQueueJournalQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.607 NAME 'queryPolicyObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1978 NAME 'msTSHomeDrive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.593 NAME 'msExchLabeledURI' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1329 NAME 'pKIMaxIssuingDepth' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2061 NAME 'msDS-EnabledFeature' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.278 NAME 'printMaxYExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.16 NAME 'codePage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1802 NAME 'msDS-AzBizRuleLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.363 NAME 'operatingSystem' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.761 NAME 'aCSMaxDurationPerFlow' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.921 NAME 'mSMQJournalQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2106 NAME 'msSPP-CSVLKPartialProductKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1190 NAME 'msRASSavedFramedIPAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2171 NAME 'msKds-SecretAgreementAlgorithmID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.703 NAME 'dhcpObjDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.890 NAME 'uPNSuffixes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1720 NAME 'msDS-ReplicationEpoch' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.24 NAME 'bootFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.614 NAME 'adminContextMenu' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.2.231 NAME 'oMSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.8 NAME 'userAccountControl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.621 NAME 'ipsecID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.511 NAME 'flatName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.784 NAME 'aCSIdentityName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.15 NAME 'msiScriptPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.125 NAME 'supplementalCredentials' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2287 NAME 'msDS-AuthNPolicySiloMembers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.199 NAME 'serviceInstanceVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1347 NAME 'sPNMappings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.933 NAME 'mSMQComputerType' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.780 NAME 'aCSNonReservedTxLimit' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1227 NAME 'mSMQRoutingServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2074 NAME 'msTSPrimaryDesktopBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.5.18.1 NAME 'createTimeStamp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1130 NAME 'msNPSavedCallingStationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.700 NAME 'dhcpFlags' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.629 NAME 'ipsecFilterReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.40 NAME 'fromServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.568 NAME 'meetingKeyword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2178 NAME 'msKds-UseStartTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1321 NAME 'aCSNonReservedMinPolicedSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.246 NAME 'printLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.2.54 NAME 'tombstoneLifetime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.765 NAME 'aCSPermissionBits' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1398 NAME 'mS-SQL-LastBackupDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2 NAME 'objectGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.146 NAME 'company' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1710 NAME 'msDS-AllowedDNSSuffixes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1841 NAME 'msDS-ObjectReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.5.4.8 NAME 'st' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.341 NAME 'msSFU30YpServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 2.5.4.4 NAME 'sn' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.707 NAME 'dhcpRanges' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.282 NAME 'printMemory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.924 NAME 'mSMQPrivacyLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.333 NAME 'oMTIndxGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.205 NAME 'pKTGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2251 NAME 'msDS-DevicePhysicalIDs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1410 NAME 'mS-DS-CreatorSID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.345 NAME 'groupPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2030 NAME 'msDFS-SchemaMajorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.513 NAME 'siteObjectBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.87 NAME 'nETBIOSName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2175 NAME 'msKds-RootKeyData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.24 NAME 'mustContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 2.5.4.51 NAME 'houseIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.3.6.1.1.1.1.26 NAME 'nisMapName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1917 NAME 'msRADIUS-FramedIpv6Route' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.6.18.1.307 NAME 'msSFU30MasterServerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.98 NAME 'primaryGroupID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1837 NAME 'msDs-masteredBy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.200 NAME 'controlAccessRights' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1158 NAME 'msRADIUSFramedRoute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.107 NAME 'remoteSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1971 NAME 'msDS-LastFailedInteractiveLogonTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1958 NAME 'msDS-AuthenticatedAtDC' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.5 NAME 'serialNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.509 NAME 'serviceClassName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2050 NAME 'msPKI-CredentialRoamingTokens' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.2008 NAME 'msTSManagingLS4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2005 NAME 'msTSManagingLS3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2002 NAME 'msTSManagingLS2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1363 NAME 'mS-SQL-Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.41 NAME 'mobile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2108 NAME 'msTPM-OwnerInformationTemp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.886 NAME 'purportedSearch' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1384 NAME 'mS-SQL-PublicationURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2271 NAME 'msDS-CloudIsManaged' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.41 NAME 'generatedConnection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.864 NAME 'netbootSCPBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1396 NAME 'mS-SQL-Size' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.115 NAME 'rpcNsInterfaceID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.619 NAME 'dNSHostName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2273 NAME 'msDS-CloudAnchor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.939 NAME 'mSMQNameStyle' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.882 NAME 'fRSVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.777 NAME 'aCSDSBMRefresh' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.80 NAME 'minTicketAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1310 NAME 'mSMQSiteGatesMig' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.83 NAME 'monikerDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2150 NAME 'msAuthz-EffectiveSecurityPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.15 NAME 'hasPartialReplicaNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2194 NAME 'msDS-TDOEgressBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1811 NAME 'msDS-TasksForAzTaskBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1987 NAME 'msTSConnectPrinterDrives' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1953 NAME 'ms-net-ieee-80211-GP-PolicyReserved' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1313 NAME 'aCSMaxTokenBucketPerFlow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.579 NAME 'meetingOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.12 NAME 'badPwdCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.39 NAME 'forceLogoff' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.326 NAME 'perRecipDialogDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.51 NAME 'lastLogoff' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1796 NAME 'msDS-AzScriptEngineCacheMax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2269 NAME 'msDS-IssuerPublicCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1639 NAME 'msWMI-Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.4 NAME 'replUpToDateVector' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.470 NAME 'trustAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.515 NAME 'serverReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.308 NAME 'msSFU30OrderNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1669 NAME 'msDS-Approx-Immed-Subordinates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2141 NAME 'msDNS-SignatureInceptionOffset' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2186 NAME 'msDS-IsPossibleValuesPresent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.78 NAME 'minPwdAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.339 NAME 'msSFU30NisDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1701 NAME 'msTAPI-IpAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.249 NAME 'cOMCLSID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.774 NAME 'aCSMaxNoOfLogFiles' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.494 NAME 'siteServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.849 NAME 'netbootAllowNewClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1931 NAME 'msDS-KrbTgtLinkBl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1789 NAME 'msDS-AllUsersTrustQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2156 NAME 'msAuthz-MemberRulesInCentralAccessPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.721 NAME 'ipPhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.613 NAME 'employeeType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1634 NAME 'msWMI-Int8Min' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2248 NAME 'msDS-IsEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1950 NAME 'msDS-AzGenericData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1646 NAME 'msWMI-TargetNameSpace' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.816 NAME 'fileExtPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.712 NAME 'optionDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.321 NAME 'requiredCategories' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.255 NAME 'addressSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2110 NAME 'msTPM-TpmInformationForComputerBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1785 NAME 'msIIS-FTPRoot' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.518 NAME 'defaultHidingValue' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.946 NAME 'mSMQCost' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.44 NAME 'generationQualifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.681 NAME 'indexedScopes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1865 NAME 'msDS-PrincipalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2073 NAME 'msTSPrimaryDesktop' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.697 NAME 'cACertificateDN' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1354 NAME 'scopeFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1942 NAME 'msDS-PhoneticFirstName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1997 NAME 'msDS-HABSeniorityIndex' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1307 NAME 'accountNameHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.893 NAME 'gPCFunctionalityVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2203 NAME 'msDS-parentdistname' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1687 NAME 'extraColumns' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1834 NAME 'msDS-ExternalStore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1983 NAME 'msTSMaxIdleTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.687 NAME 'cAConnect' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2048 NAME 'templateRoots2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.154 NAME 'serverState' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1224 NAME 'parentGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.926 NAME 'mSMQTransactional' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.925 NAME 'mSMQOwnerID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2035 NAME 'msDFS-Ttlv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.150 NAME 'adminCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2041 NAME 'msDFS-LinkIdentityGUIDv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.490 NAME 'fRSDSPoll' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2015 NAME 'msDS-PasswordComplexityEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.105 NAME 'remoteServerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.531 NAME 'nonSecurityMemberBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.16.840.1.113730.3.1.36 NAME 'thumbnailLogo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.586 NAME 'meetingRecurrence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1643 NAME 'msWMI-QueryLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.962 NAME 'mSMQQueueQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1415 NAME 'mSMQLabelEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.16 NAME 'nCName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2170 NAME 'msKds-KDFParam' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.567 NAME 'meetingDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1704 NAME 'msDS-NCReplCursors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.23 NAME 'facsimileTelephoneNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.851 NAME 'netbootMaxClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2016 NAME 'msDS-PasswordReversibleEncryptionEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1635 NAME 'msWMI-Int8ValidValues' SYNTAX '1.2.840.113556.1.4.906' )", + "( 1.2.840.113556.1.4.719 NAME 'dhcpMaxKey' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1835 NAME 'msDS-Integer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.1208 NAME 'aNR' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1393 NAME 'mS-SQL-Database' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.42 NAME 'pager' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1914 NAME 'msRADIUS-SavedFramedInterfaceId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1391 NAME 'mS-SQL-Type' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.566 NAME 'meetingName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.123 NAME 'serviceClassInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.26 NAME 'creationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.103 NAME 'proxyLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.660 NAME 'treeName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.892 NAME 'gPOptions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.923 NAME 'mSMQAuthenticate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1432 NAME 'msPKI-Certificate-Name-Flag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.206 NAME 'pKT' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.287 NAME 'printNetworkAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1431 NAME 'msPKI-Private-Key-Flag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1346 NAME 'templateRoots' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.657 NAME 'serviceDNSName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.868 NAME 'isCriticalSystemObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.301 NAME 'garbageCollPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.288 NAME 'printMACAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1304 NAME 'sDRightsEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.380 NAME 'extendedCharsAllowed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.86 NAME 'userWorkstations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1360 NAME 'mS-DS-ConsistencyGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1712 NAME 'msPKI-OIDLocalizedName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.21.5 NAME 'attributeTypes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.31 NAME 'fRSReplicaSetType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.341 NAME 'appliesTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.11 NAME 'ou' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2293 NAME 'msDS-ServiceAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.346 NAME 'msSFU30PosixMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1973 NAME 'msDS-FailedInteractiveLogonCountAtLastSuccessfulLogon' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 2.5.18.10 NAME 'subSchemaSubEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2262 NAME 'msDS-ApproximateLastLogonTimeStamp' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.222 NAME 'location' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.854 NAME 'netbootAnswerOnlyValidClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1949 NAME 'msDS-AzObjectGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 2.16.840.1.113730.3.1.34 NAME 'middleName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2158 NAME 'msDS-ClaimSourceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.706 NAME 'dhcpMask' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.2109 NAME 'msTPM-TpmInformationForComputer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.623 NAME 'ipsecData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1171 NAME 'msRADIUSServiceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.705 NAME 'dhcpSubnets' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.1999 NAME 'msFVE-KeyPackage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1968 NAME 'msDS-NC-RO-Replica-Locations-BL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.36 NAME 'enabledConnection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.472 NAME 'domainCrossRef' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.52 NAME 'lastLogon' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.28 NAME 'dnsRoot' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.966 NAME 'mSMQDigestsMig' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.878 NAME 'fRSPrimaryMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1848 NAME 'msDS-QuotaEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1372 NAME 'mS-SQL-UnicodeSortOrder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.639 NAME 'isMemberOfPartialAttributeSet' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.464 NAME 'wWWHomePage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.711 NAME 'superScopeDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1631 NAME 'msWMI-IntValidValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.3.6.1.1.1.1.2 NAME 'gecos' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2063 NAME 'msDS-OptionalFeatureFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.38 NAME 'flags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1240 NAME 'netbootSIFFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.690 NAME 'cAUsages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2104 NAME 'msDS-MembersOfResourcePropertyListBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.66 NAME 'lSACreationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.709 NAME 'dhcpReservations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.934 NAME 'mSMQForeign' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1963 NAME 'msDS-SupportedEncryptionTypes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1401 NAME 'mS-SQL-Keywords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1705 NAME 'msDS-NCReplInboundNeighbors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2128 NAME 'msDNS-KeymasterZones' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1694 NAME 'gPCWQLFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.195 NAME 'systemPossSuperiors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.218 NAME 'oMObjectClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1226 NAME 'mSMQDependentClientServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1676 NAME 'msWMI-Class' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2144 NAME 'msDNS-SigningKeys' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1630 NAME 'msWMI-IntMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.372 NAME 'rIDPreviousAllocationPool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.848 NAME 'appSchemaVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1981 NAME 'msTSMaxDisconnectionTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1645 NAME 'msWMI-TargetClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.535 NAME 'fRSRootSecurity' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1423 NAME 'msCOM-PartitionLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.32 NAME 'owner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1436 NAME 'msPKI-Cert-Template-OID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1716 NAME 'msDS-IntId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.18.1.309 NAME 'msSFU30Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.254 NAME 'cOMTypelibId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1642 NAME 'msWMI-Query' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.155 NAME 'uASCompat' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1623 NAME 'msWMI-Author' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1964 NAME 'msFVE-RecoveryPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.764 NAME 'aCSPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.571 NAME 'meetingType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.783 NAME 'defaultObjectCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1365 NAME 'mS-SQL-Contact' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.679 NAME 'creator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.39 NAME 'certificateRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.699 NAME 'dhcpType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1405 NAME 'mS-SQL-AllowQueuedUpdatingSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.915 NAME 'possibleInferiors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2234 NAME 'netbootDUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.899 NAME 'aCSEnableRSVPAccounting' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.881 NAME 'fRSTimeLastConfigChange' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.898 NAME 'aCSNonReservedTxSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.771 NAME 'servicePrincipalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1820 NAME 'msDS-HasDomainNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2070 NAME 'msTSEndpointData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.620 NAME 'ipsecName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.458 NAME 'qualityOfService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2042 NAME 'msDFS-ShortNameLinkPathv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1688 NAME 'msDS-Security-Group-Extra-Classes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2289 NAME 'msDS-UserAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.83 NAME 'repsTo' SYNTAX 'OctetString' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1357 NAME 'dSCorePropagationData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2196 NAME 'msDS-ManagedPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.647 NAME 'otherMobile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2072 NAME 'msTSEndpointPlugin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.749 NAME 'url' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.701 NAME 'dhcpIdentification' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.122 NAME 'serviceClassID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2058 NAME 'isRecycled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.213 NAME 'defaultClassStore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2252 NAME 'msDS-DeviceID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.633 NAME 'policyReplicationFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1693 NAME 'msFRS-Hub-Member' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1328 NAME 'pKIKeyUsage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.459 NAME 'networkAddress' SYNTAX '1.2.840.113556.1.4.905' )", + "( 1.2.840.113556.1.4.1786 NAME 'msIIS-FTPDir' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.806 NAME 'treatAsLeaf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.820 NAME 'bridgeheadServerListBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.13.3.36 NAME 'msDFSR-OnDemandExclusionDirectoryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.640 NAME 'partialAttributeSet' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.853 NAME 'netbootAnswerRequests' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 2.5.4.31 NAME 'member' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.18.1.323 NAME 'msSFU30Aliases' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1243 NAME 'mSMQQueueNameExt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1370 NAME 'mS-SQL-CharacterSet' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1622 NAME 'msDS-Entry-Time-To-Die' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.460 NAME 'lDAPDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2031 NAME 'msDFS-SchemaMinorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.12 NAME 'memberUid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1800 NAME 'msDS-AzOperationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.322 NAME 'categoryId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.60 NAME 'lockoutDuration' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.870 NAME 'frsComputerReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.5.4.45 NAME 'x500uniqueIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.13.3.25 NAME 'msDFSR-Priority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.847 NAME 'installUiLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1842 NAME 'msDs-MaxValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.9 NAME 'street' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2154 NAME 'msAuthz-CentralAccessPolicyID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.3 NAME 'whenChanged' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1433 NAME 'msPKI-Minimal-Key-Size' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1814 NAME 'msDS-TasksForAzRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.13.3.101 NAME 'msDFSR-ComputerReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.580 NAME 'meetingIP' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.539 NAME 'initialAuthIncoming' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.356 NAME 'foreignIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.565 NAME 'meetingID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.3 NAME 'unixHomeDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1721 NAME 'msDS-UpdateScript' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.557 NAME 'parentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.255 NAME 'vendor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.900 NAME 'aCSRSVPAccountFilesLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1320 NAME 'aCSNonReservedMaxSDUSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1956 NAME 'ms-net-ieee-8023-GP-PolicyReserved' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.773 NAME 'aCSRSVPLogFilesLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.951 NAME 'mSMQQMID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.102 NAME 'memberOf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1397 NAME 'mS-SQL-CreationDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2146 NAME 'msDNS-ParentHasSecureDelegation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.113 NAME 'rpcNsBindings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.656 NAME 'userPrincipalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1934 NAME 'msDS-IsPartialReplicaFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2167 NAME 'msDS-PrimaryComputer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.469 NAME 'USNIntersite' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1803 NAME 'msDS-AzLastImportedBizRulePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2295 NAME 'msDS-AssignedAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 2.5.4.13 NAME 'description' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.922 NAME 'mSMQLabel' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2024 NAME 'msDS-NcType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2011 NAME 'msDS-MaximumPasswordAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2291 NAME 'msDS-ComputerAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1832 NAME 'msDS-DateTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' )", + "( 1.2.840.113556.1.2.281 NAME 'nTSecurityDescriptor' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.722 NAME 'otherIpPhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1368 NAME 'mS-SQL-Build' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.219 NAME 'iconPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1417 NAME 'mSMQComputerTypeEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1986 NAME 'msTSConnectClientDrives' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2285 NAME 'msDS-AssignedAuthNPolicySilo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1638 NAME 'msWMI-Mof' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.314 NAME 'rpcNsTransferSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1702 NAME 'msDS-TrustForestTrustInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.557 NAME 'Enabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.21 NAME 'subClassOf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1845 NAME 'msDS-QuotaAmount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1119 NAME 'msNPAllowDialin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.33 NAME 'isSingleValued' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.782 NAME 'objectCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2177 NAME 'msKds-DomainID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2195 NAME 'msDS-AppliesToResourceTypes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.152 NAME 'groupAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.334 NAME 'volTableIdxGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.272 NAME 'printNotify' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.334 NAME 'searchFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2298 NAME 'msDS-AuthNPolicySiloEnforced' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1428 NAME 'msCOM-ObjectId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.400 NAME 'addressEntryDisplayTableMSDOS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.81 NAME 'modifiedCountAtLastProm' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.71 NAME 'machineRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1123 NAME 'msNPCalledStationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.654 NAME 'managedObjects' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.638 NAME 'isPrivilegeHolder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.197 NAME 'systemMustContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.91 NAME 'otherLoginWorkstations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.13.3.32 NAME 'msDFSR-DisablePacketPrivacy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2297 NAME 'msDS-AuthNPolicyEnforced' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.576 NAME 'meetingMaxParticipants' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.4 NAME 'loginShell' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.779 NAME 'aCSCacheTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.751 NAME 'userSharedFolder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.342 NAME 'msSFU30MaxGidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1380 NAME 'mS-SQL-Status' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.13 NAME 'builtinCreationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.277 NAME 'printMaxXExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.230 NAME 'printSeparatorFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1387 NAME 'mS-SQL-GPSHeight' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2054 NAME 'msImaging-PSPString' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.235 NAME 'printFormName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.20 NAME 'telephoneNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1621 NAME 'msDS-Other-Settings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.304 NAME 'msSFU30SearchAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.21.9 NAME 'structuralObjectClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.4.659 NAME 'serviceDNSNameType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.902 NAME 'aCSMaxSizeOfRSVPAccountFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.569 NAME 'meetingLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.261 NAME 'division' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1640 NAME 'msWMI-NormalizedClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.300 NAME 'printerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1960 NAME 'msDS-isRODC' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.268 NAME 'eFSPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1824 NAME 'msDS-AzMajorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2134 NAME 'msDNS-DSRecordAlgorithms' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.270 NAME 'printShareName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1400 NAME 'mS-SQL-Applications' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1312 NAME 'aCSServerList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1376 NAME 'mS-SQL-SPX' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.368 NAME 'rIDManagerReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1371 NAME 'mS-SQL-SortOrder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.118 NAME 'otherPager' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1894 NAME 'msPKIAccountCredentials' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.6.13.3.16 NAME 'msDFSR-Flags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1301 NAME 'tokenGroups' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1626 NAME 'msWMI-CreationDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.14 NAME 'hasMasterNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.153 NAME 'rid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2084 NAME 'msSPP-ConfirmationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.2 NAME 'msDFSR-Extension' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1846 NAME 'msDS-DefaultQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.35 NAME 'rangeUpper' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1633 NAME 'msWMI-Int8Max' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.48 NAME 'isDeleted' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1327 NAME 'pKIDefaultKeySpec' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1408 NAME 'mS-DS-ReplicatesNCReason' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1816 NAME 'msDS-AzClassId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2088 NAME 'msSPP-IssuanceLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1672 NAME 'msPKI-OID-CPS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.590 NAME 'meetingBlob' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.72 NAME 'marshalledInterface' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1385 NAME 'mS-SQL-GPSLatitude' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2097 NAME 'msDS-ClaimPossibleValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.26 NAME 'msDFSR-DeletedPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1826 NAME 'msDS-RetiredReplNCSignatures' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2143 NAME 'msDNS-SigningKeyDescriptors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.491 NAME 'fRSFaultCondition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2278 NAME 'msDS-UserAllowedToAuthenticateFrom' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2017 NAME 'msDS-LockoutObservationWindow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2130 NAME 'msDNS-IsSigned' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2057 NAME 'msDS-HostServiceAccountBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.683 NAME 'cRLPartitionedRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.481 NAME 'schemaUpdate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1332 NAME 'pKIOverlapPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.692 NAME 'previousCACertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.573 NAME 'meetingApplication' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1849 NAME 'msDS-QuotaUsed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.517 NAME 'ipsecPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1822 NAME 'msieee80211-DataType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.664 NAME 'syncWithObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2183 NAME 'msDS-GeoCoordinatesAltitude' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.284 NAME 'bytesPerMinute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.139 NAME 'profilePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.40 NAME 'crossCertificatePair' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1929 NAME 'msDS-SecondaryKrbTgtNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2294 NAME 'msDS-ServiceAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1414 NAME 'dNSTombstoned' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.104 NAME 'ownerBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1930 NAME 'msDS-RevealedDSAs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2240 NAME 'msDS-IssuerCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1692 NAME 'msFRS-Topology-Pref' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.158 NAME 'domainReplica' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.2 NAME 'whenCreated' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.76 NAME 'maxStorage' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.484 NAME 'fRSDirectoryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1916 NAME 'msRADIUS-SavedFramedIpv6Prefix' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2087 NAME 'msSPP-ConfigLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.627 NAME 'ipsecNFAReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.351 NAME 'auxiliaryClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.2.50 NAME 'linkID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1718 NAME 'msDS-AdditionalSamAccountName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.35 NAME 'msDFSR-OnDemandExclusionFileFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.577 NAME 'meetingOriginator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.169 NAME 'showInAdvancedViewOnly' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.582 NAME 'meetingAdvertiseScope' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.48 NAME 'buildingName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2181 NAME 'msImaging-HashAlgorithm' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2101 NAME 'msDS-ClaimSharesPossibleValuesWith' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.24 NAME 'contentIndexingAllowed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.39 NAME 'msDFSR-CommonStagingSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2135 NAME 'msDNS-RFC5011KeyRollovers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.682 NAME 'friendlyNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2071 NAME 'msTSEndpointType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2263 NAME 'msDS-RegisteredUsers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2062 NAME 'msDS-OptionalFeatureGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.767 NAME 'aCSMaxPeakBandwidth' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.919 NAME 'mSMQQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.327 NAME 'packageFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.382 NAME 'dnsRecord' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.755 NAME 'domainIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.872 NAME 'fRSControlInboundBacklog' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.928 NAME 'mSMQOutRoutingServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.768 NAME 'aCSEnableRSVPMessageLogging' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.585 NAME 'meetingIsEncrypted' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.34 NAME 'rangeLower' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1361 NAME 'mS-DS-ConsistencyChildCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2192 NAME 'msDS-EgressClaimsTransformationPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2292 NAME 'msDS-ComputerAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.843 NAME 'lDAPAdminLimits' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1847 NAME 'msDS-TombstoneQuotaFactor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1355 NAME 'queryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.16 NAME 'postalAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.307 NAME 'options' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.74 NAME 'dSASignature' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.380 NAME 'dnsSecureSecondaries' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.634 NAME 'privilegeDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.598 NAME 'dmdName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1399 NAME 'mS-SQL-LastDiagnosticDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2280 NAME 'msDS-ComputerAllowedToAuthenticateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.350 NAME 'addressType' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.38 NAME 'msDFSR-CommonStagingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.672 NAME 'categories' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1675 NAME 'msPKI-RA-Application-Policies' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1244 NAME 'addressBookRoots' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.336 NAME 'volTableGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.65 NAME 'logonWorkstation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2153 NAME 'msAuthz-ResourceCondition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.34 NAME 'msDFSR-DefaultCompressionExclusionFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.756 NAME 'aCSTimeOfDay' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2276 NAME 'msDS-SyncServerUrl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.710 NAME 'superScopes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.2.210 NAME 'proxyAddresses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.348 NAME 'msSFU30NetgroupHostAtDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1306 NAME 'dNSProperty' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.141 NAME 'department' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.871 NAME 'fRSControlDataCreation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.253 NAME 'cOMOtherProgId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1337 NAME 'mSMQUserSid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.37 NAME 'cACertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.698 NAME 'dhcpUniqueKey' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1980 NAME 'msTSRemoteControl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.9 NAME 'host' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2081 NAME 'msSPP-CSVLKSkuId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.483 NAME 'fRSFileFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2168 NAME 'msDS-IsPrimaryComputerFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.74 NAME 'maxPwdAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1374 NAME 'mS-SQL-NamedPipe' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1972 NAME 'msDS-FailedInteractiveLogonCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1649 NAME 'msWMI-TargetType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.668 NAME 'domainCAs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2021 NAME 'msDS-PSOApplied' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.25 NAME 'countryCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.160 NAME 'lmPwdHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.275 NAME 'printKeepPrintedJobs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2014 NAME 'msDS-PasswordHistoryLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1836 NAME 'msDS-hasMasterNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1813 NAME 'msDS-OperationsForAzRoleBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.212 NAME 'dSHeuristics' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.877 NAME 'fRSPartnerAuthLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.13 NAME 'displayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.269 NAME 'linkTrackSecret' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1239 NAME 'mSMQDependentClientService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.238 NAME 'printMaxResolutionSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.325 NAME 'perMsgDialogDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.819 NAME 'bridgeheadTransportList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.540 NAME 'initialAuthOutgoing' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.523 NAME 'proxyGenerationEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.760 NAME 'aCSAggregateTokenRatePerUser' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.381 NAME 'dnsNotifySecondaries' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.117 NAME 'rpcNsPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.6.18.1.300 NAME 'msSFU30SearchContainer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.960 NAME 'mSMQNt4Stub' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.844 NAME 'lDAPIPDenyList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.918 NAME 'mSMQJournal' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.343 NAME 'msSFU30MaxUidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1442 NAME 'msDS-Cached-Membership-Time-Stamp' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1458 NAME 'msDS-Auxiliary-Classes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.821 NAME 'siteList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1782 NAME 'msDS-KeyVersionNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 2.5.4.50 NAME 'uniqueMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1797 NAME 'msDS-AzScriptTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1812 NAME 'msDS-OperationsForAzRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.809 NAME 'remoteStorageGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.231 NAME 'priority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.37 NAME 'msDFSR-Options2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2083 NAME 'msSPP-InstallationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.58 NAME 'attributeCertificateAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.18.1.302 NAME 'msSFU30FieldSeparator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.532 NAME 'superiorDNSRoot' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.822 NAME 'siteLinkList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1366 NAME 'mS-SQL-Location' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.94 NAME 'ntPwdHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1 NAME 'name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1629 NAME 'msWMI-IntMax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.118 NAME 'rpcNsProfileEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2049 NAME 'msDS-BridgeHeadServersUsed' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1969 NAME 'samDomainUpdates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.889 NAME 'additionalTrustedServiceNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.77 NAME 'maxTicketAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1661 NAME 'msDS-NC-Replica-Locations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1783 NAME 'msDS-ExecuteScriptPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.49 NAME 'mAPIID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.9 NAME 'msDFSR-Enabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.250 NAME 'cOMUniqueLIBID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.18 NAME 'postOfficeBox' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2067 NAME 'msDS-LastKnownRDN' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1344 NAME 'dSUIAdminMaximum' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1153 NAME 'msRADIUSFramedIPAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1799 NAME 'msDS-AzScopeName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2013 NAME 'msDS-MinimumPasswordLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.114 NAME 'rpcNsGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.146 NAME 'objectSid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.6 NAME 'msDFSR-StagingSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.365 NAME 'operatingSystemServicePack' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.21.6 NAME 'objectClasses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1698 NAME 'msTAPI-uid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.256 NAME 'streetAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1191 NAME 'msRASSavedFramedRoute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1965 NAME 'msFVE-RecoveryGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2166 NAME 'msDS-GenerationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1359 NAME 'otherWellKnownObjects' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1940 NAME 'msDS-RevealedList' SYNTAX '1.2.840.113556.1.4.904' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2282 NAME 'msDS-ServiceAllowedToAuthenticateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.379 NAME 'dnsAllowXFR' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.628 NAME 'ipsecNegotiationPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1976 NAME 'msTSProfilePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2076 NAME 'msPKI-Enrollment-Servers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.53 NAME 'deltaRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.18 NAME 'otherTelephone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2077 NAME 'msPKI-Site-Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1316 NAME 'aCSMinimumLatency' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2157 NAME 'msDS-ClaimSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1970 NAME 'msDS-LastSuccessfulInteractiveLogonTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.280 NAME 'printMinYExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.415 NAME 'operatingSystemHotfix' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.306 NAME 'msSFU30MapFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.610 NAME 'classDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1381 NAME 'mS-SQL-LastUpdatedDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1957 NAME 'msDS-AuthenticatedToAccountlist' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1825 NAME 'msDS-AzMinorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2198 NAME 'msDS-ManagedPasswordPreviousId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2068 NAME 'msDS-DeletedObjectLifetime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2095 NAME 'msDS-IsUsedAsResourceSecurityAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.786 NAME 'mailAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.373 NAME 'rIDUsedPool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.19 NAME 'msDFSR-RdcEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.44 NAME 'homeDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.538 NAME 'prefixMap' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2034 NAME 'msDFS-LastModifiedv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2155 NAME 'msAuthz-MemberRulesInCentralAccessPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.947 NAME 'mSMQSignCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.714 NAME 'dhcpOptions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2060 NAME 'msDS-LocalEffectiveRecycleTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.675 NAME 'catalogs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.134 NAME 'trustPosixOffset' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1404 NAME 'mS-SQL-AllowImmediateUpdatingSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2047 NAME 'globalAddressList2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.135 NAME 'cost' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1331 NAME 'pKIExpirationPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.15 NAME 'businessCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.13.3.4 NAME 'msDFSR-RootSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.869 NAME 'frsComputerReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1893 NAME 'msPKIDPAPIMasterKeys' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1430 NAME 'msPKI-Enrollment-Flag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.45 NAME 'homeDrive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2085 NAME 'msSPP-OnlineLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.196 NAME 'systemMayContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.90 NAME 'unicodePwd' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.763 NAME 'aCSTotalNoOfFlows' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1806 NAME 'msDS-MembersForAzRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.873 NAME 'fRSControlOutboundBacklog' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.89 NAME 'nTGroupMembers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.815 NAME 'canUpgradeScript' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.96 NAME 'pwdLastSet' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.228 NAME 'portName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1821 NAME 'msieee80211-Data' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.720 NAME 'dhcpUpdateTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 2.5.4.33 NAME 'roleOccupant' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1818 NAME 'msDS-AzTaskIsRoleDefinition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.488 NAME 'fRSStagingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.25 NAME 'dc' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.502 NAME 'timeVolChange' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.303 NAME 'notificationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.952 NAME 'mSMQMigrated' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2290 NAME 'msDS-UserAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.53 NAME 'lastSetTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.894 NAME 'gPCFileSysPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.471 NAME 'schemaVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.2.91 NAME 'repsFrom' SYNTAX 'OctetString' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.5 NAME 'msDFSR-StagingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.781 NAME 'lastKnownParent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 2.5.4.43 NAME 'initials' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.901 NAME 'aCSMaxNoOfAccountFiles' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1928 NAME 'msDS-RevealOnDemandGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1689 NAME 'msDS-Non-Security-Group-Extra-Classes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.344 NAME 'groupsToIgnore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.896 NAME 'uSNSource' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.964 NAME 'mSMQNt4Flags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2102 NAME 'msDS-ClaimSharesPossibleValuesWithBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.29 NAME 'presentationAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.43' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2051 NAME 'msDS-OIDToGroupLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.369 NAME 'fSMORoleOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1954 NAME 'ms-net-ieee-8023-GP-PolicyGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.648 NAME 'primaryTelexNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2283 NAME 'msDS-ServiceAllowedToAuthenticateFrom' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.12 NAME 'title' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.1 NAME 'uid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1247 NAME 'interSiteTopologyRenew' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1697 NAME 'msDS-Settings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.247 NAME 'printAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2188 NAME 'msDS-ValueTypeReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2133 NAME 'msDNS-MaintainTrustAnchor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.324 NAME 'msSFU30KeyValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1378 NAME 'mS-SQL-AppleTalk' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1663 NAME 'msDS-Replication-Notify-First-DSA-Delay' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.121 NAME 'securityIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.748 NAME 'attributeDisplayNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.16.840.1.113730.3.1.35 NAME 'thumbnailPhoto' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2082 NAME 'msSPP-KMSIds' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.758 NAME 'aCSMaxTokenRatePerFlow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.121 NAME 'uSNLastObjRem' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.875 NAME 'fRSMemberReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1349 NAME 'gPCUserExtensionNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.138 NAME 'userParameters' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.36 NAME 'userCertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.13.3.102 NAME 'msDFSR-MemberReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.131 NAME 'co' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.3 NAME 'cn' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.936 NAME 'mSMQEncryptKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.226 NAME 'adminDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.34 NAME 'seeAlso' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.444 NAME 'msExchAssistantName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.667 NAME 'syncWithSID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1998 NAME 'msFVE-VolumeGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2107 NAME 'msTPM-SrkPubThumbprint' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.81 NAME 'info' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1686 NAME 'msWMI-ScopeGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.151 NAME 'oEMInformation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.935 NAME 'mSMQOSType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.374 NAME 'rIDNextRID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2039 NAME 'msDFS-LinkPathv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.141 NAME 'versionNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.505 NAME 'oMTGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.88 NAME 'nextRid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2037 NAME 'msDFS-Propertiesv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1994 NAME 'msTSLicenseVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.16.840.1.113730.3.140 NAME 'userSMIMECertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1985 NAME 'msTSBrokenConnectionAction' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.281 NAME 'printStaplingSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.17 NAME 'msDFSR-Options' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.485 NAME 'fRSUpdateTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1967 NAME 'msDS-NC-RO-Replica-Locations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1819 NAME 'msDS-AzApplicationData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.347 NAME 'msSFU30PosixMemberOf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1425 NAME 'msCOM-UserLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.24 NAME 'msDFSR-DfsLinkTarget' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.512 NAME 'siteObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.584 NAME 'meetingRating' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1794 NAME 'msDS-NonMembersBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.776 NAME 'aCSDSBMPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.520 NAME 'machinePasswordChangeInterval' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.669 NAME 'rIDSetReferences' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.941 NAME 'mSMQLongLived' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1241 NAME 'netbootMirrorDataFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.305 NAME 'msSFU30ResultAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2236 NAME 'msds-memberOfTransitive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1427 NAME 'msCOM-DefaultPartitionLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.519 NAME 'lastBackupRestorationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.337 NAME 'currMachineId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.32 NAME 'attributeSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.362 NAME 'siteGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.823 NAME 'certificateTemplates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.352 NAME 'msSFU30CryptMethod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1946 NAME 'msDS-PhoneticDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2270 NAME 'msDS-IsManaged' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.581 NAME 'meetingScope' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.673 NAME 'retiredReplDSASignatures' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.855 NAME 'netbootNewMachineNamingPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1245 NAME 'globalAddressList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.227 NAME 'extensionName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.884 NAME 'msRRASAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.349 NAME 'msSFU30NetgroupUserAtDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.680 NAME 'queryPoint' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.888 NAME 'iPSECNegotiationPolicyAction' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.29 NAME 'msDFSR-CachePolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.299 NAME 'printMediaSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.503 NAME 'timeRefresh' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.11 NAME 'authenticationOptions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.198 NAME 'systemAuxiliaryClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.857 NAME 'netbootIntelliMirrorOSes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1406 NAME 'mS-SQL-AllowSnapshotFilesFTPDownloading' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1333 NAME 'pKIExtendedKeyUsage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2019 NAME 'msDS-LockoutThreshold' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1844 NAME 'msDS-QuotaTrustee' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.350 NAME 'msSFU30IsValidContainer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.359 NAME 'netbootGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1719 NAME 'msDS-DnsRootAlias' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.909 NAME 'extendedAttributeInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1248 NAME 'interSiteTopologyFailover' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2275 NAME 'msDS-CloudIsEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.887 NAME 'iPSECNegotiationPolicyType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2059 NAME 'msDS-LocalEffectiveDeletionTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.587 NAME 'meetingStartTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' )", + "( 2.5.4.17 NAME 'postalCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.445 NAME 'originalDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1990 NAME 'msTSInitialProgram' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.662 NAME 'lockoutTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.95 NAME 'pwdHistoryLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.759 NAME 'aCSMaxPeakBandwidthPerFlow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.753 NAME 'nameServiceFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.694 NAME 'previousParentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.142 NAME 'winsockAddresses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2075 NAME 'msTSSecondaryDesktops' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2105 NAME 'msSPP-CSVLKPid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.49 NAME 'badPasswordTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2184 NAME 'msDS-GeoCoordinatesLatitude' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2079 NAME 'msDS-RequiredForestBehaviorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1955 NAME 'ms-net-ieee-8023-GP-PolicyData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.237 NAME 'printBinNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1382 NAME 'mS-SQL-InformationURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.13 NAME 'msDFSR-DirectoryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.148 NAME 'schemaIDGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2189 NAME 'msDS-TransformationRules' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.10 NAME 'o' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.504 NAME 'seqNotification' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.7 NAME 'l' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.57 NAME 'defaultLocalPolicyObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1801 NAME 'msDS-AzBizRule' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.948 NAME 'mSMQDigests' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.327 NAME 'helpFileName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.421 NAME 'domainWidePolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 2.5.4.6 NAME 'c' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2139 NAME 'msDNS-DNSKEYRecordSetTTL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.609 NAME 'sIDHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1711 NAME 'msDS-SDReferenceDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1367 NAME 'mS-SQL-Memory' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.715 NAME 'dhcpClasses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1305 NAME 'moveTreeState' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.757 NAME 'aCSDirection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.631 NAME 'printPagesPerMinute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.145 NAME 'revision' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.646 NAME 'otherFacsimileTelephoneNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1798 NAME 'msDS-AzApplicationName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.366 NAME 'rpcNsAnnotation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2190 NAME 'msDS-TransformationRulesCompiled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1636 NAME 'msWMI-StringDefault' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.813 NAME 'upgradeProductCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1951 NAME 'ms-net-ieee-80211-GP-PolicyGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2098 NAME 'msDS-ClaimValueType' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.194 NAME 'adminDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.879 NAME 'fRSServiceCommandStatus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.361 NAME 'netbootMachineFilePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.67 NAME 'lSAModifiedCount' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.920 NAME 'mSMQBasePriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2277 NAME 'msDS-UserAllowedToAuthenticateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2056 NAME 'msDS-HostServiceAccount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1943 NAME 'msDS-PhoneticLastName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2055 NAME 'msDS-USNLastSyncSuccess' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.101 NAME 'privateKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.42 NAME 'givenName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.685 NAME 'parentCACertificateChain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1924 NAME 'msDS-RevealedUsers' SYNTAX '1.2.840.113556.1.4.903' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.76 NAME 'objectVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.856 NAME 'netbootNewMachineOU' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )" + ], + "cn": [ + "Aggregate" + ], + "dITContentRules": [ + "( 1.2.840.113556.1.6.13.4.6 NAME 'msDFSR-Content' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.14 NAME 'device' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (uid $ manager $ ipHostNumber $ macAddress $ bootParameter $ bootFile ))", + "( 1.2.840.113556.1.5.205 NAME 'msWMI-IntRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.5 NAME 'samServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.196 NAME 'msPKI-Enterprise-Oid' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.53 NAME 'crossRefContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.5 NAME 'organizationalUnit' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.152 NAME 'intellimirrorGroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.253 NAME 'msFVE-RecoveryInformation' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.262 NAME 'msImaging-PSPs' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.251 NAME 'ms-net-ieee-80211-GroupPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.138 NAME 'aCSSubnet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.43 NAME 'fTDfs' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.27 NAME 'rpcEntry')", + "( 1.2.840.113556.1.5.85 NAME 'dnsZone' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2163 NAME 'msAuthz-CentralAccessRule' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.194 NAME 'msCOM-PartitionSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.242 NAME 'msDS-QuotaContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.281 NAME 'msDS-ClaimsTransformationPolicies' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.146 NAME 'remoteStorageServicePoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.2 NAME 'samDomainBase')", + "( 1.2.840.113556.1.5.132 NAME 'dHCPClass' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.283 NAME 'msDS-CloudExtensions')", + "( 1.2.840.113556.1.5.89 NAME 'nTFRSSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.24 NAME 'remoteMailRecipient' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (cn ) MAY (telephoneNumber $ userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ showInAddressBook $ userCert $ legacyExchangeDN $ msDS-PhoneticDisplayName $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI ))", + "( 1.2.840.113556.1.5.221 NAME 'msTAPI-RtConference' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.201 NAME 'msWMI-SimplePolicyTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.212 NAME 'msSFU30NetId' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.49 NAME 'packageRegistration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.139 NAME 'lostAndFound' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.14 NAME 'connectionPoint')", + "( 1.2.840.113556.1.5.6 NAME 'securityPrincipal')", + "( 1.2.840.113556.1.5.147 NAME 'siteLink' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.255 NAME 'msDS-PasswordSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2162 NAME 'msAuthz-CentralAccessRules' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.30 NAME 'serviceInstance' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.156 NAME 'rRASAdministrationDictionary' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2164 NAME 'msAuthz-CentralAccessPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ))", + "( 1.2.840.113556.1.5.52 NAME 'fileLinkTracking' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.18 NAME 'domainPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.216 NAME 'msSFU30NetworkUser' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject')", + "( 1.2.840.113556.1.5.177 NAME 'pKICertificateTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.293 NAME 'msDS-AuthNPolicies' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.2 NAME 'msDFSR-Subscriber' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.31 NAME 'site' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.222 NAME 'msTAPI-RtPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.68 NAME 'applicationSiteSettings')", + "( 1.2.840.113556.1.3.14 NAME 'attributeSchema' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.267 NAME 'msSPP-ActivationObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.220 NAME 'msDS-App-Configuration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.23 NAME 'container' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.10 NAME 'msDFSR-Connection' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.207 NAME 'msWMI-UintRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.23 NAME 'printQueue' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.260 NAME 'msDFS-DeletedLinkv2' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.140 NAME 'interSiteTransportContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.130 NAME 'indexServerCatalog' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.98 NAME 'ipsecPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.0 NAME 'top')", + "( 1.2.840.113556.1.5.36 NAME 'volume' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.236 NAME 'msDS-AzOperation' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.9 NAME 'groupOfNames' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.12 NAME 'configuration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.78 NAME 'licensingSiteSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.69 NAME 'nTDSSiteSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.269 NAME 'msDS-ClaimTypePropertyBase')", + "( 1.2.840.113556.1.5.273 NAME 'msDS-ResourceProperty' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.239 NAME 'msDS-AzRole' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice')", + "( 1.2.840.113556.1.5.294 NAME 'msDS-AuthNPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.86 NAME 'dnsNode' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.210 NAME 'msWMI-StringSetParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.264 NAME 'msDS-ManagedServiceAccount' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipHostNumber ))", + "( 1.2.840.113556.1.5.15 NAME 'contact' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ showInAddressBook $ userCert $ legacyExchangeDN $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI ))", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount')", + "( 1.2.840.113556.1.5.266 NAME 'msSPP-ActivationObjectsContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.217 NAME 'msWMI-ObjectEncoding' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.33 NAME 'storage' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.67 NAME 'domainDNS' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (cACertificate $ builtinCreationTime $ builtinModifiedCount $ creationTime $ domainPolicyObject $ forceLogoff $ defaultLocalPolicyObject $ lockoutDuration $ lockOutObservationWindow $ lSACreationTime $ lSAModifiedCount $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nETBIOSName $ nextRid $ pwdProperties $ pwdHistoryLength $ privateKey $ replicaSource $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount $ controlAccessRights $ auditingPolicy $ eFSPolicy $ desktopProfile $ nTMixedDomain $ rIDManagerReference $ treeName $ pekList $ pekKeyChangeInterval $ gPLink $ gPOptions $ ms-DS-MachineAccountQuota $ msDS-LogonTimeSyncInterval $ msDS-PerUserTrustQuota $ msDS-AllUsersTrustQuota $ msDS-PerUserTrustTombstonesQuota ))", + "( 1.2.840.113556.1.5.92 NAME 'linkTrackVolEntry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device')", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject')", + "( 1.2.840.113556.1.5.235 NAME 'msDS-AzApplication' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.107 NAME 'sitesContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.263 NAME 'msImaging-PostScanProcess' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.240 NAME 'msieee80211-Policy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.95 NAME 'subnetContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.6 NAME 'document' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.6 NAME 'person' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.274 NAME 'msDS-ResourcePropertyList' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.270 NAME 'msDS-ClaimTypes' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount')", + "( 1.2.840.113556.1.5.179 NAME 'mSMQMigratedUser' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.185 NAME 'mS-SQL-OLAPServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject')", + "( 1.2.840.113556.1.5.155 NAME 'nTFRSSubscriber' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.129 NAME 'rIDSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.58 NAME 'addressTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.154 NAME 'nTFRSSubscriptions' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.47 NAME 'nTDSDSA' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.175 NAME 'infrastructureUpdate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.215 NAME 'msSFU30DomainInfo' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.213 NAME 'msWMI-Som' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.82 NAME 'rpcProfile' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.164 NAME 'mSMQSiteLink' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.184 NAME 'mS-SQL-SQLServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.106 NAME 'queryPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.162 NAME 'mSMQConfiguration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.257 NAME 'msDFS-NamespaceAnchor' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.7 NAME 'msDFSR-ContentSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.276 NAME 'msTPM-InformationObjectsContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.209 NAME 'msWMI-RealRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.7 NAME 'organizationalPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.176 NAME 'msExchConfigurationContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.278 NAME 'msKds-ProvRootKey' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.238 NAME 'msDS-AzTask' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.282 NAME 'msDS-GroupManagedServiceAccount' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipHostNumber ))", + "( 1.3.6.1.1.1.2.9 NAME 'nisMap' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.277 NAME 'msKds-ProvServerConfiguration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.217 NAME 'msSFU30NISMapConfig' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.48 NAME 'serversContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.90 NAME 'linkTrackVolumeTable' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.188 NAME 'mS-SQL-SQLDatabase' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.211 NAME 'msWMI-PolicyType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.183 NAME 'dSUISettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.157 NAME 'groupPolicyContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.3 NAME 'samDomain' MAY (forceLogoff $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount ))", + "( 1.2.840.113556.1.5.234 NAME 'msDS-AzAdminManager' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.214 NAME 'msWMI-Rule' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.254 NAME 'nTDSDSARO' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.286 NAME 'msDS-Device' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.34 NAME 'trustedDomain' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.7 NAME 'room' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.4 NAME 'organization' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.272 NAME 'msDS-ClaimType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.80 NAME 'rpcGroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.17 NAME 'server' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.28 NAME 'secret' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.163 NAME 'mSMQEnterpriseSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.202 NAME 'msWMI-MergeablePolicyTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.195 NAME 'msPKI-Key-Recovery-Agent' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ))", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.258 NAME 'msDFS-Namespacev2' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.96 NAME 'subnet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.216 NAME 'applicationVersion' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.10 NAME 'residentialPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.19 NAME 'cRLDistributionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.137 NAME 'aCSPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.77 NAME 'controlAccessRight' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.219 NAME 'msMQ-Group' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.8 NAME 'group' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (cn $ objectSid $ sAMAccountName ) MAY (telephoneNumber $ userPassword $ userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-PhoneticDisplayName $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI $ gidNumber $ memberUid ))", + "( 1.2.840.113556.1.6.23.2 NAME 'msPrint-ConnectionPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.11 NAME 'crossRef' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.9 NAME 'msDFSR-Member' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.59 NAME 'displayTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.13 NAME 'classSchema' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.200 NAME 'msWMI-PolicyTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.165 NAME 'mSMQSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.126 NAME 'serviceConnectionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.4 NAME 'builtinDomain' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (creationTime $ forceLogoff $ lockoutDuration $ lockOutObservationWindow $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nextRid $ pwdProperties $ pwdHistoryLength $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount ))", + "( 1.2.840.113556.1.5.241 NAME 'msDS-AppData' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.73 NAME 'rpcServerElement' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.150 NAME 'rRASAdministrationConnectionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.191 NAME 'aCSResourceLimits' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.3 NAME 'locality' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost')", + "( 1.2.840.113556.1.5.275 NAME 'msTPM-InformationObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.289 NAME 'msDS-DeviceContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2129 NAME 'msDNS-ServerSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.76 NAME 'foreignSecurityPrincipal' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.44 NAME 'classStore' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.5 NAME 'account' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.26 NAME 'rpcProfileElement' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.215 NAME 'msWMI-WMIGPO' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.243 NAME 'msDS-QuotaControl' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.256 NAME 'msDS-PasswordSettingsContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.187 NAME 'mS-SQL-SQLPublication' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.9 NAME 'user' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ))", + "( 1.2.840.113556.1.5.259 NAME 'msDFS-Linkv2' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.141 NAME 'interSiteTransport' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.4 NAME 'msDFSR-GlobalSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.29 NAME 'serviceClass' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.189 NAME 'mS-SQL-OLAPDatabase' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.16 NAME 'certificationAuthority' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.104 NAME 'meeting' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.287 NAME 'msDS-DeviceRegistrationServiceContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.71 NAME 'nTDSConnection' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.291 NAME 'msDS-AuthNPolicySilos' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.218 NAME 'msMQ-Custom-Recipient' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.72 NAME 'nTDSService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.9 NAME 'dMD' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.280 NAME 'msDS-ClaimsTransformationPolicyType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.14 NAME 'rFC822LocalPart' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.190 NAME 'mS-SQL-OLAPCube' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.208 NAME 'msWMI-UintSetParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup')", + "( 2.5.6.17 NAME 'groupOfUniqueNames' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.252 NAME 'ms-net-ieee-8023-GroupPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.119 NAME 'ipsecNegotiationPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.292 NAME 'msDS-AuthNPolicySilo' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.121 NAME 'ipsecNFA' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.42 NAME 'dfsConfiguration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.271 NAME 'msDS-ResourceProperties' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.91 NAME 'linkTrackObjectMoveTable' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.136 NAME 'rpcContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.83 NAME 'rIDManager' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.206 NAME 'msWMI-IntSetParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.5 NAME 'msDFSR-ReplicationGroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.125 NAME 'addressBookContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.49 NAME 'applicationSettings')", + "( 1.2.840.113556.1.5.265 NAME 'msDS-OptionalFeature' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.94 NAME 'serviceAdministrationPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.102 NAME 'nTFRSReplicaSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.203 NAME 'msWMI-RangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.56 NAME 'ipsecBase')", + "( 1.2.840.113556.1.6.13.4.3 NAME 'msDFSR-Subscription' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.223 NAME 'msPKI-PrivateKeyRecoveryAgent' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.178 NAME 'pKIEnrollmentService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.211 NAME 'msSFU30MailAliases' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.53 NAME 'typeLibrary' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.8 NAME 'msDFSR-Topology' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.237 NAME 'msDS-AzScope' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.74 NAME 'categoryRegistration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.11 NAME 'comConnectionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.93 NAME 'linkTrackOMTEntry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.10 NAME 'classRegistration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.148 NAME 'siteLinkBridge' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.81 NAME 'rpcServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.46 NAME 'mailRecipient')", + "( 1.2.840.113556.1.5.1 NAME 'securityObject')", + "( 1.2.840.113556.1.5.20 NAME 'leaf')", + "( 1.2.840.113556.1.5.151 NAME 'intellimirrorSCP' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.1 NAME 'msDFSR-LocalSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.186 NAME 'mS-SQL-SQLRepository' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.8 NAME 'organizationalRole' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.20.1 NAME 'subSchema' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.284 NAME 'msDS-DeviceRegistrationService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.84 NAME 'displaySpecifier' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.212 NAME 'msWMI-ShadowObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.59 NAME 'fileLinkTrackingEntry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2161 NAME 'msAuthz-CentralAccessPolicies' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.161 NAME 'mSMQQueue' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.193 NAME 'msCOM-Partition' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.118 NAME 'ipsecFilter' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.2 NAME 'country' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.97 NAME 'physicalLocation' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.30 NAME 'computer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipHostNumber ))", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.153 NAME 'nTFRSMember' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.12 NAME 'applicationEntity' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.11 NAME 'applicationProcess' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.279 NAME 'msDS-ValueType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.204 NAME 'msWMI-UnknownRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.66 NAME 'domain')", + "( 2.5.6.13 NAME 'dSA' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.120 NAME 'ipsecISAKMPPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))" + ], + "dSCorePropagationData": [ + "16010101000000.0Z" + ], + "distinguishedName": [ + "CN=Aggregate,CN=Schema,CN=Configuration,DC=FOREST,DC=LAB" + ], + "instanceType": [ + "4" + ], + "modifyTimeStamp": [ + "20141006121949.0Z" + ], + "name": [ + "Aggregate" + ], + "objectCategory": [ + "CN=SubSchema,CN=Schema,CN=Configuration,DC=FOREST,DC=LAB" + ], + "objectClass": [ + "top", + "subSchema" + ], + "objectClasses": [ + "( 1.2.840.113556.1.6.13.4.6 NAME 'msDFSR-Content' SUP top STRUCTURAL MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 2.5.6.14 NAME 'device' SUP top STRUCTURAL MUST (cn ) MAY (serialNumber $ l $ o $ ou $ owner $ seeAlso $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.205 NAME 'msWMI-IntRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntMax $ msWMI-IntMin ) )", + "( 1.2.840.113556.1.5.5 NAME 'samServer' SUP securityObject STRUCTURAL MAY (samDomainUpdates ) )", + "( 1.2.840.113556.1.5.196 NAME 'msPKI-Enterprise-Oid' SUP top STRUCTURAL MAY (msPKI-Cert-Template-OID $ msPKI-OID-Attribute $ msPKI-OID-CPS $ msPKI-OID-User-Notice $ msPKI-OIDLocalizedName $ msDS-OIDToGroupLink ) )", + "( 1.2.840.113556.1.5.7000.53 NAME 'crossRefContainer' SUP top STRUCTURAL MAY (uPNSuffixes $ msDS-Behavior-Version $ msDS-SPNSuffixes $ msDS-UpdateScript $ msDS-ExecuteScriptPassword $ msDS-EnabledFeature ) )", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' SUP top STRUCTURAL MUST (cn $ ipNetworkNumber ) MAY (l $ description $ uid $ manager $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ ipNetmaskNumber $ nisMapName ) )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP top STRUCTURAL MUST (ou ) MAY (c $ l $ st $ street $ searchGuide $ businessCategory $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ seeAlso $ userPassword $ co $ countryCode $ desktopProfile $ defaultGroup $ managedBy $ uPNSuffixes $ gPLink $ gPOptions $ msCOM-UserPartitionSetLink $ thumbnailLogo ) )", + "( 1.2.840.113556.1.5.152 NAME 'intellimirrorGroup' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.253 NAME 'msFVE-RecoveryInformation' SUP top STRUCTURAL MUST (msFVE-RecoveryPassword $ msFVE-RecoveryGuid ) MAY (msFVE-VolumeGuid $ msFVE-KeyPackage ) )", + "( 1.2.840.113556.1.5.262 NAME 'msImaging-PSPs' SUP container STRUCTURAL )", + "( 1.2.840.113556.1.5.251 NAME 'ms-net-ieee-80211-GroupPolicy' SUP top STRUCTURAL MAY (ms-net-ieee-80211-GP-PolicyGUID $ ms-net-ieee-80211-GP-PolicyData $ ms-net-ieee-80211-GP-PolicyReserved ) )", + "( 1.2.840.113556.1.5.138 NAME 'aCSSubnet' SUP top STRUCTURAL MAY (aCSMaxTokenRatePerFlow $ aCSMaxPeakBandwidthPerFlow $ aCSMaxDurationPerFlow $ aCSAllocableRSVPBandwidth $ aCSMaxPeakBandwidth $ aCSEnableRSVPMessageLogging $ aCSEventLogLevel $ aCSEnableACSService $ aCSRSVPLogFilesLocation $ aCSMaxNoOfLogFiles $ aCSMaxSizeOfRSVPLogFile $ aCSDSBMPriority $ aCSDSBMRefresh $ aCSDSBMDeadTime $ aCSCacheTimeout $ aCSNonReservedTxLimit $ aCSNonReservedTxSize $ aCSEnableRSVPAccounting $ aCSRSVPAccountFilesLocation $ aCSMaxNoOfAccountFiles $ aCSMaxSizeOfRSVPAccountFile $ aCSServerList $ aCSNonReservedPeakRate $ aCSNonReservedTokenSize $ aCSNonReservedMaxSDUSize $ aCSNonReservedMinPolicedSize ) )", + "( 1.2.840.113556.1.5.43 NAME 'fTDfs' SUP top STRUCTURAL MUST (remoteServerName $ pKTGuid $ pKT ) MAY (keywords $ uNCName $ managedBy ) )", + "( 1.2.840.113556.1.5.27 NAME 'rpcEntry' SUP connectionPoint ABSTRACT )", + "( 1.2.840.113556.1.5.85 NAME 'dnsZone' SUP top STRUCTURAL MUST (dc ) MAY (dnsAllowDynamic $ dnsAllowXFR $ dnsSecureSecondaries $ dnsNotifySecondaries $ managedBy $ dNSProperty $ msDNS-IsSigned $ msDNS-SignWithNSEC3 $ msDNS-NSEC3OptOut $ msDNS-MaintainTrustAnchor $ msDNS-DSRecordAlgorithms $ msDNS-RFC5011KeyRollovers $ msDNS-NSEC3HashAlgorithm $ msDNS-NSEC3RandomSaltLength $ msDNS-NSEC3Iterations $ msDNS-DNSKEYRecordSetTTL $ msDNS-DSRecordSetTTL $ msDNS-SignatureInceptionOffset $ msDNS-SecureDelegationPollingPeriod $ msDNS-SigningKeyDescriptors $ msDNS-SigningKeys $ msDNS-DNSKEYRecords $ msDNS-ParentHasSecureDelegation $ msDNS-PropagationTime $ msDNS-NSEC3UserSalt $ msDNS-NSEC3CurrentSalt ) )", + "( 1.2.840.113556.1.4.2163 NAME 'msAuthz-CentralAccessRule' SUP top STRUCTURAL MAY (Enabled $ msAuthz-EffectiveSecurityPolicy $ msAuthz-ProposedSecurityPolicy $ msAuthz-LastEffectiveSecurityPolicy $ msAuthz-ResourceCondition $ msAuthz-MemberRulesInCentralAccessPolicyBL ) )", + "( 1.2.840.113556.1.5.194 NAME 'msCOM-PartitionSet' SUP top STRUCTURAL MAY (msCOM-PartitionLink $ msCOM-DefaultPartitionLink $ msCOM-ObjectId ) )", + "( 1.2.840.113556.1.5.242 NAME 'msDS-QuotaContainer' SUP top STRUCTURAL MUST (cn ) MAY (msDS-DefaultQuota $ msDS-TombstoneQuotaFactor $ msDS-QuotaEffective $ msDS-QuotaUsed $ msDS-TopQuotaUsage ) )", + "( 1.2.840.113556.1.5.281 NAME 'msDS-ClaimsTransformationPolicies' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.146 NAME 'remoteStorageServicePoint' SUP serviceAdministrationPoint STRUCTURAL MAY (remoteStorageGUID ) )", + "( 1.2.840.113556.1.5.2 NAME 'samDomainBase' SUP top AUXILIARY MAY (nTSecurityDescriptor $ creationTime $ forceLogoff $ lockoutDuration $ lockOutObservationWindow $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nextRid $ pwdProperties $ pwdHistoryLength $ revision $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount ) )", + "( 1.2.840.113556.1.5.132 NAME 'dHCPClass' SUP top STRUCTURAL MUST (dhcpUniqueKey $ dhcpType $ dhcpFlags $ dhcpIdentification ) MAY (networkAddress $ dhcpObjName $ dhcpObjDescription $ dhcpServers $ dhcpSubnets $ dhcpMask $ dhcpRanges $ dhcpSites $ dhcpReservations $ superScopes $ superScopeDescription $ optionDescription $ optionsLocation $ dhcpOptions $ dhcpClasses $ mscopeId $ dhcpState $ dhcpProperties $ dhcpMaxKey $ dhcpUpdateTime ) )", + "( 1.2.840.113556.1.5.283 NAME 'msDS-CloudExtensions' SUP top AUXILIARY MAY (msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 ) )", + "( 1.2.840.113556.1.5.89 NAME 'nTFRSSettings' SUP applicationSettings STRUCTURAL MAY (fRSExtensions $ managedBy ) )", + "( 1.2.840.113556.1.5.24 NAME 'remoteMailRecipient' SUP top STRUCTURAL MAY (remoteSource $ remoteSourceType $ managedBy ) )", + "( 1.2.840.113556.1.5.221 NAME 'msTAPI-RtConference' SUP top STRUCTURAL MUST (msTAPI-uid ) MAY (msTAPI-ProtocolId $ msTAPI-ConferenceBlob ) )", + "( 1.2.840.113556.1.5.201 NAME 'msWMI-SimplePolicyTemplate' SUP msWMI-PolicyTemplate STRUCTURAL MUST (msWMI-TargetObject ) )", + "( 1.2.840.113556.1.6.18.2.212 NAME 'msSFU30NetId' SUP top STRUCTURAL MAY (msSFU30Name $ msSFU30KeyValues $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.49 NAME 'packageRegistration' SUP top STRUCTURAL MAY (msiScriptPath $ cOMClassID $ cOMInterfaceID $ cOMProgID $ localeID $ machineArchitecture $ iconPath $ cOMTypelibId $ vendor $ packageType $ setupCommand $ packageName $ packageFlags $ versionNumberHi $ versionNumberLo $ lastUpdateSequence $ managedBy $ msiFileList $ categories $ upgradeProductCode $ msiScript $ canUpgradeScript $ fileExtPriority $ productCode $ msiScriptName $ msiScriptSize $ installUiLevel ) )", + "( 1.2.840.113556.1.5.139 NAME 'lostAndFound' SUP top STRUCTURAL MAY (moveTreeState ) )", + "( 1.2.840.113556.1.5.14 NAME 'connectionPoint' SUP leaf ABSTRACT MUST (cn ) MAY (keywords $ managedBy $ msDS-Settings ) )", + "( 1.2.840.113556.1.5.6 NAME 'securityPrincipal' SUP top AUXILIARY MUST (objectSid $ sAMAccountName ) MAY (nTSecurityDescriptor $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber ) )", + "( 1.2.840.113556.1.5.147 NAME 'siteLink' SUP top STRUCTURAL MUST (siteList ) MAY (cost $ schedule $ options $ replInterval ) )", + "( 1.2.840.113556.1.5.255 NAME 'msDS-PasswordSettings' SUP top STRUCTURAL MUST (msDS-MaximumPasswordAge $ msDS-MinimumPasswordAge $ msDS-MinimumPasswordLength $ msDS-PasswordHistoryLength $ msDS-PasswordComplexityEnabled $ msDS-PasswordReversibleEncryptionEnabled $ msDS-LockoutObservationWindow $ msDS-LockoutDuration $ msDS-LockoutThreshold $ msDS-PasswordSettingsPrecedence ) MAY (msDS-PSOAppliesTo ) )", + "( 1.2.840.113556.1.4.2162 NAME 'msAuthz-CentralAccessRules' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.30 NAME 'serviceInstance' SUP connectionPoint STRUCTURAL MUST (displayName $ serviceClassID ) MAY (winsockAddresses $ serviceInstanceVersion ) )", + "( 1.2.840.113556.1.5.156 NAME 'rRASAdministrationDictionary' SUP top STRUCTURAL MAY (msRRASVendorAttributeEntry ) )", + "( 1.2.840.113556.1.4.2164 NAME 'msAuthz-CentralAccessPolicy' SUP top STRUCTURAL MAY (msAuthz-CentralAccessPolicyID $ msAuthz-MemberRulesInCentralAccessPolicy ) )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP user STRUCTURAL MAY (o $ businessCategory $ userCertificate $ givenName $ initials $ x500uniqueIdentifier $ displayName $ employeeNumber $ employeeType $ homePostalAddress $ userSMIMECertificate $ uid $ mail $ roomNumber $ photo $ manager $ homePhone $ secretary $ mobile $ pager $ audio $ jpegPhoto $ carLicense $ departmentNumber $ preferredLanguage $ userPKCS12 $ labeledURI ) )", + "( 1.2.840.113556.1.5.52 NAME 'fileLinkTracking' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.18 NAME 'domainPolicy' SUP leaf STRUCTURAL MAY (authenticationOptions $ forceLogoff $ defaultLocalPolicyObject $ lockoutDuration $ lockOutObservationWindow $ lockoutThreshold $ maxPwdAge $ maxRenewAge $ maxTicketAge $ minPwdAge $ minPwdLength $ minTicketAge $ pwdProperties $ pwdHistoryLength $ proxyLifetime $ eFSPolicy $ publicKeyPolicy $ domainWidePolicy $ domainPolicyReference $ qualityOfService $ ipsecPolicyReference $ managedBy $ domainCAs ) )", + "( 1.2.840.113556.1.6.18.2.216 NAME 'msSFU30NetworkUser' SUP top STRUCTURAL MAY (msSFU30Name $ msSFU30KeyValues $ msSFU30NisDomain $ nisMapName ) )", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' SUP top AUXILIARY MAY (userPassword ) )", + "( 1.2.840.113556.1.5.177 NAME 'pKICertificateTemplate' SUP top STRUCTURAL MAY (displayName $ flags $ pKIDefaultKeySpec $ pKIKeyUsage $ pKIMaxIssuingDepth $ pKICriticalExtensions $ pKIExpirationPeriod $ pKIOverlapPeriod $ pKIExtendedKeyUsage $ pKIDefaultCSPs $ pKIEnrollmentAccess $ msPKI-RA-Signature $ msPKI-Enrollment-Flag $ msPKI-Private-Key-Flag $ msPKI-Certificate-Name-Flag $ msPKI-Minimal-Key-Size $ msPKI-Template-Schema-Version $ msPKI-Template-Minor-Revision $ msPKI-Cert-Template-OID $ msPKI-Supersede-Templates $ msPKI-RA-Policies $ msPKI-Certificate-Policy $ msPKI-Certificate-Application-Policy $ msPKI-RA-Application-Policies ) )", + "( 1.2.840.113556.1.5.293 NAME 'msDS-AuthNPolicies' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.6.13.4.2 NAME 'msDFSR-Subscriber' SUP top STRUCTURAL MUST (msDFSR-ReplicationGroupGuid $ msDFSR-MemberReference ) MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.31 NAME 'site' SUP top STRUCTURAL MAY (location $ notificationList $ managedBy $ gPLink $ gPOptions $ mSMQSiteID $ mSMQNt4Stub $ mSMQSiteForeign $ mSMQInterval1 $ mSMQInterval2 $ msDS-BridgeHeadServersUsed ) )", + "( 1.2.840.113556.1.5.222 NAME 'msTAPI-RtPerson' SUP top STRUCTURAL MAY (msTAPI-uid $ msTAPI-IpAddress ) )", + "( 1.2.840.113556.1.5.68 NAME 'applicationSiteSettings' SUP top ABSTRACT MAY (applicationName $ notificationList ) )", + "( 1.2.840.113556.1.3.14 NAME 'attributeSchema' SUP top STRUCTURAL MUST (cn $ attributeID $ attributeSyntax $ isSingleValued $ oMSyntax $ lDAPDisplayName $ schemaIDGUID ) MAY (rangeLower $ rangeUpper $ mAPIID $ linkID $ oMObjectClass $ searchFlags $ extendedCharsAllowed $ schemaFlagsEx $ attributeSecurityGUID $ systemOnly $ classDisplayName $ isMemberOfPartialAttributeSet $ isDefunct $ isEphemeral $ msDs-Schema-Extensions $ msDS-IntId ) )", + "( 1.2.840.113556.1.5.267 NAME 'msSPP-ActivationObject' SUP top STRUCTURAL MUST (msSPP-CSVLKSkuId $ msSPP-KMSIds $ msSPP-CSVLKPid $ msSPP-CSVLKPartialProductKey ) MAY (msSPP-InstallationId $ msSPP-ConfirmationId $ msSPP-OnlineLicense $ msSPP-PhoneLicense $ msSPP-ConfigLicense $ msSPP-IssuanceLicense ) )", + "( 1.2.840.113556.1.5.220 NAME 'msDS-App-Configuration' SUP applicationSettings STRUCTURAL MAY (owner $ keywords $ managedBy $ msDS-ByteArray $ msDS-DateTime $ msDS-Integer $ msDS-ObjectReference ) )", + "( 1.2.840.113556.1.3.23 NAME 'container' SUP top STRUCTURAL MUST (cn ) MAY (schemaVersion $ defaultClassStore $ msDS-ObjectReference ) )", + "( 1.2.840.113556.1.6.13.4.10 NAME 'msDFSR-Connection' SUP top STRUCTURAL MUST (fromServer ) MAY (msDFSR-Extension $ msDFSR-Enabled $ msDFSR-Schedule $ msDFSR-Keywords $ msDFSR-Flags $ msDFSR-Options $ msDFSR-RdcEnabled $ msDFSR-RdcMinFileSizeInKb $ msDFSR-Priority $ msDFSR-DisablePacketPrivacy $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.207 NAME 'msWMI-UintRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntMax $ msWMI-IntMin ) )", + "( 1.2.840.113556.1.5.23 NAME 'printQueue' SUP connectionPoint STRUCTURAL MUST (uNCName $ versionNumber $ serverName $ printerName $ shortServerName ) MAY (location $ portName $ driverName $ printSeparatorFile $ priority $ defaultPriority $ printStartTime $ printEndTime $ printFormName $ printBinNames $ printMaxResolutionSupported $ printOrientationsSupported $ printMaxCopies $ printCollate $ printColor $ printLanguage $ printAttributes $ printShareName $ printOwner $ printNotify $ printStatus $ printSpooling $ printKeepPrintedJobs $ driverVersion $ printMaxXExtent $ printMaxYExtent $ printMinXExtent $ printMinYExtent $ printStaplingSupported $ printMemory $ assetNumber $ bytesPerMinute $ printRate $ printRateUnit $ printNetworkAddress $ printMACAddress $ printMediaReady $ printNumberUp $ printMediaSupported $ operatingSystem $ operatingSystemVersion $ operatingSystemServicePack $ operatingSystemHotfix $ physicalLocationObject $ printPagesPerMinute $ printDuplexSupported ) )", + "( 1.2.840.113556.1.5.260 NAME 'msDFS-DeletedLinkv2' SUP top STRUCTURAL MUST (msDFS-NamespaceIdentityGUIDv2 $ msDFS-LastModifiedv2 $ msDFS-LinkPathv2 $ msDFS-LinkIdentityGUIDv2 ) MAY (msDFS-Commentv2 $ msDFS-ShortNameLinkPathv2 ) )", + "( 1.2.840.113556.1.5.140 NAME 'interSiteTransportContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.130 NAME 'indexServerCatalog' SUP connectionPoint STRUCTURAL MUST (creator ) MAY (uNCName $ queryPoint $ indexedScopes $ friendlyNames ) )", + "( 1.2.840.113556.1.5.98 NAME 'ipsecPolicy' SUP ipsecBase STRUCTURAL MAY (ipsecISAKMPReference $ ipsecNFAReference ) )", + "( 2.5.6.0 NAME 'top' ABSTRACT MUST (objectClass $ instanceType $ nTSecurityDescriptor $ objectCategory ) MAY (cn $ description $ distinguishedName $ whenCreated $ whenChanged $ subRefs $ displayName $ uSNCreated $ isDeleted $ dSASignature $ objectVersion $ repsTo $ repsFrom $ memberOf $ ownerBL $ uSNChanged $ uSNLastObjRem $ showInAdvancedViewOnly $ adminDisplayName $ proxyAddresses $ adminDescription $ extensionName $ uSNDSALastObjRemoved $ displayNamePrintable $ directReports $ wWWHomePage $ USNIntersite $ name $ objectGUID $ replPropertyMetaData $ replUpToDateVector $ flags $ revision $ wbemPath $ fSMORoleOwner $ systemFlags $ siteObjectBL $ serverReferenceBL $ nonSecurityMemberBL $ queryPolicyBL $ wellKnownObjects $ isPrivilegeHolder $ partialAttributeSet $ managedObjects $ partialAttributeDeletionList $ url $ lastKnownParent $ bridgeheadServerListBL $ netbootSCPBL $ isCriticalSystemObject $ frsComputerReferenceBL $ fRSMemberReferenceBL $ uSNSource $ fromEntry $ allowedChildClasses $ allowedChildClassesEffective $ allowedAttributes $ allowedAttributesEffective $ possibleInferiors $ canonicalName $ proxiedObjectName $ sDRightsEffective $ dSCorePropagationData $ otherWellKnownObjects $ mS-DS-ConsistencyGuid $ mS-DS-ConsistencyChildCount $ masteredBy $ msCOM-PartitionSetLink $ msCOM-UserLink $ msDS-Approx-Immed-Subordinates $ msDS-NCReplCursors $ msDS-NCReplInboundNeighbors $ msDS-NCReplOutboundNeighbors $ msDS-ReplAttributeMetaData $ msDS-ReplValueMetaData $ msDS-NonMembersBL $ msDS-MembersForAzRoleBL $ msDS-OperationsForAzTaskBL $ msDS-TasksForAzTaskBL $ msDS-OperationsForAzRoleBL $ msDS-TasksForAzRoleBL $ msDs-masteredBy $ msDS-ObjectReferenceBL $ msDS-PrincipalName $ msDS-RevealedDSAs $ msDS-KrbTgtLinkBl $ msDS-IsFullReplicaFor $ msDS-IsDomainFor $ msDS-IsPartialReplicaFor $ msDS-AuthenticatedToAccountlist $ msDS-NC-RO-Replica-Locations-BL $ msDS-RevealedListBL $ msDS-PSOApplied $ msDS-NcType $ msDS-OIDToGroupLinkBl $ msDS-HostServiceAccountBL $ isRecycled $ msDS-LocalEffectiveDeletionTime $ msDS-LocalEffectiveRecycleTime $ msDS-LastKnownRDN $ msDS-EnabledFeatureBL $ msDS-ClaimSharesPossibleValuesWithBL $ msDS-MembersOfResourcePropertyListBL $ msDS-IsPrimaryComputerFor $ msDS-ValueTypeReferenceBL $ msDS-TDOIngressBL $ msDS-TDOEgressBL $ msDS-parentdistname $ msDS-ReplValueMetaDataExt $ msds-memberOfTransitive $ msds-memberTransitive $ structuralObjectClass $ createTimeStamp $ modifyTimeStamp $ subSchemaSubEntry $ msSFU30PosixMemberOf $ msDFSR-MemberReferenceBL $ msDFSR-ComputerReferenceBL ) )", + "( 1.2.840.113556.1.5.36 NAME 'volume' SUP connectionPoint STRUCTURAL MUST (uNCName ) MAY (contentIndexingAllowed $ lastContentIndexed ) )", + "( 1.2.840.113556.1.5.236 NAME 'msDS-AzOperation' SUP top STRUCTURAL MUST (msDS-AzOperationID ) MAY (description $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 2.5.6.9 NAME 'groupOfNames' SUP top STRUCTURAL MUST (cn $ member ) MAY (o $ ou $ businessCategory $ owner $ seeAlso ) )", + "( 1.2.840.113556.1.5.12 NAME 'configuration' SUP top STRUCTURAL MUST (cn ) MAY (gPLink $ gPOptions $ msDS-USNLastSyncSuccess ) )", + "( 1.2.840.113556.1.5.78 NAME 'licensingSiteSettings' SUP applicationSiteSettings STRUCTURAL MAY (siteServer ) )", + "( 1.2.840.113556.1.5.69 NAME 'nTDSSiteSettings' SUP applicationSiteSettings STRUCTURAL MAY (schedule $ options $ queryPolicyObject $ managedBy $ interSiteTopologyGenerator $ interSiteTopologyRenew $ interSiteTopologyFailover $ msDS-Preferred-GC-Site ) )", + "( 1.2.840.113556.1.5.269 NAME 'msDS-ClaimTypePropertyBase' SUP top ABSTRACT MAY (Enabled $ msDS-ClaimPossibleValues $ msDS-ClaimSharesPossibleValuesWith ) )", + "( 1.2.840.113556.1.5.273 NAME 'msDS-ResourceProperty' SUP msDS-ClaimTypePropertyBase STRUCTURAL MUST (msDS-ValueTypeReference ) MAY (msDS-IsUsedAsResourceSecurityAttribute $ msDS-AppliesToResourceTypes ) )", + "( 1.2.840.113556.1.5.239 NAME 'msDS-AzRole' SUP top STRUCTURAL MAY (description $ msDS-MembersForAzRole $ msDS-OperationsForAzRole $ msDS-TasksForAzRole $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' SUP top AUXILIARY MAY (cn $ bootParameter $ bootFile ) )", + "( 1.2.840.113556.1.5.294 NAME 'msDS-AuthNPolicy' SUP top STRUCTURAL MAY (msDS-UserAllowedToAuthenticateTo $ msDS-UserAllowedToAuthenticateFrom $ msDS-UserTGTLifetime $ msDS-ComputerAllowedToAuthenticateTo $ msDS-ComputerTGTLifetime $ msDS-ServiceAllowedToAuthenticateTo $ msDS-ServiceAllowedToAuthenticateFrom $ msDS-ServiceTGTLifetime $ msDS-UserAuthNPolicyBL $ msDS-ComputerAuthNPolicyBL $ msDS-ServiceAuthNPolicyBL $ msDS-AssignedAuthNPolicyBL $ msDS-AuthNPolicyEnforced ) )", + "( 1.2.840.113556.1.5.86 NAME 'dnsNode' SUP top STRUCTURAL MUST (dc ) MAY (dnsRecord $ dNSProperty $ dNSTombstoned ) )", + "( 1.2.840.113556.1.5.210 NAME 'msWMI-StringSetParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-StringDefault ) MAY (msWMI-StringValidValues ) )", + "( 1.2.840.113556.1.5.264 NAME 'msDS-ManagedServiceAccount' SUP computer STRUCTURAL )", + "( 1.2.840.113556.1.5.15 NAME 'contact' SUP organizationalPerson STRUCTURAL MUST (cn ) MAY (notes $ msDS-SourceObjectDN ) )", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY MAY (cn $ description $ userPassword $ homeDirectory $ unixUserPassword $ uid $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell ) )", + "( 1.2.840.113556.1.5.266 NAME 'msSPP-ActivationObjectsContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.217 NAME 'msWMI-ObjectEncoding' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-TargetObject $ msWMI-Class $ msWMI-Genus $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 $ msWMI-ScopeGuid ) )", + "( 1.2.840.113556.1.5.33 NAME 'storage' SUP connectionPoint STRUCTURAL MAY (moniker $ monikerDisplayName $ iconPath ) )", + "( 1.2.840.113556.1.5.67 NAME 'domainDNS' SUP domain STRUCTURAL MAY (managedBy $ msDS-Behavior-Version $ msDS-AllowedDNSSuffixes $ msDS-USNLastSyncSuccess $ msDS-EnabledFeature ) )", + "( 1.2.840.113556.1.5.92 NAME 'linkTrackVolEntry' SUP leaf STRUCTURAL MAY (linkTrackSecret $ volTableIdxGUID $ volTableGUID $ currMachineId $ timeVolChange $ timeRefresh $ seqNotification $ objectCount ) )", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' SUP top AUXILIARY MAY (cn $ macAddress ) )", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' SUP top AUXILIARY MAY (associatedDomain ) )", + "( 1.2.840.113556.1.5.235 NAME 'msDS-AzApplication' SUP top STRUCTURAL MAY (description $ msDS-AzApplicationName $ msDS-AzGenerateAudits $ msDS-AzClassId $ msDS-AzApplicationVersion $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.107 NAME 'sitesContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.263 NAME 'msImaging-PostScanProcess' SUP top STRUCTURAL MUST (displayName $ msImaging-PSPIdentifier ) MAY (serverName $ msImaging-PSPString ) )", + "( 1.2.840.113556.1.5.240 NAME 'msieee80211-Policy' SUP top STRUCTURAL MAY (msieee80211-Data $ msieee80211-DataType $ msieee80211-ID ) )", + "( 1.2.840.113556.1.5.95 NAME 'subnetContainer' SUP top STRUCTURAL )", + "( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MAY (cn $ l $ o $ ou $ description $ seeAlso $ documentIdentifier $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) )", + "( 2.5.6.6 NAME 'person' SUP top STRUCTURAL MUST (cn ) MAY (sn $ serialNumber $ telephoneNumber $ seeAlso $ userPassword $ attributeCertificateAttribute ) )", + "( 1.2.840.113556.1.5.274 NAME 'msDS-ResourcePropertyList' SUP top STRUCTURAL MAY (msDS-MembersOfResourcePropertyList ) )", + "( 1.2.840.113556.1.5.270 NAME 'msDS-ClaimTypes' SUP top STRUCTURAL )", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' SUP top AUXILIARY MAY (description $ userPassword $ uid $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ) )", + "( 1.2.840.113556.1.5.179 NAME 'mSMQMigratedUser' SUP top STRUCTURAL MAY (objectSid $ mSMQSignCertificates $ mSMQDigests $ mSMQDigestsMig $ mSMQSignCertificatesMig $ mSMQUserSid ) )", + "( 1.2.840.113556.1.5.185 NAME 'mS-SQL-OLAPServer' SUP serviceConnectionPoint STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-RegisteredOwner $ mS-SQL-Contact $ mS-SQL-Build $ mS-SQL-ServiceAccount $ mS-SQL-Status $ mS-SQL-InformationURL $ mS-SQL-PublicationURL $ mS-SQL-Version $ mS-SQL-Language $ mS-SQL-Keywords ) )", + "( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject' SUP top AUXILIARY MAY (msDS-Entry-Time-To-Die $ entryTTL ) )", + "( 1.2.840.113556.1.5.155 NAME 'nTFRSSubscriber' SUP top STRUCTURAL MUST (fRSRootPath $ fRSStagingPath ) MAY (schedule $ fRSUpdateTimeout $ fRSFaultCondition $ fRSServiceCommand $ fRSExtensions $ fRSFlags $ fRSMemberReference $ fRSServiceCommandStatus $ fRSTimeLastCommand $ fRSTimeLastConfigChange ) )", + "( 1.2.840.113556.1.5.129 NAME 'rIDSet' SUP top STRUCTURAL MUST (rIDAllocationPool $ rIDPreviousAllocationPool $ rIDUsedPool $ rIDNextRID ) )", + "( 1.2.840.113556.1.3.58 NAME 'addressTemplate' SUP displayTemplate STRUCTURAL MUST (displayName ) MAY (addressSyntax $ perMsgDialogDisplayTable $ perRecipDialogDisplayTable $ addressType $ proxyGenerationEnabled ) )", + "( 1.2.840.113556.1.5.154 NAME 'nTFRSSubscriptions' SUP top STRUCTURAL MAY (fRSWorkingPath $ fRSExtensions $ fRSVersion ) )", + "( 1.2.840.113556.1.5.7000.47 NAME 'nTDSDSA' SUP applicationSettings STRUCTURAL MAY (hasMasterNCs $ hasPartialReplicaNCs $ dMDLocation $ invocationId $ networkAddress $ options $ fRSRootPath $ serverReference $ lastBackupRestorationTime $ queryPolicyObject $ managedBy $ retiredReplDSASignatures $ msDS-Behavior-Version $ msDS-HasInstantiatedNCs $ msDS-ReplicationEpoch $ msDS-HasDomainNCs $ msDS-RetiredReplNCSignatures $ msDS-hasMasterNCs $ msDS-RevealedUsers $ msDS-hasFullReplicaNCs $ msDS-NeverRevealGroup $ msDS-RevealOnDemandGroup $ msDS-isGC $ msDS-isRODC $ msDS-SiteName $ msDS-IsUserCachableAtRodc $ msDS-EnabledFeature ) )", + "( 1.2.840.113556.1.5.175 NAME 'infrastructureUpdate' SUP top STRUCTURAL MAY (dNReferenceUpdate ) )", + "( 1.2.840.113556.1.6.18.2.215 NAME 'msSFU30DomainInfo' SUP top STRUCTURAL MAY (msSFU30SearchContainer $ msSFU30MasterServerName $ msSFU30OrderNumber $ msSFU30Domains $ msSFU30YpServers $ msSFU30MaxGidNumber $ msSFU30MaxUidNumber $ msSFU30IsValidContainer $ msSFU30CryptMethod ) )", + "( 1.2.840.113556.1.5.213 NAME 'msWMI-Som' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-Name ) MAY (msWMI-Author $ msWMI-ChangeDate $ msWMI-CreationDate $ msWMI-SourceOrganization $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.82 NAME 'rpcProfile' SUP rpcEntry STRUCTURAL )", + "( 1.2.840.113556.1.5.164 NAME 'mSMQSiteLink' SUP top STRUCTURAL MUST (mSMQSite1 $ mSMQSite2 $ mSMQCost ) MAY (mSMQSiteGates $ mSMQSiteGatesMig ) )", + "( 1.2.840.113556.1.5.184 NAME 'mS-SQL-SQLServer' SUP serviceConnectionPoint STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-RegisteredOwner $ mS-SQL-Contact $ mS-SQL-Location $ mS-SQL-Memory $ mS-SQL-Build $ mS-SQL-ServiceAccount $ mS-SQL-CharacterSet $ mS-SQL-SortOrder $ mS-SQL-UnicodeSortOrder $ mS-SQL-Clustered $ mS-SQL-NamedPipe $ mS-SQL-MultiProtocol $ mS-SQL-SPX $ mS-SQL-TCPIP $ mS-SQL-AppleTalk $ mS-SQL-Vines $ mS-SQL-Status $ mS-SQL-LastUpdatedDate $ mS-SQL-InformationURL $ mS-SQL-GPSLatitude $ mS-SQL-GPSLongitude $ mS-SQL-GPSHeight $ mS-SQL-Keywords ) )", + "( 1.2.840.113556.1.5.106 NAME 'queryPolicy' SUP top STRUCTURAL MAY (lDAPAdminLimits $ lDAPIPDenyList ) )", + "( 1.2.840.113556.1.5.162 NAME 'mSMQConfiguration' SUP top STRUCTURAL MAY (mSMQQuota $ mSMQJournalQuota $ mSMQOwnerID $ mSMQSites $ mSMQOutRoutingServers $ mSMQInRoutingServers $ mSMQServiceType $ mSMQComputerType $ mSMQForeign $ mSMQOSType $ mSMQEncryptKey $ mSMQSignKey $ mSMQDependentClientServices $ mSMQRoutingServices $ mSMQDsServices $ mSMQComputerTypeEx ) )", + "( 1.2.840.113556.1.5.257 NAME 'msDFS-NamespaceAnchor' SUP top STRUCTURAL MUST (msDFS-SchemaMajorVersion ) )", + "( 1.2.840.113556.1.6.13.4.7 NAME 'msDFSR-ContentSet' SUP top STRUCTURAL MAY (description $ msDFSR-Extension $ msDFSR-RootSizeInMb $ msDFSR-StagingSizeInMb $ msDFSR-ConflictSizeInMb $ msDFSR-FileFilter $ msDFSR-DirectoryFilter $ msDFSR-Flags $ msDFSR-Options $ msDFSR-DfsPath $ msDFSR-Priority $ msDFSR-DeletedSizeInMb $ msDFSR-DefaultCompressionExclusionFilter $ msDFSR-OnDemandExclusionFileFilter $ msDFSR-OnDemandExclusionDirectoryFilter $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.276 NAME 'msTPM-InformationObjectsContainer' SUP top STRUCTURAL MUST (cn ) )", + "( 1.2.840.113556.1.5.209 NAME 'msWMI-RealRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-Int8Default ) MAY (msWMI-Int8Max $ msWMI-Int8Min ) )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL MAY (c $ l $ st $ street $ o $ ou $ title $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ givenName $ initials $ generationQualifier $ houseIdentifier $ otherTelephone $ otherPager $ co $ department $ company $ streetAddress $ otherHomePhone $ msExchHouseIdentifier $ personalTitle $ homePostalAddress $ countryCode $ employeeID $ comment $ division $ otherFacsimileTelephoneNumber $ otherMobile $ primaryTelexNumber $ primaryInternationalISDNNumber $ mhsORAddress $ otherMailbox $ assistant $ ipPhone $ otherIpPhone $ msDS-AllowedToDelegateTo $ msDS-PhoneticFirstName $ msDS-PhoneticLastName $ msDS-PhoneticDepartment $ msDS-PhoneticCompanyName $ msDS-PhoneticDisplayName $ msDS-HABSeniorityIndex $ msDS-AllowedToActOnBehalfOfOtherIdentity $ mail $ manager $ homePhone $ mobile $ pager $ middleName $ thumbnailPhoto $ thumbnailLogo ) )", + "( 1.2.840.113556.1.5.176 NAME 'msExchConfigurationContainer' SUP container STRUCTURAL MAY (addressBookRoots $ globalAddressList $ templateRoots $ addressBookRoots2 $ globalAddressList2 $ templateRoots2 ) )", + "( 1.2.840.113556.1.5.278 NAME 'msKds-ProvRootKey' SUP top STRUCTURAL MUST (cn $ msKds-KDFAlgorithmID $ msKds-SecretAgreementAlgorithmID $ msKds-PublicKeyLength $ msKds-PrivateKeyLength $ msKds-RootKeyData $ msKds-Version $ msKds-DomainID $ msKds-UseStartTime $ msKds-CreateTime ) MAY (msKds-KDFParam $ msKds-SecretAgreementParam ) )", + "( 1.2.840.113556.1.5.238 NAME 'msDS-AzTask' SUP top STRUCTURAL MAY (description $ msDS-AzBizRule $ msDS-AzBizRuleLanguage $ msDS-AzLastImportedBizRulePath $ msDS-OperationsForAzTask $ msDS-TasksForAzTask $ msDS-AzTaskIsRoleDefinition $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.282 NAME 'msDS-GroupManagedServiceAccount' SUP computer STRUCTURAL MUST (msDS-ManagedPasswordInterval ) MAY (msDS-ManagedPassword $ msDS-ManagedPasswordId $ msDS-ManagedPasswordPreviousId $ msDS-GroupMSAMembership ) )", + "( 1.3.6.1.1.1.2.9 NAME 'nisMap' SUP top STRUCTURAL MUST (cn $ nisMapName ) MAY (description ) )", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' SUP top STRUCTURAL MUST (cn $ nisMapName $ nisMapEntry ) MAY (description $ msSFU30Name $ msSFU30NisDomain ) )", + "( 1.2.840.113556.1.5.277 NAME 'msKds-ProvServerConfiguration' SUP top STRUCTURAL MUST (msKds-Version ) MAY (msKds-KDFAlgorithmID $ msKds-KDFParam $ msKds-SecretAgreementAlgorithmID $ msKds-SecretAgreementParam $ msKds-PublicKeyLength $ msKds-PrivateKeyLength ) )", + "( 1.2.840.113556.1.6.18.2.217 NAME 'msSFU30NISMapConfig' SUP top STRUCTURAL MAY (msSFU30KeyAttributes $ msSFU30FieldSeparator $ msSFU30IntraFieldSeparator $ msSFU30SearchAttributes $ msSFU30ResultAttributes $ msSFU30MapFilter $ msSFU30NSMAPFieldPosition ) )", + "( 1.2.840.113556.1.5.7000.48 NAME 'serversContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.90 NAME 'linkTrackVolumeTable' SUP fileLinkTracking STRUCTURAL )", + "( 1.2.840.113556.1.5.188 NAME 'mS-SQL-SQLDatabase' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Status $ mS-SQL-InformationURL $ mS-SQL-Description $ mS-SQL-Alias $ mS-SQL-Size $ mS-SQL-CreationDate $ mS-SQL-LastBackupDate $ mS-SQL-LastDiagnosticDate $ mS-SQL-Applications $ mS-SQL-Keywords ) )", + "( 1.2.840.113556.1.5.211 NAME 'msWMI-PolicyType' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-TargetObject ) MAY (msWMI-Author $ msWMI-ChangeDate $ msWMI-CreationDate $ msWMI-SourceOrganization $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.183 NAME 'dSUISettings' SUP top STRUCTURAL MAY (dSUIAdminNotification $ dSUIAdminMaximum $ dSUIShellMaximum $ msDS-Security-Group-Extra-Classes $ msDS-Non-Security-Group-Extra-Classes $ msDS-FilterContainers ) )", + "( 1.2.840.113556.1.5.157 NAME 'groupPolicyContainer' SUP container STRUCTURAL MAY (flags $ versionNumber $ gPCFunctionalityVersion $ gPCFileSysPath $ gPCMachineExtensionNames $ gPCUserExtensionNames $ gPCWQLFilter ) )", + "( 1.2.840.113556.1.5.3 NAME 'samDomain' SUP top AUXILIARY MAY (description $ cACertificate $ builtinCreationTime $ builtinModifiedCount $ creationTime $ domainPolicyObject $ defaultLocalPolicyObject $ lockoutDuration $ lockOutObservationWindow $ lSACreationTime $ lSAModifiedCount $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nETBIOSName $ nextRid $ pwdProperties $ pwdHistoryLength $ privateKey $ replicaSource $ controlAccessRights $ auditingPolicy $ eFSPolicy $ desktopProfile $ nTMixedDomain $ rIDManagerReference $ treeName $ pekList $ pekKeyChangeInterval $ gPLink $ gPOptions $ ms-DS-MachineAccountQuota $ msDS-LogonTimeSyncInterval $ msDS-PerUserTrustQuota $ msDS-AllUsersTrustQuota $ msDS-PerUserTrustTombstonesQuota ) )", + "( 1.2.840.113556.1.5.234 NAME 'msDS-AzAdminManager' SUP top STRUCTURAL MAY (description $ msDS-AzDomainTimeout $ msDS-AzScriptEngineCacheMax $ msDS-AzScriptTimeout $ msDS-AzGenerateAudits $ msDS-AzApplicationData $ msDS-AzMajorVersion $ msDS-AzMinorVersion $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.214 NAME 'msWMI-Rule' SUP top STRUCTURAL MUST (msWMI-Query $ msWMI-QueryLanguage $ msWMI-TargetNameSpace ) )", + "( 1.2.840.113556.1.5.254 NAME 'nTDSDSARO' SUP nTDSDSA STRUCTURAL )", + "( 1.2.840.113556.1.5.286 NAME 'msDS-Device' SUP top STRUCTURAL MUST (displayName $ altSecurityIdentities $ msDS-IsEnabled $ msDS-DeviceID ) MAY (msDS-DeviceOSType $ msDS-DeviceOSVersion $ msDS-DevicePhysicalIDs $ msDS-DeviceObjectVersion $ msDS-RegisteredOwner $ msDS-ApproximateLastLogonTimeStamp $ msDS-RegisteredUsers $ msDS-IsManaged $ msDS-CloudIsManaged $ msDS-CloudAnchor ) )", + "( 1.2.840.113556.1.5.34 NAME 'trustedDomain' SUP leaf STRUCTURAL MAY (securityIdentifier $ trustAuthIncoming $ trustDirection $ trustPartner $ trustPosixOffset $ trustAuthOutgoing $ trustType $ trustAttributes $ domainCrossRef $ flatName $ initialAuthIncoming $ initialAuthOutgoing $ domainIdentifier $ additionalTrustedServiceNames $ mS-DS-CreatorSID $ msDS-TrustForestTrustInfo $ msDS-SupportedEncryptionTypes $ msDS-IngressClaimsTransformationPolicy $ msDS-EgressClaimsTransformationPolicy ) )", + "( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST (cn ) MAY (description $ telephoneNumber $ seeAlso $ location $ roomNumber ) )", + "( 2.5.6.4 NAME 'organization' SUP top STRUCTURAL MUST (o ) MAY (l $ st $ street $ searchGuide $ businessCategory $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ seeAlso $ userPassword ) )", + "( 1.2.840.113556.1.5.272 NAME 'msDS-ClaimType' SUP msDS-ClaimTypePropertyBase STRUCTURAL MAY (msDS-ClaimValueType $ msDS-ClaimAttributeSource $ msDS-ClaimTypeAppliesToClass $ msDS-ClaimSource $ msDS-ClaimSourceType $ msDS-ClaimIsValueSpaceRestricted $ msDS-ClaimIsSingleValued ) )", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' SUP top STRUCTURAL MUST (cn $ ipServicePort $ ipServiceProtocol ) MAY (description $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' SUP top STRUCTURAL MUST (cn $ ipProtocolNumber ) MAY (description $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.80 NAME 'rpcGroup' SUP rpcEntry STRUCTURAL MAY (rpcNsGroup $ rpcNsObjectID ) )", + "( 1.2.840.113556.1.5.17 NAME 'server' SUP top STRUCTURAL MAY (serialNumber $ serverReference $ dNSHostName $ managedBy $ mailAddress $ bridgeheadTransportList $ msDS-isGC $ msDS-isRODC $ msDS-SiteName $ msDS-IsUserCachableAtRodc ) )", + "( 1.2.840.113556.1.5.28 NAME 'secret' SUP leaf STRUCTURAL MAY (currentValue $ lastSetTime $ priorSetTime $ priorValue ) )", + "( 1.2.840.113556.1.5.163 NAME 'mSMQEnterpriseSettings' SUP top STRUCTURAL MAY (mSMQNameStyle $ mSMQCSPName $ mSMQLongLived $ mSMQVersion $ mSMQInterval1 $ mSMQInterval2 ) )", + "( 1.2.840.113556.1.5.202 NAME 'msWMI-MergeablePolicyTemplate' SUP msWMI-PolicyTemplate STRUCTURAL )", + "( 1.2.840.113556.1.5.195 NAME 'msPKI-Key-Recovery-Agent' SUP user STRUCTURAL )", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST (co ) )", + "( 1.2.840.113556.1.5.258 NAME 'msDFS-Namespacev2' SUP top STRUCTURAL MUST (msDFS-SchemaMajorVersion $ msDFS-SchemaMinorVersion $ msDFS-GenerationGUIDv2 $ msDFS-NamespaceIdentityGUIDv2 $ msDFS-LastModifiedv2 $ msDFS-Ttlv2 $ msDFS-Propertiesv2 $ msDFS-TargetListv2 ) MAY (msDFS-Commentv2 ) )", + "( 1.2.840.113556.1.5.96 NAME 'subnet' SUP top STRUCTURAL MAY (location $ siteObject $ physicalLocationObject ) )", + "( 1.2.840.113556.1.5.216 NAME 'applicationVersion' SUP applicationSettings STRUCTURAL MAY (owner $ keywords $ versionNumber $ vendor $ versionNumberHi $ versionNumberLo $ managedBy $ appSchemaVersion ) )", + "( 2.5.6.10 NAME 'residentialPerson' SUP person STRUCTURAL MAY (l $ st $ street $ ou $ title $ businessCategory $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod ) )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST (cn ) MAY (authorityRevocationList $ certificateRevocationList $ deltaRevocationList $ cRLPartitionedRevocationList $ certificateAuthorityObject ) )", + "( 1.2.840.113556.1.5.137 NAME 'aCSPolicy' SUP top STRUCTURAL MAY (aCSTimeOfDay $ aCSDirection $ aCSMaxTokenRatePerFlow $ aCSMaxPeakBandwidthPerFlow $ aCSAggregateTokenRatePerUser $ aCSMaxDurationPerFlow $ aCSServiceType $ aCSTotalNoOfFlows $ aCSPriority $ aCSPermissionBits $ aCSIdentityName $ aCSMaxAggregatePeakRatePerUser $ aCSMaxTokenBucketPerFlow $ aCSMaximumSDUSize $ aCSMinimumPolicedSize $ aCSMinimumLatency $ aCSMinimumDelayVariation ) )", + "( 1.2.840.113556.1.5.77 NAME 'controlAccessRight' SUP top STRUCTURAL MAY (rightsGuid $ appliesTo $ localizationDisplayId $ validAccesses ) )", + "( 1.2.840.113556.1.5.219 NAME 'msMQ-Group' SUP top STRUCTURAL MUST (member ) )", + "( 1.2.840.113556.1.5.8 NAME 'group' SUP top STRUCTURAL MUST (groupType ) MAY (member $ nTGroupMembers $ operatorCount $ adminCount $ groupAttributes $ groupMembershipSAM $ controlAccessRights $ desktopProfile $ nonSecurityMember $ managedBy $ primaryGroupToken $ msDS-AzLDAPQuery $ msDS-NonMembers $ msDS-AzBizRule $ msDS-AzBizRuleLanguage $ msDS-AzLastImportedBizRulePath $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData $ msDS-PrimaryComputer $ mail $ msSFU30Name $ msSFU30NisDomain $ msSFU30PosixMember ) )", + "( 1.2.840.113556.1.6.23.2 NAME 'msPrint-ConnectionPolicy' SUP top STRUCTURAL MUST (cn ) MAY (uNCName $ serverName $ printAttributes $ printerName ) )", + "( 1.2.840.113556.1.3.11 NAME 'crossRef' SUP top STRUCTURAL MUST (cn $ nCName $ dnsRoot ) MAY (Enabled $ nETBIOSName $ nTMixedDomain $ trustParent $ superiorDNSRoot $ rootTrust $ msDS-Behavior-Version $ msDS-NC-Replica-Locations $ msDS-Replication-Notify-First-DSA-Delay $ msDS-Replication-Notify-Subsequent-DSA-Delay $ msDS-SDReferenceDomain $ msDS-DnsRootAlias $ msDS-NC-RO-Replica-Locations ) )", + "( 1.2.840.113556.1.6.13.4.9 NAME 'msDFSR-Member' SUP top STRUCTURAL MUST (msDFSR-ComputerReference ) MAY (serverReference $ msDFSR-Extension $ msDFSR-Keywords $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.3.59 NAME 'displayTemplate' SUP top STRUCTURAL MUST (cn ) MAY (helpData32 $ originalDisplayTableMSDOS $ addressEntryDisplayTable $ helpFileName $ addressEntryDisplayTableMSDOS $ helpData16 $ originalDisplayTable ) )", + "( 1.2.840.113556.1.3.13 NAME 'classSchema' SUP top STRUCTURAL MUST (cn $ subClassOf $ governsID $ objectClassCategory $ schemaIDGUID $ defaultObjectCategory ) MAY (possSuperiors $ mustContain $ mayContain $ rDNAttID $ auxiliaryClass $ lDAPDisplayName $ schemaFlagsEx $ systemOnly $ systemPossSuperiors $ systemMayContain $ systemMustContain $ systemAuxiliaryClass $ defaultSecurityDescriptor $ defaultHidingValue $ classDisplayName $ isDefunct $ msDs-Schema-Extensions $ msDS-IntId ) )", + "( 1.2.840.113556.1.5.200 NAME 'msWMI-PolicyTemplate' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-Name $ msWMI-NormalizedClass $ msWMI-TargetClass $ msWMI-TargetNameSpace $ msWMI-TargetPath ) MAY (msWMI-Author $ msWMI-ChangeDate $ msWMI-CreationDate $ msWMI-SourceOrganization $ msWMI-TargetType $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.165 NAME 'mSMQSettings' SUP top STRUCTURAL MAY (mSMQOwnerID $ mSMQServices $ mSMQQMID $ mSMQMigrated $ mSMQNt4Flags $ mSMQSiteName $ mSMQRoutingService $ mSMQDsService $ mSMQDependentClientService $ mSMQSiteNameEx ) )", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' SUP top STRUCTURAL MUST (cn $ oncRpcNumber ) MAY (description $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.126 NAME 'serviceConnectionPoint' SUP connectionPoint STRUCTURAL MAY (versionNumber $ vendor $ versionNumberHi $ versionNumberLo $ serviceClassName $ serviceBindingInformation $ serviceDNSName $ serviceDNSNameType $ appSchemaVersion ) )", + "( 1.2.840.113556.1.5.4 NAME 'builtinDomain' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.241 NAME 'msDS-AppData' SUP applicationSettings STRUCTURAL MAY (owner $ keywords $ managedBy $ msDS-ByteArray $ msDS-DateTime $ msDS-Integer $ msDS-ObjectReference ) )", + "( 1.2.840.113556.1.5.73 NAME 'rpcServerElement' SUP rpcEntry STRUCTURAL MUST (rpcNsBindings $ rpcNsInterfaceID $ rpcNsTransferSyntax ) )", + "( 1.2.840.113556.1.5.150 NAME 'rRASAdministrationConnectionPoint' SUP serviceAdministrationPoint STRUCTURAL MAY (msRRASAttribute ) )", + "( 1.2.840.113556.1.5.191 NAME 'aCSResourceLimits' SUP top STRUCTURAL MAY (aCSMaxTokenRatePerFlow $ aCSMaxPeakBandwidthPerFlow $ aCSServiceType $ aCSAllocableRSVPBandwidth $ aCSMaxPeakBandwidth ) )", + "( 2.5.6.3 NAME 'locality' SUP top STRUCTURAL MUST (l ) MAY (st $ street $ searchGuide $ seeAlso ) )", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost' SUP top AUXILIARY MAY (cn $ l $ description $ uid $ manager $ ipHostNumber ) )", + "( 1.2.840.113556.1.5.275 NAME 'msTPM-InformationObject' SUP top STRUCTURAL MUST (msTPM-OwnerInformation ) MAY (msTPM-SrkPubThumbprint $ msTPM-OwnerInformationTemp ) )", + "( 1.2.840.113556.1.5.289 NAME 'msDS-DeviceContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.4.2129 NAME 'msDNS-ServerSettings' SUP top STRUCTURAL MAY (msDNS-KeymasterZones ) )", + "( 1.2.840.113556.1.5.76 NAME 'foreignSecurityPrincipal' SUP top STRUCTURAL MUST (objectSid ) MAY (foreignIdentifier ) )", + "( 1.2.840.113556.1.5.44 NAME 'classStore' SUP top STRUCTURAL MAY (versionNumber $ nextLevelStore $ lastUpdateSequence $ appSchemaVersion ) )", + "( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MAY (l $ o $ ou $ description $ seeAlso $ uid $ host ) )", + "( 1.2.840.113556.1.5.26 NAME 'rpcProfileElement' SUP rpcEntry STRUCTURAL MUST (rpcNsInterfaceID $ rpcNsPriority ) MAY (rpcNsProfileEntry $ rpcNsAnnotation ) )", + "( 1.2.840.113556.1.5.215 NAME 'msWMI-WMIGPO' SUP top STRUCTURAL MUST (msWMI-TargetClass ) MAY (msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.243 NAME 'msDS-QuotaControl' SUP top STRUCTURAL MUST (cn $ msDS-QuotaTrustee $ msDS-QuotaAmount ) )", + "( 1.2.840.113556.1.5.256 NAME 'msDS-PasswordSettingsContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.187 NAME 'mS-SQL-SQLPublication' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Status $ mS-SQL-Description $ mS-SQL-Type $ mS-SQL-Database $ mS-SQL-AllowAnonymousSubscription $ mS-SQL-Publisher $ mS-SQL-AllowKnownPullSubscription $ mS-SQL-AllowImmediateUpdatingSubscription $ mS-SQL-AllowQueuedUpdatingSubscription $ mS-SQL-AllowSnapshotFilesFTPDownloading $ mS-SQL-ThirdParty ) )", + "( 1.2.840.113556.1.5.9 NAME 'user' SUP organizationalPerson STRUCTURAL MAY (o $ businessCategory $ userCertificate $ givenName $ initials $ x500uniqueIdentifier $ displayName $ networkAddress $ employeeNumber $ employeeType $ homePostalAddress $ userAccountControl $ badPwdCount $ codePage $ homeDirectory $ homeDrive $ badPasswordTime $ lastLogoff $ lastLogon $ dBCSPwd $ localeID $ scriptPath $ logonHours $ logonWorkstation $ maxStorage $ userWorkstations $ unicodePwd $ otherLoginWorkstations $ ntPwdHistory $ pwdLastSet $ preferredOU $ primaryGroupID $ userParameters $ profilePath $ operatorCount $ adminCount $ accountExpires $ lmPwdHistory $ groupMembershipSAM $ logonCount $ controlAccessRights $ defaultClassStore $ groupsToIgnore $ groupPriority $ desktopProfile $ dynamicLDAPServer $ userPrincipalName $ lockoutTime $ userSharedFolder $ userSharedFolderOther $ servicePrincipalName $ aCSPolicyName $ terminalServer $ mSMQSignCertificates $ mSMQDigests $ mSMQDigestsMig $ mSMQSignCertificatesMig $ msNPAllowDialin $ msNPCallingStationID $ msNPSavedCallingStationID $ msRADIUSCallbackNumber $ msRADIUSFramedIPAddress $ msRADIUSFramedRoute $ msRADIUSServiceType $ msRASSavedCallbackNumber $ msRASSavedFramedIPAddress $ msRASSavedFramedRoute $ mS-DS-CreatorSID $ msCOM-UserPartitionSetLink $ msDS-Cached-Membership $ msDS-Cached-Membership-Time-Stamp $ msDS-Site-Affinity $ msDS-User-Account-Control-Computed $ lastLogonTimestamp $ msIIS-FTPRoot $ msIIS-FTPDir $ msDRM-IdentityCertificate $ msDS-SourceObjectDN $ msPKIRoamingTimeStamp $ msPKIDPAPIMasterKeys $ msPKIAccountCredentials $ msRADIUS-FramedInterfaceId $ msRADIUS-SavedFramedInterfaceId $ msRADIUS-FramedIpv6Prefix $ msRADIUS-SavedFramedIpv6Prefix $ msRADIUS-FramedIpv6Route $ msRADIUS-SavedFramedIpv6Route $ msDS-SecondaryKrbTgtNumber $ msDS-AuthenticatedAtDC $ msDS-SupportedEncryptionTypes $ msDS-LastSuccessfulInteractiveLogonTime $ msDS-LastFailedInteractiveLogonTime $ msDS-FailedInteractiveLogonCount $ msDS-FailedInteractiveLogonCountAtLastSuccessfulLogon $ msTSProfilePath $ msTSHomeDirectory $ msTSHomeDrive $ msTSAllowLogon $ msTSRemoteControl $ msTSMaxDisconnectionTime $ msTSMaxConnectionTime $ msTSMaxIdleTime $ msTSReconnectionAction $ msTSBrokenConnectionAction $ msTSConnectClientDrives $ msTSConnectPrinterDrives $ msTSDefaultToMainPrinter $ msTSWorkDirectory $ msTSInitialProgram $ msTSProperty01 $ msTSProperty02 $ msTSExpireDate $ msTSLicenseVersion $ msTSManagingLS $ msDS-UserPasswordExpiryTimeComputed $ msTSExpireDate2 $ msTSLicenseVersion2 $ msTSManagingLS2 $ msTSExpireDate3 $ msTSLicenseVersion3 $ msTSManagingLS3 $ msTSExpireDate4 $ msTSLicenseVersion4 $ msTSManagingLS4 $ msTSLSProperty01 $ msTSLSProperty02 $ msDS-ResultantPSO $ msPKI-CredentialRoamingTokens $ msTSPrimaryDesktop $ msTSSecondaryDesktops $ msDS-PrimaryComputer $ msDS-SyncServerUrl $ msDS-AssignedAuthNPolicySilo $ msDS-AuthNPolicySiloMembersBL $ msDS-AssignedAuthNPolicy $ userSMIMECertificate $ uid $ mail $ roomNumber $ photo $ manager $ homePhone $ secretary $ mobile $ pager $ audio $ jpegPhoto $ carLicense $ departmentNumber $ preferredLanguage $ userPKCS12 $ labeledURI $ msSFU30Name $ msSFU30NisDomain ) )", + "( 1.2.840.113556.1.5.259 NAME 'msDFS-Linkv2' SUP top STRUCTURAL MUST (msDFS-GenerationGUIDv2 $ msDFS-NamespaceIdentityGUIDv2 $ msDFS-LastModifiedv2 $ msDFS-Ttlv2 $ msDFS-Propertiesv2 $ msDFS-TargetListv2 $ msDFS-LinkPathv2 $ msDFS-LinkIdentityGUIDv2 ) MAY (msDFS-Commentv2 $ msDFS-LinkSecurityDescriptorv2 $ msDFS-ShortNameLinkPathv2 ) )", + "( 1.2.840.113556.1.5.141 NAME 'interSiteTransport' SUP top STRUCTURAL MUST (transportDLLName $ transportAddressAttribute ) MAY (options $ replInterval ) )", + "( 1.2.840.113556.1.6.13.4.4 NAME 'msDFSR-GlobalSettings' SUP top STRUCTURAL MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.29 NAME 'serviceClass' SUP leaf STRUCTURAL MUST (displayName $ serviceClassID ) MAY (serviceClassInfo ) )", + "( 1.2.840.113556.1.5.189 NAME 'mS-SQL-OLAPDatabase' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Status $ mS-SQL-LastUpdatedDate $ mS-SQL-InformationURL $ mS-SQL-ConnectionURL $ mS-SQL-PublicationURL $ mS-SQL-Description $ mS-SQL-Type $ mS-SQL-Size $ mS-SQL-LastBackupDate $ mS-SQL-Applications $ mS-SQL-Keywords ) )", + "( 2.5.6.16 NAME 'certificationAuthority' SUP top STRUCTURAL MUST (cn $ cACertificate $ authorityRevocationList $ certificateRevocationList ) MAY (searchGuide $ teletexTerminalIdentifier $ supportedApplicationContext $ crossCertificatePair $ deltaRevocationList $ domainPolicyObject $ parentCA $ dNSHostName $ parentCACertificateChain $ domainID $ cAConnect $ cAWEBURL $ cRLObject $ cAUsages $ previousCACertificates $ pendingCACertificates $ previousParentCA $ pendingParentCA $ currentParentCA $ cACertificateDN $ certificateTemplates $ signatureAlgorithms $ enrollmentProviders ) )", + "( 1.2.840.113556.1.5.104 NAME 'meeting' SUP top STRUCTURAL MUST (meetingName ) MAY (meetingID $ meetingDescription $ meetingKeyword $ meetingLocation $ meetingProtocol $ meetingType $ meetingApplication $ meetingLanguage $ meetingMaxParticipants $ meetingOriginator $ meetingContactInfo $ meetingOwner $ meetingIP $ meetingScope $ meetingAdvertiseScope $ meetingURL $ meetingRating $ meetingIsEncrypted $ meetingRecurrence $ meetingStartTime $ meetingEndTime $ meetingBandwidth $ meetingBlob ) )", + "( 1.2.840.113556.1.5.287 NAME 'msDS-DeviceRegistrationServiceContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.71 NAME 'nTDSConnection' SUP leaf STRUCTURAL MUST (enabledConnection $ fromServer $ options ) MAY (generatedConnection $ schedule $ transportType $ mS-DS-ReplicatesNCReason ) )", + "( 1.2.840.113556.1.5.291 NAME 'msDS-AuthNPolicySilos' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.218 NAME 'msMQ-Custom-Recipient' SUP top STRUCTURAL MAY (msMQ-Recipient-FormatName ) )", + "( 1.2.840.113556.1.5.72 NAME 'nTDSService' SUP top STRUCTURAL MAY (tombstoneLifetime $ dSHeuristics $ garbageCollPeriod $ replTopologyStayOfExecution $ sPNMappings $ msDS-Other-Settings $ msDS-DeletedObjectLifetime ) )", + "( 1.2.840.113556.1.3.9 NAME 'dMD' SUP top STRUCTURAL MUST (cn ) MAY (dmdName $ schemaUpdate $ prefixMap $ schemaInfo $ msDs-Schema-Extensions $ msDS-IntId $ msDS-USNLastSyncSuccess ) )", + "( 1.2.840.113556.1.5.280 NAME 'msDS-ClaimsTransformationPolicyType' SUP top STRUCTURAL MAY (msDS-TransformationRules $ msDS-TransformationRulesCompiled ) )", + "( 0.9.2342.19200300.100.4.14 NAME 'rFC822LocalPart' SUP domain STRUCTURAL MAY (cn $ sn $ street $ description $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ seeAlso ) )", + "( 1.2.840.113556.1.5.190 NAME 'mS-SQL-OLAPCube' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Status $ mS-SQL-LastUpdatedDate $ mS-SQL-InformationURL $ mS-SQL-PublicationURL $ mS-SQL-Description $ mS-SQL-Size $ mS-SQL-Keywords ) )", + "( 1.2.840.113556.1.5.208 NAME 'msWMI-UintSetParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntValidValues ) )", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup' SUP top AUXILIARY MAY (cn $ description $ userPassword $ unixUserPassword $ gidNumber $ memberUid ) )", + "( 2.5.6.17 NAME 'groupOfUniqueNames' SUP top STRUCTURAL MUST (cn $ uniqueMember ) MAY (o $ ou $ description $ businessCategory $ owner $ seeAlso ) )", + "( 1.2.840.113556.1.5.252 NAME 'ms-net-ieee-8023-GroupPolicy' SUP top STRUCTURAL MAY (ms-net-ieee-8023-GP-PolicyGUID $ ms-net-ieee-8023-GP-PolicyData $ ms-net-ieee-8023-GP-PolicyReserved ) )", + "( 1.2.840.113556.1.5.119 NAME 'ipsecNegotiationPolicy' SUP ipsecBase STRUCTURAL MAY (iPSECNegotiationPolicyType $ iPSECNegotiationPolicyAction ) )", + "( 1.2.840.113556.1.5.292 NAME 'msDS-AuthNPolicySilo' SUP top STRUCTURAL MAY (msDS-AssignedAuthNPolicySiloBL $ msDS-AuthNPolicySiloMembers $ msDS-UserAuthNPolicy $ msDS-ComputerAuthNPolicy $ msDS-ServiceAuthNPolicy $ msDS-AuthNPolicySiloEnforced ) )", + "( 1.2.840.113556.1.5.121 NAME 'ipsecNFA' SUP ipsecBase STRUCTURAL MAY (ipsecNegotiationPolicyReference $ ipsecFilterReference ) )", + "( 1.2.840.113556.1.5.42 NAME 'dfsConfiguration' SUP top STRUCTURAL )", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST (cn ) MAY (l $ o $ ou $ description $ telephoneNumber $ seeAlso ) )", + "( 1.2.840.113556.1.5.271 NAME 'msDS-ResourceProperties' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.91 NAME 'linkTrackObjectMoveTable' SUP fileLinkTracking STRUCTURAL )", + "( 1.2.840.113556.1.5.136 NAME 'rpcContainer' SUP container STRUCTURAL MAY (nameServiceFlags ) )", + "( 1.2.840.113556.1.5.83 NAME 'rIDManager' SUP top STRUCTURAL MUST (rIDAvailablePool ) MAY (msDS-RIDPoolAllocationEnabled ) )", + "( 1.2.840.113556.1.5.206 NAME 'msWMI-IntSetParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntValidValues ) )", + "( 1.2.840.113556.1.6.13.4.5 NAME 'msDFSR-ReplicationGroup' SUP top STRUCTURAL MUST (msDFSR-ReplicationGroupType ) MAY (description $ msDFSR-Version $ msDFSR-Extension $ msDFSR-RootSizeInMb $ msDFSR-StagingSizeInMb $ msDFSR-ConflictSizeInMb $ msDFSR-TombstoneExpiryInMin $ msDFSR-FileFilter $ msDFSR-DirectoryFilter $ msDFSR-Schedule $ msDFSR-Flags $ msDFSR-Options $ msDFSR-DeletedSizeInMb $ msDFSR-DefaultCompressionExclusionFilter $ msDFSR-OnDemandExclusionFileFilter $ msDFSR-OnDemandExclusionDirectoryFilter $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.125 NAME 'addressBookContainer' SUP top STRUCTURAL MUST (displayName ) MAY (purportedSearch ) )", + "( 1.2.840.113556.1.5.7000.49 NAME 'applicationSettings' SUP top ABSTRACT MAY (applicationName $ notificationList $ msDS-Settings ) )", + "( 1.2.840.113556.1.5.265 NAME 'msDS-OptionalFeature' SUP top STRUCTURAL MUST (msDS-OptionalFeatureGUID $ msDS-OptionalFeatureFlags ) MAY (msDS-RequiredDomainBehaviorVersion $ msDS-RequiredForestBehaviorVersion ) )", + "( 1.2.840.113556.1.5.94 NAME 'serviceAdministrationPoint' SUP serviceConnectionPoint STRUCTURAL )", + "( 1.2.840.113556.1.5.102 NAME 'nTFRSReplicaSet' SUP top STRUCTURAL MAY (fRSReplicaSetType $ fRSVersionGUID $ schedule $ fRSFileFilter $ fRSDirectoryFilter $ fRSDSPoll $ fRSServiceCommand $ fRSReplicaSetGUID $ fRSLevelLimit $ fRSRootSecurity $ fRSExtensions $ managedBy $ fRSFlags $ fRSPartnerAuthLevel $ fRSPrimaryMember $ msFRS-Topology-Pref $ msFRS-Hub-Member ) )", + "( 1.2.840.113556.1.5.203 NAME 'msWMI-RangeParam' SUP top STRUCTURAL MUST (msWMI-PropertyName $ msWMI-TargetClass $ msWMI-TargetType ) )", + "( 1.2.840.113556.1.5.7000.56 NAME 'ipsecBase' SUP top ABSTRACT MAY (ipsecName $ ipsecID $ ipsecDataType $ ipsecData $ ipsecOwnersReference ) )", + "( 1.2.840.113556.1.6.13.4.3 NAME 'msDFSR-Subscription' SUP top STRUCTURAL MUST (msDFSR-ContentSetGuid $ msDFSR-ReplicationGroupGuid ) MAY (msDFSR-Extension $ msDFSR-RootPath $ msDFSR-RootSizeInMb $ msDFSR-StagingPath $ msDFSR-StagingSizeInMb $ msDFSR-ConflictPath $ msDFSR-ConflictSizeInMb $ msDFSR-Enabled $ msDFSR-Flags $ msDFSR-Options $ msDFSR-RootFence $ msDFSR-DfsLinkTarget $ msDFSR-DeletedPath $ msDFSR-DeletedSizeInMb $ msDFSR-ReadOnly $ msDFSR-CachePolicy $ msDFSR-MinDurationCacheInMin $ msDFSR-MaxAgeInCacheInMin $ msDFSR-OnDemandExclusionFileFilter $ msDFSR-OnDemandExclusionDirectoryFilter $ msDFSR-Options2 $ msDFSR-StagingCleanupTriggerInPercent ) )", + "( 1.2.840.113556.1.5.223 NAME 'msPKI-PrivateKeyRecoveryAgent' SUP top STRUCTURAL MUST (userCertificate ) )", + "( 1.2.840.113556.1.5.178 NAME 'pKIEnrollmentService' SUP top STRUCTURAL MAY (cACertificate $ dNSHostName $ cACertificateDN $ certificateTemplates $ signatureAlgorithms $ enrollmentProviders $ msPKI-Enrollment-Servers $ msPKI-Site-Name ) )", + "( 1.2.840.113556.1.6.18.2.211 NAME 'msSFU30MailAliases' SUP top STRUCTURAL MAY (msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.53 NAME 'typeLibrary' SUP top STRUCTURAL MAY (cOMClassID $ cOMInterfaceID $ cOMUniqueLIBID ) )", + "( 1.2.840.113556.1.6.13.4.8 NAME 'msDFSR-Topology' SUP top STRUCTURAL MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.237 NAME 'msDS-AzScope' SUP top STRUCTURAL MUST (msDS-AzScopeName ) MAY (description $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.74 NAME 'categoryRegistration' SUP leaf STRUCTURAL MAY (localeID $ categoryId $ managedBy $ localizedDescription ) )", + "( 1.2.840.113556.1.5.11 NAME 'comConnectionPoint' SUP connectionPoint STRUCTURAL MUST (cn ) MAY (marshalledInterface $ moniker $ monikerDisplayName ) )", + "( 1.2.840.113556.1.5.93 NAME 'linkTrackOMTEntry' SUP leaf STRUCTURAL MAY (birthLocation $ oMTIndxGuid $ currentLocation $ timeRefresh $ oMTGuid ) )", + "( 1.2.840.113556.1.5.10 NAME 'classRegistration' SUP leaf STRUCTURAL MAY (cOMInterfaceID $ cOMProgID $ cOMCLSID $ cOMTreatAsClassId $ cOMOtherProgId $ implementedCategories $ requiredCategories $ managedBy ) )", + "( 1.2.840.113556.1.5.148 NAME 'siteLinkBridge' SUP top STRUCTURAL MUST (siteLinkList ) )", + "( 1.2.840.113556.1.5.81 NAME 'rpcServer' SUP rpcEntry STRUCTURAL MAY (rpcNsObjectID $ rpcNsCodeset $ rpcNsEntryFlags ) )", + "( 1.2.840.113556.1.3.46 NAME 'mailRecipient' SUP top AUXILIARY MUST (cn ) MAY (telephoneNumber $ userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ showInAddressBook $ userCert $ legacyExchangeDN $ msDS-PhoneticDisplayName $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI ) )", + "( 1.2.840.113556.1.5.1 NAME 'securityObject' SUP top ABSTRACT MUST (cn ) )", + "( 1.2.840.113556.1.5.20 NAME 'leaf' SUP top ABSTRACT )", + "( 1.2.840.113556.1.5.151 NAME 'intellimirrorSCP' SUP serviceAdministrationPoint STRUCTURAL MAY (netbootMachineFilePath $ netbootAllowNewClients $ netbootLimitClients $ netbootMaxClients $ netbootCurrentClientCount $ netbootAnswerRequests $ netbootAnswerOnlyValidClients $ netbootNewMachineNamingPolicy $ netbootNewMachineOU $ netbootIntelliMirrorOSes $ netbootTools $ netbootLocallyInstalledOSes $ netbootServer ) )", + "( 1.2.840.113556.1.6.13.4.1 NAME 'msDFSR-LocalSettings' SUP top STRUCTURAL MAY (msDFSR-Version $ msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 $ msDFSR-CommonStagingPath $ msDFSR-CommonStagingSizeInMb $ msDFSR-StagingCleanupTriggerInPercent ) )", + "( 1.2.840.113556.1.5.186 NAME 'mS-SQL-SQLRepository' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Build $ mS-SQL-Status $ mS-SQL-Version $ mS-SQL-Description $ mS-SQL-InformationDirectory ) )", + "( 2.5.6.8 NAME 'organizationalRole' SUP top STRUCTURAL MUST (cn ) MAY (l $ st $ street $ ou $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ roleOccupant $ seeAlso ) )", + "( 2.5.20.1 NAME 'subSchema' SUP top STRUCTURAL MAY (extendedClassInfo $ extendedAttributeInfo $ dITContentRules $ attributeTypes $ objectClasses $ modifyTimeStamp ) )", + "( 1.2.840.113556.1.5.284 NAME 'msDS-DeviceRegistrationService' SUP top STRUCTURAL MUST (msDS-IsEnabled $ msDS-DeviceLocation ) MAY (msDS-IssuerCertificates $ msDS-RegistrationQuota $ msDS-MaximumRegistrationInactivityPeriod $ msDS-IssuerPublicCertificates $ msDS-CloudIssuerPublicCertificates $ msDS-CloudIsEnabled ) )", + "( 1.2.840.113556.1.5.84 NAME 'displaySpecifier' SUP top STRUCTURAL MAY (iconPath $ creationWizard $ contextMenu $ adminPropertyPages $ shellPropertyPages $ classDisplayName $ adminContextMenu $ shellContextMenu $ attributeDisplayNames $ treatAsLeaf $ createDialog $ createWizardExt $ scopeFlags $ queryFilter $ extraColumns $ adminMultiselectPropertyPages ) )", + "( 1.2.840.113556.1.5.212 NAME 'msWMI-ShadowObject' SUP top STRUCTURAL MUST (msWMI-TargetObject ) )", + "( 1.2.840.113556.1.5.59 NAME 'fileLinkTrackingEntry' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.4.2161 NAME 'msAuthz-CentralAccessPolicies' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.161 NAME 'mSMQQueue' SUP top STRUCTURAL MAY (mSMQQueueType $ mSMQJournal $ mSMQBasePriority $ mSMQLabel $ mSMQAuthenticate $ mSMQPrivacyLevel $ mSMQOwnerID $ mSMQTransactional $ mSMQQueueQuota $ mSMQQueueJournalQuota $ mSMQQueueNameExt $ mSMQLabelEx $ MSMQ-SecuredSource $ MSMQ-MulticastAddress ) )", + "( 1.2.840.113556.1.5.193 NAME 'msCOM-Partition' SUP top STRUCTURAL MAY (msCOM-ObjectId ) )", + "( 1.2.840.113556.1.5.118 NAME 'ipsecFilter' SUP ipsecBase STRUCTURAL )", + "( 2.5.6.2 NAME 'country' SUP top STRUCTURAL MUST (c ) MAY (searchGuide $ co ) )", + "( 1.2.840.113556.1.5.97 NAME 'physicalLocation' SUP locality STRUCTURAL MAY (managedBy ) )", + "( 1.2.840.113556.1.3.30 NAME 'computer' SUP user STRUCTURAL MAY (cn $ networkAddress $ localPolicyFlags $ defaultLocalPolicyObject $ machineRole $ location $ netbootInitialization $ netbootGUID $ netbootMachineFilePath $ siteGUID $ operatingSystem $ operatingSystemVersion $ operatingSystemServicePack $ operatingSystemHotfix $ volumeCount $ physicalLocationObject $ dNSHostName $ policyReplicationFlags $ managedBy $ rIDSetReferences $ catalogs $ netbootSIFFile $ netbootMirrorDataFile $ msDS-AdditionalDnsHostName $ msDS-AdditionalSamAccountName $ msDS-ExecuteScriptPassword $ msDS-KrbTgtLink $ msDS-RevealedUsers $ msDS-NeverRevealGroup $ msDS-RevealOnDemandGroup $ msDS-RevealedList $ msDS-AuthenticatedAtDC $ msDS-isGC $ msDS-isRODC $ msDS-SiteName $ msDS-PromotionSettings $ msTPM-OwnerInformation $ msTSProperty01 $ msTSProperty02 $ msDS-IsUserCachableAtRodc $ msDS-HostServiceAccount $ msTSEndpointData $ msTSEndpointType $ msTSEndpointPlugin $ msTSPrimaryDesktopBL $ msTSSecondaryDesktopBL $ msTPM-TpmInformationForComputer $ msDS-GenerationId $ msImaging-ThumbprintHash $ msImaging-HashAlgorithm $ netbootDUID $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' SUP top STRUCTURAL MUST (cn ) MAY (description $ msSFU30Name $ msSFU30NisDomain $ msSFU30NetgroupHostAtDomain $ msSFU30NetgroupUserAtDomain $ memberNisNetgroup $ nisNetgroupTriple $ nisMapName ) )", + "( 1.2.840.113556.1.5.153 NAME 'nTFRSMember' SUP top STRUCTURAL MAY (fRSUpdateTimeout $ fRSServiceCommand $ serverReference $ fRSRootSecurity $ fRSExtensions $ frsComputerReference $ fRSControlDataCreation $ fRSControlInboundBacklog $ fRSControlOutboundBacklog $ fRSFlags $ fRSPartnerAuthLevel ) )", + "( 2.5.6.12 NAME 'applicationEntity' SUP top STRUCTURAL MUST (cn $ presentationAddress ) MAY (l $ o $ ou $ supportedApplicationContext $ seeAlso ) )", + "( 2.5.6.11 NAME 'applicationProcess' SUP top STRUCTURAL MUST (cn ) MAY (l $ ou $ seeAlso ) )", + "( 1.2.840.113556.1.5.279 NAME 'msDS-ValueType' SUP top STRUCTURAL MUST (msDS-ClaimValueType $ msDS-ClaimIsValueSpaceRestricted $ msDS-ClaimIsSingleValued $ msDS-IsPossibleValuesPresent ) )", + "( 1.2.840.113556.1.5.204 NAME 'msWMI-UnknownRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-NormalizedClass $ msWMI-TargetObject ) )", + "( 1.2.840.113556.1.5.66 NAME 'domain' SUP top ABSTRACT MUST (dc ) )", + "( 2.5.6.13 NAME 'dSA' SUP applicationEntity STRUCTURAL MAY (knowledgeInformation ) )", + "( 1.2.840.113556.1.5.120 NAME 'ipsecISAKMPPolicy' SUP ipsecBase STRUCTURAL )" + ], + "objectGUID": [ + { + "encoded": "sr4GScorekOq9Mmm+aY8Ow==", + "encoding": "base64" + } + ], + "systemFlags": [ + "134217728" + ], + "uSNChanged": [ + "5" + ], + "uSNCreated": [ + "5" + ], + "whenChanged": [ + "20130521164433.0Z" + ], + "whenCreated": [ + "20130521164433.0Z" + ] + }, + "schema_entry": "CN=Aggregate,CN=Schema,CN=Configuration,DC=AD2012,DC=LAB", + "type": "SchemaInfo" +} +""" +ad_2012_r2_dsa_info = """ +{ + "raw": { + "configurationNamingContext": [ + "CN=Configuration,DC=AD2012,DC=LAB" + ], + "currentTime": [ + "20141111080100.0Z" + ], + "defaultNamingContext": [ + "DC=AD2012,DC=LAB" + ], + "dnsHostName": [ + "WIN1.AD2012.LAB" + ], + "domainControllerFunctionality": [ + "6" + ], + "domainFunctionality": [ + "6" + ], + "dsServiceName": [ + "CN=NTDS Settings,CN=WIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=AD2012,DC=LAB" + ], + "forestFunctionality": [ + "6" + ], + "highestCommittedUSN": [ + "22591" + ], + "isGlobalCatalogReady": [ + "TRUE" + ], + "isSynchronized": [ + "TRUE" + ], + "ldapServiceName": [ + "AD2012.LAB:win1$@AD2012.LAB" + ], + "namingContexts": [ + "DC=AD2012,DC=LAB", + "CN=Configuration,DC=AD2012,DC=LAB", + "CN=Schema,CN=Configuration,DC=AD2012,DC=LAB", + "DC=DomainDnsZones,DC=AD2012,DC=LAB", + "DC=ForestDnsZones,DC=AD2012,DC=LAB" + ], + "rootDomainNamingContext": [ + "DC=AD2012,DC=LAB" + ], + "schemaNamingContext": [ + "CN=Schema,CN=Configuration,DC=AD2012,DC=LAB" + ], + "serverName": [ + "CN=WIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=AD2012,DC=LAB" + ], + "subschemaSubentry": [ + "CN=Aggregate,CN=Schema,CN=Configuration,DC=AD2012,DC=LAB" + ], + "supportedCapabilities": [ + "1.2.840.113556.1.4.800", + "1.2.840.113556.1.4.1670", + "1.2.840.113556.1.4.1791", + "1.2.840.113556.1.4.1935", + "1.2.840.113556.1.4.2080", + "1.2.840.113556.1.4.2237" + ], + "supportedControl": [ + "1.2.840.113556.1.4.319", + "1.2.840.113556.1.4.801", + "1.2.840.113556.1.4.473", + "1.2.840.113556.1.4.528", + "1.2.840.113556.1.4.417", + "1.2.840.113556.1.4.619", + "1.2.840.113556.1.4.841", + "1.2.840.113556.1.4.529", + "1.2.840.113556.1.4.805", + "1.2.840.113556.1.4.521", + "1.2.840.113556.1.4.970", + "1.2.840.113556.1.4.1338", + "1.2.840.113556.1.4.474", + "1.2.840.113556.1.4.1339", + "1.2.840.113556.1.4.1340", + "1.2.840.113556.1.4.1413", + "2.16.840.1.113730.3.4.9", + "2.16.840.1.113730.3.4.10", + "1.2.840.113556.1.4.1504", + "1.2.840.113556.1.4.1852", + "1.2.840.113556.1.4.802", + "1.2.840.113556.1.4.1907", + "1.2.840.113556.1.4.1948", + "1.2.840.113556.1.4.1974", + "1.2.840.113556.1.4.1341", + "1.2.840.113556.1.4.2026", + "1.2.840.113556.1.4.2064", + "1.2.840.113556.1.4.2065", + "1.2.840.113556.1.4.2066", + "1.2.840.113556.1.4.2090", + "1.2.840.113556.1.4.2205", + "1.2.840.113556.1.4.2204", + "1.2.840.113556.1.4.2206", + "1.2.840.113556.1.4.2211", + "1.2.840.113556.1.4.2239", + "1.2.840.113556.1.4.2255", + "1.2.840.113556.1.4.2256" + ], + "supportedExtension": [ + "1.3.6.1.4.1.1466.20037", + "1.3.6.1.4.1.1466.101.119.1", + "1.2.840.113556.1.4.1781", + "1.3.6.1.4.1.4203.1.11.3", + "1.2.840.113556.1.4.2212" + ], + "supportedLDAPPolicies": [ + "MaxPoolThreads", + "MaxPercentDirSyncRequests", + "MaxDatagramRecv", + "MaxReceiveBuffer", + "InitRecvTimeout", + "MaxConnections", + "MaxConnIdleTime", + "MaxPageSize", + "MaxBatchReturnMessages", + "MaxQueryDuration", + "MaxTempTableSize", + "MaxResultSetSize", + "MinResultSets", + "MaxResultSetsPerConn", + "MaxNotificationPerConn", + "MaxValRange", + "MaxValRangeTransitive", + "ThreadMemoryLimit", + "SystemMemoryLimitPercent" + ], + "supportedLDAPVersion": [ + "3", + "2" + ], + "supportedSASLMechanisms": [ + "GSSAPI", + "GSS-SPNEGO", + "EXTERNAL", + "DIGEST-MD5" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ds389.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ds389.py new file mode 100644 index 0000000..f0e19dc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/ds389.py @@ -0,0 +1,1715 @@ +""" +""" + +# Created on 2014.11.11 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +ds389_1_3_3_schema = """ +{ + "raw": { + "aci": [ + "(target=\\"ldap:///cn=schema\\")(targetattr !=\\"aci\\")(version 3.0;acl \\"anonymous, no acis\\"; allow (read, search, compare) userdn = \\"ldap:///anyone\\";)" + ], + "attributeTypes": [ + "( 2.16.840.1.113730.3.1.582 NAME 'nsDS5ReplicaCredentials' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2274 NAME 'nsslapd-instancedir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.532 NAME 'ntUserCountryCode' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1139 NAME 'printer-info' DESC 'Descriptive information about this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' DESC 'LDAP referrals attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'LDAPv3 referrals Internet Draft' )", + "( 1.3.6.1.4.1.13769.2.4 NAME ( 'nsAIMid' 'nscpaimscreenname' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'Mozilla Address Book' )", + "( sslVersionMin-oid NAME 'sslVersionMin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.204 NAME 'replicaNickName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2243 NAME 'nsslapd-securelistenhost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2108 NAME 'nsPagedLookThroughLimit' DESC 'Binder-based simple paged search operation look through limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 1.3.6.1.4.1.6981.11.3.7 NAME 'FTPStatus' DESC 'Account status: enabled or disabled' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2091 NAME 'nsslapd-suffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.5.4.51 NAME 'houseIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( nsUserRDNComponent-oid NAME 'nsUserRDNComponent' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.18.0.2.4.1117 NAME 'printer-media-local-supported' DESC 'Site-specific names of media supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2301 NAME 'nsslapd-plugin-logging' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822mailbox' ) EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 4524' X-DEPRECATED 'rfc822mailbox' )", + "( 2.16.840.1.113730.3.1.607 NAME 'nsDS5Flags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsTaskLabel-oid NAME 'nsTaskLabel' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2068 NAME 'pamExcludeSuffix' DESC 'Suffixes to exclude from PAM authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2157 NAME 'dnaRemoteBindCred' DESC 'Remote bind credentials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsBindDN-oid NAME 'nsBindDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.5.4.18 NAME 'postOfficeBox' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2261 NAME 'nsslapd-attribute-name-exceptions' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.250.1.2 NAME 'multiLineDescription' DESC 'Pilot attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Internet White Pages Pilot' )", + "( 2.16.840.1.113730.3.1.102 NAME ( 'passwordChange' 'pwdAllowUserChange' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.527 NAME 'ntUserLastLogoff' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.21 NAME 'mailQuota' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.482 NAME 'calOtherCalURIs' DESC 'RFC2739: multi-value URI for snapshots of other calendars' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2238 NAME 'nsslapd-security' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.6 NAME 'javaClassName' DESC 'Fully qualified name of distinguished Java class or interface' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.240 NAME 'replicatedattributelist' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2175 NAME 'nsslapd-accesslog-logrotationsync-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsRevisionNumber-oid NAME 'nsRevisionNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2207 NAME 'nsslapd-rootdn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsHelpRef-oid NAME 'nsHelpRef' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.43 NAME 'ntUserDeleteAccount' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.217 NAME 'replicaCFUpdated' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.6 NAME 'targetDn' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.5.4.25 NAME 'internationalISDNNumber' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.998 NAME ( 'passwordGraceUserTime' 'pwdGraceUserTime' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2225 NAME 'nsslapd-workingdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.65 NAME 'ntUserLogonServer' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.781 NAME 'mgrpAddHeader' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2295 NAME 'nsslapd-allowed-sasl-mechanisms' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2162 NAME 'winSyncDirectoryFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1121 NAME 'printer-resolution-supported' DESC 'List of resolutions supported for printing documents by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2139 NAME 'winSyncMoveAction' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsExpirationDate-oid NAME 'nsExpirationDate' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.5923.1.1.1.1 NAME 'eduPersonAffiliation' DESC 'Affiliation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( nsVendor-oid NAME 'nsVendor' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.87 NAME 'cirUpdateSchedule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.32 NAME 'owner' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.253 NAME 'nsValueSyntax' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( nsLdapSchemaVersion-oid NAME 'nsLdapSchemaVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2100 NAME 'autoMemberInclusiveRegex' DESC 'Auto Membership inclusive regex rule' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2089 NAME 'mepMappedAttr' DESC 'Managed Entries mapped attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2212 NAME 'nsslapd-useroc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2282 NAME 'nsslapd-rundir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.3 NAME 'mozillaHomeLocalityName' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.5.4.10 NAME ( 'o' 'organizationname' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'organizationname' )", + "( 2.16.840.1.113730.3.1.2259 NAME 'nsslapd-return-exact-case' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminAccessAddresses-oid NAME 'nsAdminAccessAddresses' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( nsAdminUsers-oid NAME 'nsAdminUsers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.19 NAME 'mailMessageStore' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.221 NAME 'passwordStorageScheme' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2126 NAME 'dnaHostname' DESC 'DNA hostname of replica to get new range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2230 NAME 'nsslapd-ldapiautobind' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2196 NAME 'nsslapd-accesslog-logexpirationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.576 NAME 'nsRoleFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.70 NAME 'serverRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 5.3.6.1.1.1.1.0 NAME 'trustModel' DESC 'Access scheme' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'nss_ldap/pam_ldap' )", + "( 2.16.840.1.113730.3.1.248 NAME 'nsValueDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.1466.101.120.41 NAME 'parentOrganization' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( nsAdminEnableDSGW-oid NAME 'nsAdminEnableDSGW' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.18.0.2.4.1132 NAME 'printer-multiple-document-jobs-supported' DESC 'Indicates whether or not this printer supports more than one document per job.' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.4.1.13769.2.1 NAME ( 'mozillaNickname' 'xmozillanickname' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Mozilla Address Book' )", + "( 2.5.18.2 NAME 'modifyTimestamp' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.92 NAME ( 'passwordExpWarned' 'pwdExpirationWarned' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2246 NAME 'nsslapd-maxdescriptors' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2113 NAME 'internalModifiersName' DESC 'plugin dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2094 NAME 'nsslapd-parent-suffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.692 NAME 'inetUserStatus' DESC '\\"active\\", \\"inactive\\", or \\"deleted\\" status of a user' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1110 NAME 'printer-job-priority-supported' DESC 'Indicates the number of job priority levels supported by this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2183 NAME 'nsslapd-audit-logrotationsyncmin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2304 NAME 'nsslapd-dynamic-plugins' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.789 NAME 'mgrpNoDuplicateChecks' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.602 NAME 'entrydn' DESC 'internal server defined attribute type' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.1098 NAME 'nsds5replicaSessionPauseTime' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2073 NAME 'pamSecure' DESC 'Require secure (TLS/SSL) connection for PAM auth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2264 NAME 'nsslapd-max-filter-nest-level' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.2 NAME 'dITContentRules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.522 NAME 'ntUserComment' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1129 NAME 'printer-color-supported' DESC 'Indicates whether this printer is capable of any type of color printing at all, including highlight color.' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.24 NAME 'mailRoutingAddress' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( nsmsgDisallowAccess-oid NAME 'nsmsgDisallowAccess' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.485 NAME 'calOtherCalAdrURIs' DESC 'RFC2739: multi-value URI to other request destinations' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2131 NAME 'pamFilter' DESC 'Filter to match entries that should use PAM authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.234 NAME 'nsSNMPLocation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.15 NAME 'supportedLDAPVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.5923.1.1.1.9 NAME 'eduPersonScopedAffiliation' DESC 'Scoped Affiliation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( nsHostLocation-oid NAME 'nsHostLocation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.590 NAME 'nsDS5ReplicaName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2178 NAME 'nsslapd-accesslog-logrotationsynchour' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2081 NAME ( 'passwordMaxRepeats' 'pwdMaxRepeats' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.687 NAME 'nsds5replicaChangesSentSinceStartup' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1107 NAME 'printer-xri-supported' DESC 'The unordered list of XRI (extended resource identifiers) supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.46 NAME 'ntGroupDeleteGroup' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.9 NAME 'newRdn' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.2147 NAME 'rootdn-allow-host' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2251 NAME 'nsslapd-accesscontrol' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.11 NAME 'newSuperior' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.229 NAME 'nsslapd-pluginVendor' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2228 NAME 'nsslapd-ldapifilepath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.68 NAME 'ntUserPasswordExpired' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2298 NAME 'nsslapd-enable-turbo-mode' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.585 NAME 'nsDS5ReplicatedAttributeList' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2165 NAME 'schemaUpdateObjectclassAccept' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2277 NAME 'nsslapd-tmpdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1002 NAME 'nsds7NewWinUserSyncEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.23 NAME 'lastModifiedTime' DESC 'old variant of modifyTimestamp' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.110 NAME 'ntGroupId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.535 NAME 'ntUserHomeDirDrive' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.33 NAME 'mgrpModerator' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.207 NAME 'vlvBase' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( nsServerMigrationClassname-oid NAME 'nsServerMigrationClassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsSSLPersonalitySSL-oid NAME 'nsSSLPersonalitySSL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.5.4.35 NAME 'userPassword' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4519' )", + "( 1.3.6.1.1.4 NAME 'vendorName' EQUALITY 1.3.6.1.4.1.1466.109.114.1 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation X-ORIGIN 'RFC 3045' )", + "( 1.3.6.1.4.1.6981.11.3.4 NAME 'FTPDownloadRatio' DESC 'Ratio (compared with FTPRatioUp) for downloaded files' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.801 NAME 'mgrpRemoveHeader' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2215 NAME 'nsslapd-allow-unauthenticated-binds' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1118 NAME 'printer-copies-supported' DESC 'The maximum number of copies of a document that may be printed as a single job on this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.55 NAME 'aci' DESC 'Netscape defined access control information attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2285 NAME 'nsslapd-hash-filters' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.5.4.7 NAME ( 'l' 'locality' 'localityname' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'locality localityname' )", + "( nsSSL3SessionTimeout-oid NAME 'nsSSL3SessionTimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2152 NAME 'nsds5ReplicaProtocolTimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.105 NAME ( 'passwordLockout' 'pwdLockOut' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2129 NAME 'dnaNextRange' DESC 'DNA range of values to get from replica' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsSSL3-oid NAME 'nsSSL3' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2199 NAME 'nsslapd-accesslog-logexpirationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.571 NAME 'nsSizeLimit' DESC 'Binder-based search operation size limit (entries)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.77 NAME 'changeTime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.243 NAME 'nsValueCIS' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.2170 NAME 'nsslapd-accesslog-level' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2202 NAME 'nsslapd-accesslog-logging-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.33 NAME 'automountInformation' DESC 'Information used by the autofs automounter' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'draft-howard-rfc2307bis' )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2798' )", + "( nsCertConfig-oid NAME 'nsCertConfig' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Certificate Management System' )", + "( 2.16.840.1.113730.3.1.99 NAME ( 'passwordMinLength' 'pwdMinLength' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2249 NAME 'nsslapd-idletimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.20 NAME 'telephoneNumber' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2116 NAME 'dnaPrefix' DESC 'DNA string prefix for dna value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2220 NAME 'nsslapd-minssf-exclude-rootdse' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2186 NAME 'nsslapd-auditlog-logrotationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.60 NAME 'ntUserAuthFlags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2290 NAME 'nsslapd-disk-monitoring-threshold' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2076 NAME ( 'passwordMinAlphas' 'pwdMinAlphas' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.406 NAME 'nsSynchUserIDFormat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.5 NAME 'attributeTypes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.18.0.2.4.1122 NAME 'printer-media-supported' DESC 'The standard names/types/sizes (and optional color suffixes) of the media supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( nsAdminEnableEnduser-oid NAME 'nsAdminEnableEnduser' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.1.1.1.26 NAME 'nisMapName' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2134 NAME 'nsds5ReplicaStripAttrs' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.544 NAME 'nsParentUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.5923.1.1.1.4 NAME 'eduPersonOrgUnitDN' DESC 'Organizational Unit DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.82 NAME 'cirBindDn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 X-ORIGIN 'RFC 2798' )", + "( 1.3.6.1.4.1.42.2.27.4.1.13 NAME 'javaClassNames' DESC 'Fully qualified Java class or interface name' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.2103 NAME 'autoMemberDisabled' DESC 'Auto Membership disabled attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.809 NAME 'nsds5replicaLastInitStatus' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2084 NAME 'nsSymmetricKey' DESC 'A symmetric key - currently used by attribute encryption' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-ORIGIN 'attribute encryption' )", + "( 2.16.840.1.113730.3.1.682 NAME 'nsds5ReplicaPurgeDelay' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 X-ORIGIN 'RFC 4524' )", + "( nsTLS1-oid NAME 'nsTLS1' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2063 NAME 'nsEncryptionAlgorithm' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.4 NAME 'mozillaHomeState' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.5.4.13 NAME 'description' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2254 NAME 'nsslapd-pwpolicy-local' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2121 NAME 'dnaScope' DESC 'DNA base DN for finding entries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.14 NAME 'mailAutoReplyMode' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.224 NAME 'nsslapd-pluginPath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.11.1.3.2.1.2 NAME 'acctPolicySubentry' DESC 'Account policy pointer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Account Policy Plugin' )", + "( 2.16.840.1.113730.3.1.2191 NAME 'nsslapd-errorlog-logmaxdiskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2233 NAME 'nsslapd-ldapiuidnumbertype' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.579 NAME 'nsDS5ReplicaPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.610 NAME 'nsAccountLock' DESC 'Operational attribute for Account Inactivation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.707 NAME 'vacationstartdate' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.580 NAME 'nsDS5ReplicaTransportInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2168 NAME 'schemaUpdateAttributeReject' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1137 NAME 'printer-generated-natural-language-supported' DESC 'Natural language(s) supported for this directory entry.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.1005 NAME 'nsds7DirsyncCookie' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.24 NAME 'lastModifiedBy' DESC 'old variant of modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.530 NAME 'ntUserLogonHours' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.36 NAME 'nsLicensedFor' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.202 NAME 'replicaCredentials' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.2.2 NAME ( 'mozillaSecondEmail' 'xmozillasecondemail' ) EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.3023 NAME 'nsViewFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsSSL2Ciphers-oid NAME 'nsSSL2Ciphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsServerAddress-oid NAME 'nsServerAddress' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.91 NAME 'passwordExpirationTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2241 NAME 'nsslapd-errorlog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsProductName-oid NAME 'nsProductName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2027 NAME 'nsruvReplicaLastModified' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.38 NAME 'authorityRevocationList' DESC 'X.509 authority revocation list' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 2.16.840.1.113730.3.1.2097 NAME 'autoMemberScope' DESC 'Auto Membership scope criteria' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.695 NAME 'inetSubscriberChallenge' DESC 'Used to confirm subscriberIdentity. This attribute holds the challenge phrase and is used in conjunction with the inetSubscriberResponse' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.1.2218 NAME 'nsslapd-localssf' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1115 NAME 'printer-stacking-order-supported' DESC 'The possible stacking order of pages as they are printed and ejected from this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.2.840.113556.1.4.479 NAME 'calFBURL' DESC 'RFC2739: URI to the users default freebusy data' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2307 NAME 'nsslapd-allow-hashed-passwords' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.58 NAME 'replicaBindDn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.605 NAME 'entryid' DESC 'internal server defined attribute type' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.2288 NAME 'nsslapd-defaultnamingcontext' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.9 NAME 'mozillaWorkUrl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2155 NAME 'nsds5ReplicaBackoffMax' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2267 NAME 'nsslapd-certmap-basedn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.100 NAME 'passwordKeepHistory' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.525 NAME 'ntUserWorkstations' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.23 NAME 'mgrpAllowedDomain' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.480 NAME 'calCAPURI' DESC 'RFC2739: URI used to communicate with the users calendar' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.237 NAME 'nsSNMPMasterHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsDefaultAcceptLanguage-oid NAME 'nsDefaultAcceptLanguage' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.593 NAME 'nsSNMPName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2205 NAME 'nsslapd-auditlog-logging-hide-unhashed-pw' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1108 NAME 'printer-aliases' DESC 'List of site-specific administrative names of this printer in addition to the value specified for printer-name.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.45 NAME 'ntGroupCreateNewGroup' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.215 NAME 'oid' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2142 NAME 'nsSaslMapPriority' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.2119 NAME 'dnaMagicRegen' DESC 'DNA value that will trigger regeneration of attribute value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.5.4.42 NAME 'givenName' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2189 NAME 'nsslapd-auditlog-logrotationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.67 NAME 'ntUserProfile' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2079 NAME ( 'passwordMinSpecials' 'pwdMinSpecials' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.588 NAME 'nsDS5ReplicaId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2160 NAME 'dnaRemoteBindMethod' DESC 'Remote bind method: SIMPLE, SSL, SASL/DIGEST-MD5, or SASL/GSSAPI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.4.1.13769.4.3 NAME 'mozillaCustom3' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2272 NAME 'nsslapd-plugin-binddn-tracking' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.8 NAME 'matchingRuleUse' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.250.1.57 NAME ( 'labeledURI' 'labeledurl' ) EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2079' X-DEPRECATED 'labeledurl' )", + "( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.89 NAME 'cirSyncInterval' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.251 NAME 'nsValueFlags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.2106 NAME 'nsIDListScanLimit' DESC 'Binder-based search operation ID list scan limit (candidate entries)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 1.3.6.1.4.1.6981.11.3.1 NAME 'FTPQuotaFiles' DESC 'Quota (in number of files) for an FTP user' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.804 NAME 'nsSchemaCSN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsServerSecurity-oid NAME 'nsServerSecurity' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2210 NAME 'nsslapd-auditlog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' X-DEPRECATED 'favouriteDrink' )", + "( 2.16.840.1.113730.3.1.50 NAME 'replicaBeginOrc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2280 NAME 'nsslapd-bakdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.4 NAME ( 'sn' 'surName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'surName' )", + "( 2.16.840.1.113730.3.1.2066 NAME 'nsSaslMapFilterTemplate' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.1 NAME 'mozillaHomeStreet' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.198 NAME 'memberURL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.16 NAME 'postalAddress' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.108 NAME 'passwordUnlock' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( nsSSLClientAuth-oid NAME 'nsSSLClientAuth' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2124 NAME 'dnaRemainingValues' DESC 'DNA remaining values left to assign' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2236 NAME 'nsslapd-anonlimitsdn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2194 NAME 'nsslapd-errorlog-logminfreediskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.574 NAME 'nsRole' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminGroupName-oid NAME 'nsAdminGroupName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.72 NAME 'serverVersionNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.246 NAME 'nsValueInt' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.1466.101.120.43 NAME 'preferredTimeZone' DESC 'preferred time zone for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2173 NAME 'nsslapd-errorlog-maxlogsize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1130 NAME 'printer-document-format-supported' DESC 'The possible source document formats which may be interpreted and printed by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.552 NAME 'costargettree' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.94 NAME 'retryCountResetTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 X-ORIGIN 'RFC 4519' X-DEPRECATED 'fax' )", + "( 2.16.840.1.113730.3.1.2244 NAME 'nnslapd-threadnumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.2.840.113556.1.2.102 NAME 'memberOf' DESC 'Group that the entry belongs to' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Delegated Administrator' )", + "( 2.16.840.1.113730.3.1.2111 NAME 'tombstoneNumSubordinates' DESC 'count of immediate subordinates for tombstone entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN '389 directory server' )", + "( nsDirectoryURL-oid NAME 'nsDirectoryURL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.690 NAME 'inetDomainBaseDN' DESC 'Base DN of user subtree for a DNS domain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.1.2223 NAME 'nsslapd-localhost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2181 NAME 'nsslapd-accesslog-logrotationsyncmin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.569 NAME 'cosPriority' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsOsVersion-oid NAME 'nsOsVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsJarfilename-oid NAME 'nsJarfilename' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2293 NAME 'nsslapd-ndn-cache-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2071 NAME 'pamIDAttr' DESC 'Name of attribute holding PAM ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2158 NAME 'dnaRemoteBindDN' DESC 'Remote bind DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.18.0.2.4.1127 NAME 'printer-pages-per-minute' DESC 'The nominal number of pages per minute which may be output by this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 0.9.2342.19200300.100.1.54 NAME 'ditRedirect' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.520 NAME 'nswmExtendedUserPrefs' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.26 NAME 'mgrpErrorsTo' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.3.6.1.4.1.4203.1.3.5 NAME 'supportedFeatures' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.232 NAME 'nsSNMPEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2137 NAME 'nsds5ReplicaAbortCleanRUV' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.17 NAME 'ldapSchemas' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 2927' )", + "( 1.3.6.1.4.1.5923.1.1.1.7 NAME 'eduPersonEntitlement' DESC 'Entitlement' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.81 NAME 'cirPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.6981.11.3.9 NAME 'FTPgid' DESC 'System uid (overrides gidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2087 NAME 'mepManagedEntry' DESC 'Managed Entries pointer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.685 NAME 'nsds5replicaLastUpdateStart' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminSIEDN-oid NAME 'nsAdminSIEDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2208 NAME 'nsslapd-rootdnpw' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.48 NAME 'replicaPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.210 NAME 'vlvSort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2145 NAME 'rootdn-close-time' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2257 NAME 'nsslapd-accesslog-logbuffering' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlycountryname' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' X-DEPRECATED 'friendlycountryname' )", + "( 2.16.840.1.113730.3.1.13 NAME 'mailAlternateAddress' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.227 NAME 'nsslapd-pluginId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.613 NAME 'copiedFrom' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsServerPort-oid NAME 'nsServerPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.42.2.27.4.1.8 NAME 'javaSerializedData' DESC 'Serialized form of a Java object' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.583 NAME 'nsDS5ReplicaBindMethod' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2275 NAME 'nsslapd-schemadir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsSSLActivation-oid NAME 'nsSSLActivation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.1000 NAME 'nsds7WindowsReplicaSubtree' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.533 NAME 'ntUserCodePage' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1138 NAME 'printer-make-and-model' DESC 'Make and model of this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.35 NAME 'changeLog' DESC 'the distinguished name of the entry which contains the set of entries comprising this servers changelog' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.205 NAME 'changeLogMaximumConcurrentWrites' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsDirectoryInfoRef-oid NAME 'nsDirectoryInfoRef' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.6981.11.3.6 NAME 'FTPDownloadBandwidth' DESC 'Bandwidth (in KB/s) to limit download speeds to' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2109 NAME 'nsPagedIDListScanLimit' DESC 'Binder-based simple paged search operation ID list scan limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 2.16.840.1.113730.3.1.2092 NAME 'nsslapd-ldapiautodnsuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'X.509 supported algorithms' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 1.3.18.0.2.4.1116 NAME 'printer-output-features-supported' DESC 'The possible output features supported by this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2302 NAME 'nsslapd-listen-backlog-size' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.57 NAME 'replicaRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.608 NAME 'nsDS5Task' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.9 NAME ( 'street' 'streetaddress' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'streetaddress' )", + "( 2.16.840.1.113730.3.1.2069 NAME 'pamMissingSuffix' DESC 'How to handle missing include or exclude suffixes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2150 NAME 'rootdn-deny-ip' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsGroupRDNComponent-oid NAME 'nsGroupRDNComponent' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2262 NAME 'nsslapd-maxbersize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.528 NAME 'ntUserAcctExpires' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.103 NAME ( 'passwordCheckSyntax' 'pwdCheckSyntax' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 1.2.840.113556.1.4.483 NAME 'calOtherFBURLs' DESC 'RFC2739: multi-value URI for other free/busy data' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2239 NAME 'nsslapd-SSL3ciphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.79 NAME 'cirReplicaRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'preferred name of a person to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2798' )", + "( nsProductVersion-oid NAME 'nsProductVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2176 NAME 'nsslapd-errorlog-logrotationsync-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2200 NAME 'nsslapd-errorlog-logexpirationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'signed message used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'RFC 2798' )", + "( nsSecureServerPort-oid NAME 'nsSecureServerPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.218 NAME 'replicaAbandonedChanges' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.7 NAME 'changeType' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.5.4.26 NAME 'registeredAddress' SUP postalAddress EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.999 NAME ( 'passwordGraceLimit' 'pwdGraceLoginLimit' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2114 NAME 'internalCreatorsName' DESC 'plugin dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN '389 Directory Server' )", + "( nsBindPassword-oid NAME 'nsBindPassword' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.812 NAME 'netscapeReversiblePassword' DESC 'password for HTTP Digest/MD5 authentication' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'Netscape Web Server' )", + "( 2.16.840.1.113730.3.1.2226 NAME 'nsslapd-listenhost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.6 NAME 'shadowMin' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2184 NAME 'nsslapd-accesslog-logrotationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.62 NAME 'ntUserParms' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2296 NAME 'nsslapd-ignore-virtual-attrs' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2074 NAME 'pamService' DESC 'Service name to pass to pam_start' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2163 NAME 'winSyncWindowsFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.4.4 NAME 'mozillaCustom4' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 1.3.18.0.2.4.1120 NAME 'printer-print-quality-supported' DESC 'List of print qualities supported for printing documents on this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.4.1.5923.1.1.1.2 NAME 'eduPersonNickName' DESC 'NickName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.542 NAME 'nsUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.84 NAME 'cirUseSsl' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.33 NAME 'roleOccupant' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( nsServerID-oid NAME 'nsServerID' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.254 NAME 'nsValueHelpURL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.807 NAME 'nsds5replicaLastInitStart' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2101 NAME 'autoMemberDefaultGroup' DESC 'Auto Membership default group' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2213 NAME 'nsslapd-userat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2283 NAME 'nsslapd-SSLclientAuth' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.8 NAME 'userClass' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.5.4.1 NAME 'aliasedObjectName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.13769.3.2 NAME 'mozillaHomeStreet2' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2148 NAME 'rootdn-deny-host' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'organizationalUnitName' )", + "( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.16 NAME 'mailDeliveryOption' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2127 NAME 'dnaPortNum' DESC 'DNA port number of replica to get new range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.222 NAME ( 'passwordMinAge' 'pwdMinAge' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113719.1.1.4.1.35 NAME 'lastLoginTime' DESC 'Last login time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Account Policy Plugin' )", + "( 2.16.840.1.113730.3.1.2231 NAME 'nsslapd-ldapimaprootdn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2197 NAME 'nsslapd-errorlog-logexpirationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.577 NAME 'cosIndirectSpecifier' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.71 NAME 'serverProductName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 5.3.6.1.1.1.1.1 NAME 'accessTo' DESC 'Access to which servers user is allowed' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'nss_ldap/pam_ldap' )", + "( 2.16.840.1.113730.3.1.249 NAME 'nsValueType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2278 NAME 'nsslapd-certdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1135 NAME 'printer-name' DESC 'The site-specific administrative name of this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.38 NAME 'nsLicenseEndTime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.200 NAME 'changeLogMaximumAge' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.18.3 NAME 'creatorsName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.93 NAME 'passwordRetryCount' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2247 NAME 'nsslapd-conntablesize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2095 NAME 'connection' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsSuiteSpotUser-oid NAME 'nsSuiteSpotUser' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.693 NAME 'inetUserHttpURL' DESC 'A users Web addresses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1113 NAME 'printer-service-person' DESC 'The identity of the current human service person responsible for servicing this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2305 NAME 'nsslapd-moddn-aci' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.603 NAME 'dncomp' DESC 'internal server defined attribute type' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.1099 NAME 'winSyncInterval' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsBaseDN-oid NAME 'nsBaseDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2265 NAME 'nsslapd-versionstring' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.523 NAME 'ntUserFlags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1128 NAME 'printer-compression-supported' DESC 'Compression algorithms supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2132 NAME 'nsds5ReplicaEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsExecRef-oid NAME 'nsExecRef' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.25 NAME 'mgrpDeliverTo' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.235 NAME 'nsSNMPContact' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.591 NAME 'nsDS5ReplicaReferral' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2179 NAME 'nsslapd-errorlog-logrotationsynchour' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2082 NAME ( 'passwordMinCategories' 'pwdMinCategories' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.688 NAME 'nsds5replicaLastUpdateStatus' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.213 NAME 'vlvEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2140 NAME 'passwordTrackUpdateTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2252 NAME 'nsslapd-groupevalnestlevel' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2229 NAME 'nsslapd-ldapilisten' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.40 NAME 'crossCertificatePair' DESC 'X.509 cross certificate pair' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.69 NAME 'subtreeACI' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server 1.0' )", + "( 2.16.840.1.113730.3.1.2299 NAME 'nsslapd-connection-buffer' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2166 NAME 'schemaUpdateObjectclassReject' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.586 NAME 'nsDS5ReplicaUpdateSchedule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.4.1 NAME 'mozillaCustom1' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2270 NAME 'nsslapd-auditlog-list' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1003 NAME 'nsds7NewWinGroupSyncEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.111 NAME 'ntUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.536 NAME 'ntGroupAttributes' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.30 NAME 'mgrpRFC822MailMember' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.208 NAME 'vlvScope' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( nsNickName-oid NAME 'nsNickName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.5.4.36 NAME 'userCertificate' DESC 'X.509 user certificate' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 2.16.840.1.113730.3.1.2104 NAME 'nsslapd-pluginConfigArea' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.5 NAME 'vendorVersion' EQUALITY 1.3.6.1.4.1.1466.109.114.1 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation X-ORIGIN 'RFC 3045' )", + "( 1.3.6.1.4.1.6981.11.3.3 NAME 'FTPUploadRatio' DESC 'Ratio (compared with FTPRatioDown) for uploaded files' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.802 NAME 'nsds5ReplicaLegacyConsumer' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2216 NAME 'nsslapd-require-secure-binds' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsKeyfile-oid NAME 'nsKeyfile' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.52 NAME 'replicaUpdateSchedule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 X-ORIGIN 'RFC 1274' )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE X-ORIGIN 'RFC 4519' X-DEPRECATED 'countryName' )", + "( 2.16.840.1.113730.3.1.2064 NAME 'nsSaslMapRegexString' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2286 NAME 'nsslapd-outbound-ldap-io-timeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2153 NAME ( 'passwordAdminDN' 'pwdAdminDN' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.106 NAME ( 'passwordMaxFailure' 'pwdMaxFailure' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2234 NAME 'nsslapd-ldapigidnumbertype' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.572 NAME 'nsTimeLimit' DESC 'Binder-based search operation time limit (seconds)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.74 NAME 'administratorContactInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( nsClassname-oid NAME 'nsClassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.244 NAME 'nsValueCES' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.5322.17.2.1 NAME 'authorizedService' DESC 'IANA GSS-API authorized service name' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'NSS LDAP schema' )", + "( 2.16.840.1.113730.3.1.2171 NAME 'nsslapd-accesslog-maxlogsperdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2203 NAME 'nsslapd-errorlog-logging-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsDeleteclassname-oid NAME 'nsDeleteclassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( nsmsgNumMsgQuota-oid NAME 'nsmsgNumMsgQuota' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( nsAdminCgiWaitPid-oid NAME 'nsAdminCgiWaitPid' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.550 NAME 'cosAttribute' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.96 NAME ( 'passwordHistory' 'pwdHistory' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2117 NAME 'dnaNextValue' DESC 'DNA next available value for assignment' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2098 NAME 'autoMemberFilter' DESC 'Auto Membership filter criteria' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2187 NAME 'nsslapd-accesslog-logrotationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2221 NAME 'nsslapd-validate-cert' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2308 NAME 'nstombstonecsn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.61 NAME 'ntUserUsrComment' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2291 NAME 'nsslapd-disk-monitoring-grace-period' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2077 NAME ( 'passwordMinUppers' 'pwdMinUppers' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.407 NAME 'nsSynchUniqueAttribute' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2268 NAME 'nsslapd-accesslog-list' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1125 NAME 'printer-finishings-supported' DESC 'The possible finishing operations supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.5.21.6 NAME 'objectClasses' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.28 NAME 'mgrpMsgRejectAction' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.230 NAME 'nsslapd-pluginDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2135 NAME 'nsds5ReplicaCleanRUV' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminCacheLifetime-oid NAME 'nsAdminCacheLifetime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.327 NAME 'nsIndexType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.545 NAME 'nscpEntryDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.5923.1.1.1.5 NAME 'eduPersonPrimaryAffiliation' DESC 'Primary Affiliation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.83 NAME 'cirUsePersistentSearch' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.10 NAME 'javaFactory' DESC 'Fully qualified Java class name of a JNDI object factory' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2713' )", + "( 2.5.18.10 NAME 'subschemaSubentry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.2085 NAME 'isReplicated' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.683 NAME 'nsds5ReplicaTombstonePurgeInterval' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.1100 NAME 'oneWaySync' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsConfigRoot-oid NAME 'nsConfigRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.13769.3.7 NAME 'mozillaHomeUrl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2255 NAME 'passwordIsGlobalPolicy' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4524' X-DEPRECATED 'mobileTelephoneNumber' )", + "( 2.16.840.1.113730.3.1.2122 NAME 'dnaMaxValue' DESC 'DNA maximum value to assign' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsAdminDomainName-oid NAME 'nsAdminDomainName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.15 NAME 'mailAutoReplyText' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.225 NAME 'nsslapd-pluginInitfunc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminEndUserHTMLIndex-oid NAME 'nsAdminEndUserHTMLIndex' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.11.1.3.2.1.3 NAME 'accountInactivityLimit' DESC 'Account inactivity limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Account Policy Plugin' )", + "( 2.16.840.1.113730.3.1.2192 NAME 'nsslapd-auditlog-logmaxdiskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsBuildSecurity-oid NAME 'nsBuildSecurity' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.708 NAME 'vacationenddate' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.581 NAME 'nsDS5ReplicaBindDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2169 NAME 'nsslapd-pagedsizelimit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( mgrpApprovePassword-oid NAME 'mgrpApprovePassword' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.3.18.0.2.4.1136 NAME 'printer-location' DESC 'The physical location of this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.531 NAME 'ntUserBadPwCount' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.37 NAME 'nsLicenseStartTime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.203 NAME 'replicaEntryFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2242 NAME 'nsslapd-securePort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.39 NAME 'certificateRevocationList' DESC 'X.509 certificate revocation list' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( nsAdminAccountInfo-oid NAME 'nsAdminAccountInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2090 NAME 'mepRDNAttr' DESC 'Managed Entries RDN attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.696 NAME 'inetSubscriberResponse' DESC 'Used to confirm subscriberIdentity. This attribute holds the response phrase and is used in conjunction with the inetSubscriberChallenge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.5.4.50 NAME 'uniqueMember' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2219 NAME 'nsslapd-minssf' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1114 NAME 'printer-delivery-orientation-supported' DESC 'The possible delivery orientations of pages as they are printed and ejected from this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.4.1.250.1.60 NAME ( 'ttl' 'timeToLive' ) DESC 'time to live in seconds for cached objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'LDAP Caching Internet Draft' )", + "( 2.16.840.1.113730.3.1.2300 NAME 'nsslapd-connection-nocanon' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.59 NAME 'ntUserPriv' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2289 NAME 'nsslapd-disk-monitoring' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsDefaultObjectClass-oid NAME 'nsDefaultObjectClass' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.13769.3.8 NAME 'mozillaWorkStreet2' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2156 NAME 'nsslapd-sasl-max-buffer-size' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2260 NAME 'nsslapd-result-tweak' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.101 NAME ( 'passwordInHistory' 'pwdInHistory' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.526 NAME 'ntUserLastLogon' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.20 NAME 'mailProgramDeliveryInfo' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.481 NAME 'calCalAdrURI' DESC 'RFC2739: URI for event equests destination' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.238 NAME 'nsSNMPMasterPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an integer to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'SUDO' )", + "( 1.3.6.1.4.1.42.2.27.4.1.7 NAME 'javaCodebase' DESC 'URL(s) specifying the location of class definition' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.594 NAME 'nsDS5ReplicatedAttributeListTotal' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2174 NAME 'nsslapd-auditlog-maxlogsize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2206 NAME 'nsslapd-unhashed-pw-switch' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.42 NAME 'ntUserCreateNewAccount' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'PKCS #12 PFX PDU for exchange of personal identity information' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.2143 NAME 'nsslapd-sasl-mapping-fallback' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.5 NAME 'changeNumber' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.5.18.9 NAME 'hasSubordinates' DESC 'if TRUE, subordinate entries may exist' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'numSubordinates Internet Draft' )", + "( 2.5.4.24 NAME 'x121Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.997 NAME 'pwdpolicysubentry' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.43 NAME 'initials' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2224 NAME 'nsslapd-port' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.64 NAME 'ntUserNumLogons' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2294 NAME 'nsslapd-ndn-cache-max-size' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2161 NAME 'nsIndexIDListScanLimit' DESC 'fine grained idlistscanlimit - per index/type/value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.589 NAME 'nsDS5ReplicaType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.4.2 NAME 'mozillaCustom2' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Start of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2273 NAME 'nsslapd-config' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.9 NAME 'structuralObjectClass' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( nsDisplayName-oid NAME 'nsDisplayName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2138 NAME 'nsslapd-readonly' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.86 NAME 'cirLastUpdateApplied' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.31 NAME 'member' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( sslVersionMax-oid NAME 'sslVersionMax' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.252 NAME 'nsValueDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.2107 NAME 'nsPagedSizeLimit' DESC 'Binder-based simple paged search operation size limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 2.16.840.1.113730.3.1.805 NAME 'nsds5replicaTimeout' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2088 NAME 'mepStaticAttr' DESC 'Managed Entries static attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2211 NAME 'nsslapd-dynamicconf' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.51 NAME 'replicaUpdateReplayed' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2281 NAME 'nsslapd-saslpath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'commonName' )", + "( 2.16.840.1.113730.3.1.2067 NAME 'pamIncludeSuffix' DESC 'Suffixes to include for PAM authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.199 NAME 'memberCertificateDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.2312.4.3.3.1 NAME 'sabayonProfileURL' DESC 'The URL of a sabayon profile' SUP labeledURI EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Sabayon' )", + "( 2.5.4.17 NAME 'postalCode' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2258 NAME 'nsslapd-csnlogging' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsSSL2-oid NAME 'nsSSL2' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.109 NAME ( 'passwordLockoutDuration' 'pwdLockoutDuration' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.18 NAME 'mailHost' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.220 NAME ( 'passwordMustChange' 'pwdMustChange' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2125 NAME 'dnaThreshold' DESC 'DNA threshold for getting next range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2237 NAME 'nsslapd-counters' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2195 NAME 'nsslapd-auditlog-logminfreediskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.575 NAME 'nsRoleDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.73 NAME 'installationTimeStamp' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.247 NAME 'nsValueBin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1133 NAME 'printer-ipp-versions-supported' DESC 'IPP protocol version(s) that this printer supports.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.5.18.1 NAME 'createTimestamp' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.553 NAME 'costemplatedn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.95 NAME 'accountUnlockTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2245 NAME 'nsslapd-maxthreadsperconn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2112 NAME 'ntGroupType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.691 NAME 'inetDomainStatus' DESC '\\"active\\", \\"inactive\\", or \\"deleted\\" status of a domain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1111 NAME 'printer-job-k-octets-supported' DESC 'The maximum size in kilobytes (1,024 octets actually) incoming print job that this printer will accept.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2182 NAME 'nsslapd-errorlog-logrotationsyncmin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.788 NAME 'mgrpBroadcasterPolicy' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.601 NAME 'adminRole' DESC 'Administrative role' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Delegated Administrator' )", + "( 2.16.840.1.113730.3.1.2072 NAME 'pamFallback' DESC 'Fallback to regular LDAP BIND if PAM auth fails' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2159 NAME 'dnaRemoteConnProtocol' DESC 'Connection protocol: LDAP, TLS, or SSL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsLogSuppress-oid NAME 'nsLogSuppress' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.5.21.1 NAME 'dITStructureRules' EQUALITY integerFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.521 NAME 'ntUserHomeDir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1126 NAME 'printer-pages-per-minute-color' DESC 'The nominal number of color pages per minute which may be output by this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 1.2.840.113556.1.4.484 NAME 'calOtherCAPURIs' DESC 'RFC2739: multi-value URI to other calendars' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2130 NAME 'dnaRangeRequestTimeout' DESC 'DNA timeout for querying replica for next range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.233 NAME 'nsSNMPOrganization' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.14 NAME 'supportedSASLMechanisms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.5923.1.1.1.8 NAME 'eduPersonPrimaryOrgUnitDN' DESC 'Primary Organizational Unit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( nsHardwarePlatform-oid NAME 'nsHardwarePlatform' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.6981.11.3.8 NAME 'FTPuid' DESC 'System uid (overrides uidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.686 NAME 'nsds5replicaLastUpdateEnd' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2080 NAME ( 'passwordMin8bit' 'pwdMin8bit' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2209 NAME 'nsslapd-rootpwstoragescheme' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.49 NAME 'replicaUpdateFailedAt' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.8 NAME 'changes' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.2146 NAME 'rootdn-days-allowed' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2250 NAME 'nsslapd-ioblocktimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.7 NAME 'supportedExtension' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4524' X-DEPRECATED 'pagerTelephoneNumber' )", + "( 2.16.840.1.113730.3.1.10 NAME 'deleteOldRdn' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.228 NAME 'nsslapd-pluginVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.46 NAME 'dnQualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.614 NAME 'copyingFrom' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsSSLToken-oid NAME 'nsSSLToken' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.584 NAME 'nsDS5ReplicaRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2164 NAME 'winSyncSubtreePair' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2276 NAME 'nsslapd-lockdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1001 NAME 'nsds7DirectoryReplicaSubtree' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.534 NAME 'ntUserPrimaryGroupId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4524' X-DEPRECATED 'homeTelephoneNumber' )", + "( 2.16.840.1.113730.3.1.32 NAME 'mgrpMsgMaxSize' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.206 NAME 'filterInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1140 NAME 'printer-uri' DESC 'A URI supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.5.4.34 NAME 'seeAlso' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( nsSSL3Ciphers-oid NAME 'nsSSL3Ciphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.6981.11.3.5 NAME 'FTPUploadBandwidth' DESC 'Bandwidth (in KB/s) to limit upload speeds to' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2093 NAME 'nsslapd-changelogsuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2214 NAME 'nsslapd-svrtab' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.53 NAME 'deltaRevocationList' DESC 'X.509 delta revocation list' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( nsUniqueAttribute-oid NAME 'nsUniqueAttribute' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.18.0.2.4.1119 NAME 'printer-natural-language-configured' DESC 'The configured natural language in which error and status messages will be generated (by default) by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2303 NAME 'nsslapd-ignore-time-skew' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.54 NAME 'replicaUseSSL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'userid' )", + "( 2.16.840.1.113730.3.1.609 NAME 'nsds5BeginReplicaRefresh' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2284 NAME 'nsslapd-ssl-check-hostname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'stateOrProvinceName' )", + "( 2.16.840.1.113730.3.1.1097 NAME 'nsds5replicaBusyWaitTime' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2151 NAME 'nsslapd-plugin-depends-on-type' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsViewConfiguration-oid NAME 'nsViewConfiguration' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2263 NAME 'nsslapd-maxsasliosize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.529 NAME 'ntUserMaxStorage' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.104 NAME ( 'passwordWarning' 'pwdExpireWarning' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.12 NAME 'memberUid' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( nsAccessLog-oid NAME 'nsAccessLog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2128 NAME 'dnaSecurePortNum' DESC 'DNA secure port number of replica to get new range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsPidLog-oid NAME 'nsPidLog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2198 NAME 'nsslapd-auditlog-logexpirationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.570 NAME 'nsLookThroughLimit' DESC 'Binder-based search operation look through limit (candidate entries)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsCertfile-oid NAME 'nsCertfile' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.76 NAME 'serverHostName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.242 NAME 'nsSystemIndex' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2177 NAME 'nsslapd-auditlog-logrotationsync-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2201 NAME 'nsslapd-auditlog-logexpirationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsServerCreationClassname-oid NAME 'nsServerCreationClassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.41 NAME 'ntUserDomainId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.219 NAME 'vlvUses' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.973 NAME 'nsds5ReplConflict' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.18.4 NAME 'modifiersName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.98 NAME 'passwordExp' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.27 NAME 'destinationIndicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2248 NAME 'nsslapd-reservedescriptors' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2115 NAME 'dnaType' DESC 'DNA attribute type to maintain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2227 NAME 'nsslapd-snmp-index' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.7 NAME 'shadowMax' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2185 NAME 'nsslapd-errorlog-logrotationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.63 NAME 'ntUserUnitsPerWeek' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2297 NAME 'nsslapd-search-return-original-type-switch' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2075 NAME ( 'passwordMinDigits' 'pwdMinDigits' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.4 NAME 'matchingRules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.18.0.2.4.1123 NAME 'printer-sides-supported' DESC 'The number of impression sides (one or two) and the two-sided impression rotations supported by this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.4.1.5923.1.1.1.3 NAME 'eduPersonOrgDN' DESC 'Organization DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.543 NAME 'nsState' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.85 NAME 'cirBindCredentials' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.12 NAME 'javaDoc' DESC 'The Java documentation for the class' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.2102 NAME 'autoMemberGroupingAttr' DESC 'Auto Membership grouping attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.808 NAME 'nsds5replicaLastInitEnd' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( nsUserIDFormat-oid NAME 'nsUserIDFormat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 0.9.2342.19200300.100.1.9 NAME 'host' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.5.4.0 NAME 'objectClass' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 X-ORIGIN 'RFC 4512' )", + "( nsAdminOneACLDir-oid NAME 'nsAdminOneACLDir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( nsBuildNumber-oid NAME 'nsBuildNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.13769.3.5 NAME 'mozillaHomePostalCode' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2149 NAME 'rootdn-allow-ip' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.2312.4.3.3.2 NAME 'sabayonProfileName' DESC 'The Name of a sabayon profile' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Sabayon' )", + "( 2.5.4.12 NAME 'title' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.17 NAME 'mailForwardingAddress' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2120 NAME 'dnaFilter' DESC 'DNA filter for finding entries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.223 NAME ( 'passwordResetFailureCount' 'pwdFailureCountInterval' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.49 NAME ( 'distinguishedName' 'dn' ) EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' X-DEPRECATED 'dn' )", + "( 2.16.840.1.113730.3.1.578 NAME 'nsDS5ReplicaHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2190 NAME 'nsslapd-accesslog-logmaxdiskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2232 NAME 'nsslapd-ldapimaptoentries' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.10 NAME 'governingStructureRule' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2279 NAME 'nsslapd-ldifdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1134 NAME 'printer-more-info' DESC 'A URI for more information about this specific printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domaincomponent' ) EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 4519' X-DEPRECATED 'domaincomponent' )", + "( 2.16.840.1.113730.3.1.1004 NAME 'nsds7WindowsDomain' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.201 NAME 'changeLogMaximumSize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.2.3 NAME ( 'mozillaUseHtmlMail' 'xmozillausehtmlmail' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( nsSerialNumber-oid NAME 'nsSerialNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.90 NAME 'cirBeginORC' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2240 NAME 'nsslapd-accesslog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2096 NAME 'entryusn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.694 NAME 'inetSubscriberAccountId' DESC 'A unique attribute linking the subscriber to a billing system' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1112 NAME 'printer-current-operator' DESC 'The identity of the current human operator responsible for operating this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2306 NAME 'nsslapd-return-default-opattr' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 1.2.840.113556.1.4.478 NAME 'calCalURI' DESC 'RFC2739: URI of entire default calendar' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.604 NAME 'parentid' DESC 'internal server defined attribute type' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.2154 NAME 'nsds5ReplicaBackoffMin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2266 NAME 'nsslapd-enquote-sup-oc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.524 NAME 'ntUserScriptPath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2133 NAME 'pwdUpdateTime' DESC 'Last password update time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.22 NAME 'mgrpAllowedBroadcaster' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.236 NAME 'nsSNMPDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.13 NAME 'supportedControl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( nsPreference-oid NAME 'nsPreference' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.592 NAME 'nsDS5ReplicaAutoReferral' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2083 NAME ( 'passwordMinTokenLength' 'pwdMinTokenLength' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.689 NAME 'nsds5replicaUpdateInProgress' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2204 NAME 'nsslapd-auditlog-logging-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1109 NAME 'printer-charset-configured' DESC 'The configured charset in which error and status messages will be generated (by default) by this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.44 NAME 'ntGroupDomainId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.214 NAME 'passwordAllowChangeTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2141 NAME 'dsOnlyMemberUid' DESC 'Elements from a memberuid attribute created to reflect dynamic group membership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Red Hat Directory Server' )", + "( nsDirectoryFailoverList-oid NAME 'nsDirectoryFailoverList' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape' )", + "( nsSSLSessionTimeout-oid NAME 'nsSSLSessionTimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2253 NAME 'nsslapd-nagle' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2118 NAME 'dnaInterval' DESC 'DNA interval between values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.5.4.41 NAME 'name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2188 NAME 'nsslapd-errorlog-logrotationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.66 NAME 'ntUserUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2078 NAME ( 'passwordMinLowers' 'pwdMinLowers' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.587 NAME 'nsds50ruv' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2167 NAME 'schemaUpdateAttributeAccept' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2271 NAME 'nsslapd-rewrite-rfc1274' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.31 NAME 'mailEnhancedUniqueMember' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.209 NAME 'vlvFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( nsErrorLog-oid NAME 'nsErrorLog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.88 NAME 'cirUpdateFailedat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.250 NAME 'nsValueDefault' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.5.4.37 NAME 'cACertificate' DESC 'X.509 CA certificate' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 2.16.840.1.113730.3.1.2105 NAME 'autoMemberTargetGroup' DESC 'Auto Membership target group' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.4.1.6981.11.3.2 NAME 'FTPQuotaMBytes' DESC 'Quota (in megabytes) for an FTP user' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.803 NAME 'nsBackendSuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2217 NAME 'nsslapd-allow-anonymous-access' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.53 NAME 'replicaBindMethod' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.4 NAME 'info' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.2065 NAME 'nsSaslMapBaseDNTemplate' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsSSLSupportedCiphers-oid NAME 'nsSSLSupportedCiphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2287 NAME 'nsslapd-force-sasl-external' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.5 NAME 'serialNumber' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.197 NAME 'replicaHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.15 NAME 'businessCategory' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.107 NAME 'passwordResetDuration' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.48 NAME 'buildingName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2235 NAME 'nsslapd-ldapientrysearchbase' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsInstalledLocation-oid NAME 'nsInstalledLocation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.573 NAME 'nsIdleTimeout' DESC 'Binder-based connection idle timeout (seconds)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.75 NAME 'adminUrl' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.245 NAME 'nsValueTel' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.1466.101.120.42 NAME 'preferredLocale' DESC 'preferred locale for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape' )", + "( nsNYR-oid NAME 'nsNYR' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2172 NAME 'nsslapd-accesslog-maxlogsize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1131 NAME 'printer-charset-supported' DESC 'Set of charsets supported for the attribute values of syntax DirectoryString for this directory entry.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.551 NAME 'cosspecifier' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.97 NAME ( 'passwordMaxAge' 'pwdMaxAge' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2099 NAME 'autoMemberExclusiveRegex' DESC 'Auto Membership exclusive regex rule' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2180 NAME 'nsslapd-auditlog-logrotationsynchour' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2222 NAME 'nsslapd-localuser' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2309 NAME 'nsds5ReplicaPreciseTombstonePurging' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2292 NAME 'nsslapd-disk-monitoring-logging-critical' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2070 NAME 'pamIDMapMethod' DESC 'How to map BIND DN to PAM identity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.408 NAME 'replicaLastRelevantChange' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2269 NAME 'nsslapd-errorlog-list' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1124 NAME 'printer-number-up-supported' DESC 'The possible numbers of print-stream pages to impose upon a single side of an instance of a selected medium.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'rfc3712' )", + "( 2.5.21.7 NAME 'nameForms' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.29 NAME 'mgrpMsgRejectText' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.231 NAME 'nsslapd-pluginEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2136 NAME 'nsds5ReplicaCleanRUVNotified' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( nsWellKnownJarfiles-oid NAME 'nsWellKnownJarfiles' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.328 NAME 'nsMatchingRule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminAccessHosts-oid NAME 'nsAdminAccessHosts' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.5923.1.1.1.6 NAME 'eduPersonPrincipalName' DESC 'Principal Name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.80 NAME 'cirHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.11 NAME 'javaReferenceAddress' DESC 'Addresses associated with a JNDI Reference' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.2086 NAME 'mepManagedBy' DESC 'Managed Entries backpointer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.684 NAME 'nsds5ReplicaChangeCount' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1101 NAME 'nsRoleScopeDN' DESC 'Scope of a role' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.1.1.4.1.453.16.2.103 NAME 'numSubordinates' DESC 'count of immediate subordinates' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'numSubordinates Internet Draft' )", + "( 1.3.6.1.4.1.13769.3.6 NAME 'mozillaHomeCountryName' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2144 NAME 'rootdn-open-time' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.9999999 NAME 'nsds5debugreplicatimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2256 NAME 'passwordLegacyPolicy' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.5 NAME 'namingContexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.12 NAME 'mailAccessDomain' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.226 NAME 'nsslapd-pluginType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2123 NAME 'dnaSharedCfgDN' DESC 'DNA shared configuration entry DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.5.4.44 NAME 'generationQualifier' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2193 NAME 'nsslapd-accesslog-logminfreediskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.612 NAME 'generation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )" + ], + "cn": [ + "schema" + ], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5String' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'DirectoryString' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'DN' )", + "( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )", + "( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'FAX' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'GeneralizedTime' )", + "( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'INTEGER' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'OctetString' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'TelephoneNumber' )", + "( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )" + ], + "matchingRules": [ + "( 2.5.13.17 NAME 'octetStringMatch' DESC 'The octetStringMatch rule compares an assertion value of the Octet String syntax to an attribute value of a syntax (e.g., the Octet String or JPEG syntax) whose corresponding ASN.1 type is the OCTET STRING ASN.1 type. The rule evaluates to TRUE if and only if the attribute value and the assertion value are the same length and corresponding octets (by position) are the same.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.18 NAME 'octetStringOrderingMatch' DESC 'The octetStringOrderingMatch rule compares an assertion value of the Octet String syntax to an attribute value of a syntax (e.g., the Octet String or JPEG syntax) whose corresponding ASN.1 type is the OCTET STRING ASN.1 type. The rule evaluates to TRUE if and only if the attribute value appears earlier in the collation order than the assertion value. The rule compares octet strings from the first octet to the last octet, and from the most significant bit to the least significant bit within the octet. The first occurrence of a different bit determines the ordering of the strings. A zero bit precedes a one bit. If the strings contain different numbers of octets but the longer string is identical to the shorter string up to the length of the shorter string, then the shorter string precedes the longer string.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.16 NAME 'bitStringMatch' DESC 'The bitStringMatch rule compares an assertion value of the Bit String syntax to an attribute value of a syntax (e.g., the Bit String syntax) whose corresponding ASN.1 type is BIT STRING. If the corresponding ASN.1 type of the attribute syntax does not have a named bit list [ASN.1] (which is the case for the Bit String syntax), then the rule evaluates to TRUE if and only if the attribute value has the same number of bits as the assertion value and the bits match on a bitwise basis. If the corresponding ASN.1 type does have a named bit list, then bitStringMatch operates as above, except that trailing zero bits in the attribute and assertion values are treated as absent.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", + "( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' DESC 'The caseExactIA5Match rule compares an assertion value of the IA5 String syntax to an attribute value of a syntax (e.g., the IA5 String syntax) whose corresponding ASN.1 type is IA5String. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 2.5.13.5 NAME 'caseExactMatch' DESC 'The caseExactMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of the alternative string types of DirectoryString, such as PrintableString (the other alternatives do not correspond to any syntax defined in this document). The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.6 NAME 'caseExactOrderingMatch' DESC 'The caseExactOrderingMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if, in the code point collation order, the prepared attribute value character string appears earlier than the prepared assertion value character string; i.e., the attribute value is \\"less than\\" the assertion value. In preparing the attribute value and assertion value for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.7 NAME 'caseExactSubstringsMatch' DESC 'The caseExactSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.16.840.1.113730.3.3.1 NAME 'caseExactIA5SubstringsMatch' DESC 'The caseExactIA5SubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the IA5 syntax) whose corresponding ASN.1 type is IA5 String or one of its alternative string types. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.27 NAME 'generalizedTimeMatch' DESC 'The rule evaluates to TRUE if and only if the attribute value represents the same universal coordinated time as the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' DESC 'The rule evaluates to TRUE if and only if the attribute value represents a universal coordinated time that is earlier than the universal coordinated time represented by the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.13 NAME 'booleanMatch' DESC 'The booleanMatch rule compares an assertion value of the Boolean syntax to an attribute value of a syntax (e.g., the Boolean syntax) whose corresponding ASN.1 type is BOOLEAN. The rule evaluates to TRUE if and only if the attribute value and the assertion value are both TRUE or both FALSE.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' DESC 'The caseIgnoreIA5Match rule compares an assertion value of the IA5 String syntax to an attribute value of a syntax (e.g., the IA5 String syntax) whose corresponding ASN.1 type is IA5String. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' DESC 'The caseIgnoreIA5SubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the IA5 String syntax) whose corresponding ASN.1 type is IA5String. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.2 NAME 'caseIgnoreMatch' DESC 'The caseIgnoreMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' DESC 'The caseIgnoreOrderingMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if, in the code point collation order, the prepared attribute value character string appears earlier than the prepared assertion value character string; i.e., the attribute value is \\"less than\\" the assertion value. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' DESC 'The caseIgnoreSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.11 NAME 'caseIgnoreListMatch' DESC 'The caseIgnoreListMatch rule compares an assertion value that is a sequence of strings to an attribute value of a syntax (e.g., the Postal Address syntax) whose corresponding ASN.1 type is a SEQUENCE OF the DirectoryString ASN.1 type. The rule evaluates to TRUE if and only if the attribute value and the assertion value have the same number of strings and corresponding strings (by position) match according to the caseIgnoreMatch matching rule. In [X.520], the assertion syntax for this matching rule is defined to be: SEQUENCE OF DirectoryString {ub-match} That is, it is different from the corresponding type for the Postal Address syntax. The choice of the Postal Address syntax for the assertion syntax of the caseIgnoreListMatch in LDAP should not be seen as limiting the matching rule to apply only to attributes with the Postal Address syntax.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' DESC 'The caseIgnoreListSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Postal Address syntax) whose corresponding ASN.1 type is a SEQUENCE OF the DirectoryString ASN.1 type. The rule evaluates to TRUE if and only if the assertion value matches, per the caseIgnoreSubstringsMatch rule, the character string formed by concatenating the strings of the attribute value, except that none of the , , or substrings of the assertion value are considered to match a substring of the concatenated string which spans more than one of the original strings of the attribute value. Note that, in terms of the LDAP-specific encoding of the Postal Address syntax, the concatenated string omits the line separator and the escaping of \\"\\\\\\" and \\"$\\" characters.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.0 NAME 'objectIdentifierMatch' DESC 'The objectIdentifierMatch rule compares an assertion value of the OID syntax to an attribute value of a syntax (e.g., the OID syntax) whose corresponding ASN.1 type is OBJECT IDENTIFIER. The rule evaluates to TRUE if and only if the assertion value and the attribute value represent the same object identifier; that is, the same sequence of integers, whether represented explicitly in the form of or implicitly in the form (see [RFC4512]). If an LDAP client supplies an assertion value in the form and the chosen descriptor is not recognized by the server, then the objectIdentifierMatch rule evaluates to Undefined.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.13.31 NAME 'directoryStringFirstComponentMatch' DESC 'The directoryStringFirstComponentMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax whose corresponding ASN.1 type is a SEQUENCE with a mandatory first component of the DirectoryString ASN.1 type. Note that the assertion syntax of this matching rule differs from the attribute syntax of attributes for which this is the equality matching rule. The rule evaluates to TRUE if and only if the assertion value matches the first component of the attribute value using the rules of caseIgnoreMatch.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' DESC 'The objectIdentifierFirstComponentMatch rule compares an assertion value of the OID syntax to an attribute value of a syntax (e.g., the Attribute Type Description, DIT Content Rule Description, LDAP Syntax Description, Matching Rule Description, Matching Rule Use Description, Name Form Description, or Object Class Description syntax) whose corresponding ASN.1 type is a SEQUENCE with a mandatory first component of the OBJECT IDENTIFIER ASN.1 type. Note that the assertion syntax of this matching rule differs from the attribute syntax of attributes for which this is the equality matching rule. The rule evaluates to TRUE if and only if the assertion value matches the first component of the attribute value using the rules of objectIdentifierMatch.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.13.1 NAME 'distinguishedNameMatch' DESC 'The distinguishedNameMatch rule compares an assertion value of the DN syntax to an attribute value of a syntax (e.g., the DN syntax) whose corresponding ASN.1 type is DistinguishedName. The rule evaluates to TRUE if and only if the attribute value and the assertion value have the same number of relative distinguished names and corresponding relative distinguished names (by position) are the same. A relative distinguished name (RDN) of the assertion value is the same as an RDN of the attribute value if and only if they have the same number of attribute value assertions and each attribute value assertion (AVA) of the first RDN is the same as the AVA of the second RDN with the same attribute type. The order of the AVAs is not significant. Also note that a particular attribute type may appear in at most one AVA in an RDN. Two AVAs with the same attribute type are the same if their values are equal according to the equality matching rule of the attribute type. If one or more of the AVA comparisons evaluate to Undefined and the remaining AVA comparisons return TRUE then the distinguishedNameMatch rule evaluates to Undefined.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.13.14 NAME 'integerMatch' DESC 'The rule evaluates to TRUE if and only if the attribute value and the assertion value are the same integer value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.15 NAME 'integerOrderingMatch' DESC 'The rule evaluates to TRUE if and only if the integer value of the attribute value is less than the integer value of the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.29 NAME 'integerFirstComponentMatch' DESC 'The integerFirstComponentMatch rule compares an assertion value of the Integer syntax to an attribute value of a syntax (e.g., the DIT Structure Rule Description syntax) whose corresponding ASN.1 type is a SEQUENCE with a mandatory first component of the INTEGER ASN.1 type. Note that the assertion syntax of this matching rule differs from the attribute syntax of attributes for which this is the equality matching rule. The rule evaluates to TRUE if and only if the assertion value and the first component of the attribute value are the same integer value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.16.840.1.113730.3.3.2.0.1 NAME 'caseIgnoreOrderingMatch-default' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.0.1.6 NAME 'caseIgnoreSubstringMatch-default' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.1.1 NAME 'caseIgnoreOrderingMatch-ar' DESC 'ar' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.1.1.6 NAME 'caseIgnoreSubstringMatch-ar' DESC 'ar' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.2.1 NAME 'caseIgnoreOrderingMatch-be' DESC 'be' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.2.1.6 NAME 'caseIgnoreSubstringMatch-be' DESC 'be' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.3.1 NAME 'caseIgnoreOrderingMatch-bg' DESC 'bg' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.3.1.6 NAME 'caseIgnoreSubstringMatch-bg' DESC 'bg' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.4.1 NAME 'caseIgnoreOrderingMatch-ca' DESC 'ca' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.4.1.6 NAME 'caseIgnoreSubstringMatch-ca' DESC 'ca' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.5.1 NAME 'caseIgnoreOrderingMatch-cs' DESC 'cs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.5.1.6 NAME 'caseIgnoreSubstringMatch-cs' DESC 'cs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.6.1 NAME 'caseIgnoreOrderingMatch-da' DESC 'da' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.6.1.6 NAME 'caseIgnoreSubstringMatch-da' DESC 'da' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.7.1 NAME 'caseIgnoreOrderingMatch-de' DESC 'de' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.7.1.6 NAME 'caseIgnoreSubstringMatch-de' DESC 'de' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.8.1 NAME 'caseIgnoreOrderingMatch-de-AT' DESC 'de-AT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.8.1.6 NAME 'caseIgnoreSubstringMatch-de-AT' DESC 'de-AT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.9.1 NAME 'caseIgnoreOrderingMatch-de-CH' DESC 'de-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.9.1.6 NAME 'caseIgnoreSubstringMatch-de-CH' DESC 'de-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.10.1 NAME 'caseIgnoreOrderingMatch-el' DESC 'el' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.10.1.6 NAME 'caseIgnoreSubstringMatch-el' DESC 'el' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.1 NAME 'caseIgnoreOrderingMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.1.6 NAME 'caseIgnoreSubstringMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.12.1 NAME 'caseIgnoreOrderingMatch-en-CA' DESC 'en-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.12.1.6 NAME 'caseIgnoreSubstringMatch-en-CA' DESC 'en-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.13.1 NAME 'caseIgnoreOrderingMatch-en-GB' DESC 'en-GB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.13.1.6 NAME 'caseIgnoreSubstringMatch-en-GB' DESC 'en-GB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.14.1 NAME 'caseIgnoreOrderingMatch-en-IE' DESC 'en-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.14.1.6 NAME 'caseIgnoreSubstringMatch-en-IE' DESC 'en-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.15.1 NAME 'caseIgnoreOrderingMatch-es' DESC 'es' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.15.1.6 NAME 'caseIgnoreSubstringMatch-es' DESC 'es' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.16.1 NAME 'caseIgnoreOrderingMatch-et' DESC 'et' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.16.1.6 NAME 'caseIgnoreSubstringMatch-et' DESC 'et' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.17.1 NAME 'caseIgnoreOrderingMatch-fi' DESC 'fi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.17.1.6 NAME 'caseIgnoreSubstringMatch-fi' DESC 'fi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.18.1 NAME 'caseIgnoreOrderingMatch-fr' DESC 'fr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.18.1.6 NAME 'caseIgnoreSubstringMatch-fr' DESC 'fr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.19.1 NAME 'caseIgnoreOrderingMatch-fr-BE' DESC 'fr-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.19.1.6 NAME 'caseIgnoreSubstringMatch-fr-BE' DESC 'fr-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.20.1 NAME 'caseIgnoreOrderingMatch-fr-CA' DESC 'fr-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.20.1.6 NAME 'caseIgnoreSubstringMatch-fr-CA' DESC 'fr-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.21.1 NAME 'caseIgnoreOrderingMatch-fr-CH' DESC 'fr-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.21.1.6 NAME 'caseIgnoreSubstringMatch-fr-CH' DESC 'fr-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.22.1 NAME 'caseIgnoreOrderingMatch-hr' DESC 'hr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.22.1.6 NAME 'caseIgnoreSubstringMatch-hr' DESC 'hr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.23.1 NAME 'caseIgnoreOrderingMatch-hu' DESC 'hu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.23.1.6 NAME 'caseIgnoreSubstringMatch-hu' DESC 'hu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.24.1 NAME 'caseIgnoreOrderingMatch-is' DESC 'is' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.24.1.6 NAME 'caseIgnoreSubstringMatch-is' DESC 'is' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.25.1 NAME 'caseIgnoreOrderingMatch-it' DESC 'it' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.25.1.6 NAME 'caseIgnoreSubstringMatch-it' DESC 'it' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.26.1 NAME 'caseIgnoreOrderingMatch-it-CH' DESC 'it-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.26.1.6 NAME 'caseIgnoreSubstringMatch-it-CH' DESC 'it-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.27.1 NAME 'caseIgnoreOrderingMatch-iw' DESC 'iw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.27.1.6 NAME 'caseIgnoreSubstringMatch-iw' DESC 'iw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.28.1 NAME 'caseIgnoreOrderingMatch-ja' DESC 'ja' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.28.1.6 NAME 'caseIgnoreSubstringMatch-ja' DESC 'ja' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.29.1 NAME 'caseIgnoreOrderingMatch-ko' DESC 'ko' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.29.1.6 NAME 'caseIgnoreSubstringMatch-ko' DESC 'ko' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.30.1 NAME 'caseIgnoreOrderingMatch-lt' DESC 'lt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.30.1.6 NAME 'caseIgnoreSubstringMatch-lt' DESC 'lt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.31.1 NAME 'caseIgnoreOrderingMatch-lv' DESC 'lv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.31.1.6 NAME 'caseIgnoreSubstringMatch-lv' DESC 'lv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.32.1 NAME 'caseIgnoreOrderingMatch-mk' DESC 'mk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.32.1.6 NAME 'caseIgnoreSubstringMatch-mk' DESC 'mk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.33.1 NAME 'caseIgnoreOrderingMatch-nl' DESC 'nl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.33.1.6 NAME 'caseIgnoreSubstringMatch-nl' DESC 'nl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.34.1 NAME 'caseIgnoreOrderingMatch-nl-BE' DESC 'nl-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.34.1.6 NAME 'caseIgnoreSubstringMatch-nl-BE' DESC 'nl-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.35.1 NAME 'caseIgnoreOrderingMatch-no' DESC 'no' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.35.1.6 NAME 'caseIgnoreSubstringMatch-no' DESC 'no' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.36.1 NAME 'caseIgnoreOrderingMatch-no-NO-B' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.36.1.6 NAME 'caseIgnoreSubstringMatch-no-NO-B' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.37.1 NAME 'caseIgnoreOrderingMatch-no-NO-NY' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.37.1.6 NAME 'caseIgnoreSubstringMatch-no-NO-NY' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.38.1 NAME 'caseIgnoreOrderingMatch-pl' DESC 'pl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.38.1.6 NAME 'caseIgnoreSubstringMatch-pl' DESC 'pl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.39.1 NAME 'caseIgnoreOrderingMatch-ro' DESC 'ro' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.39.1.6 NAME 'caseIgnoreSubstringMatch-ro' DESC 'ro' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.40.1 NAME 'caseIgnoreOrderingMatch-ru' DESC 'ru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.40.1.6 NAME 'caseIgnoreSubstringMatch-ru' DESC 'ru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.41.1 NAME 'caseIgnoreOrderingMatch-sh' DESC 'sh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.41.1.6 NAME 'caseIgnoreSubstringMatch-sh' DESC 'sh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.42.1 NAME 'caseIgnoreOrderingMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.42.1.6 NAME 'caseIgnoreSubstringMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.43.1 NAME 'caseIgnoreOrderingMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.43.1.6 NAME 'caseIgnoreSubstringMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.44.1 NAME 'caseIgnoreOrderingMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.44.1.6 NAME 'caseIgnoreSubstringMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.45.1 NAME 'caseIgnoreOrderingMatch-sr' DESC 'sr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.45.1.6 NAME 'caseIgnoreSubstringMatch-sr' DESC 'sr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.46.1 NAME 'caseIgnoreOrderingMatch-sv' DESC 'sv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.46.1.6 NAME 'caseIgnoreSubstringMatch-sv' DESC 'sv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.47.1 NAME 'caseIgnoreOrderingMatch-tr' DESC 'tr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.47.1.6 NAME 'caseIgnoreSubstringMatch-tr' DESC 'tr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.48.1 NAME 'caseIgnoreOrderingMatch-uk' DESC 'uk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.48.1.6 NAME 'caseIgnoreSubstringMatch-uk' DESC 'uk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.49.1 NAME 'caseIgnoreOrderingMatch-zh' DESC 'zh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.49.1.6 NAME 'caseIgnoreSubstringMatch-zh' DESC 'zh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.50.1 NAME 'caseIgnoreOrderingMatch-zh-TW' DESC 'zh-TW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.50.1.6 NAME 'caseIgnoreSubstringMatch-zh-TW' DESC 'zh-TW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.51.1 NAME 'caseIgnoreOrderingMatch-af' DESC 'af' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.51.1.6 NAME 'caseIgnoreSubstringMatch-af' DESC 'af' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.52.1 NAME 'caseIgnoreOrderingMatch-af-NA' DESC 'af-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.52.1.6 NAME 'caseIgnoreSubstringMatch-af-NA' DESC 'af-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.53.1 NAME 'caseIgnoreOrderingMatch-af-ZA' DESC 'af-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.53.1.6 NAME 'caseIgnoreSubstringMatch-af-ZA' DESC 'af-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.54.1 NAME 'caseIgnoreOrderingMatch-ar-AE' DESC 'ar-AE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.54.1.6 NAME 'caseIgnoreSubstringMatch-ar-AE' DESC 'ar-AE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.55.1 NAME 'caseIgnoreOrderingMatch-ar-BH' DESC 'ar-BH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.55.1.6 NAME 'caseIgnoreSubstringMatch-ar-BH' DESC 'ar-BH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.56.1 NAME 'caseIgnoreOrderingMatch-ar-DZ' DESC 'ar-DZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.56.1.6 NAME 'caseIgnoreSubstringMatch-ar-DZ' DESC 'ar-DZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.57.1 NAME 'caseIgnoreOrderingMatch-ar-EG' DESC 'ar-EG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.57.1.6 NAME 'caseIgnoreSubstringMatch-ar-EG' DESC 'ar-EG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.58.1 NAME 'caseIgnoreOrderingMatch-ar-IQ' DESC 'ar-IQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.58.1.6 NAME 'caseIgnoreSubstringMatch-ar-IQ' DESC 'ar-IQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.59.1 NAME 'caseIgnoreOrderingMatch-ar-JO' DESC 'ar-JO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.59.1.6 NAME 'caseIgnoreSubstringMatch-ar-JO' DESC 'ar-JO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.60.1 NAME 'caseIgnoreOrderingMatch-ar-KW' DESC 'ar-KW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.60.1.6 NAME 'caseIgnoreSubstringMatch-ar-KW' DESC 'ar-KW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.61.1 NAME 'caseIgnoreOrderingMatch-ar-LB' DESC 'ar-LB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.61.1.6 NAME 'caseIgnoreSubstringMatch-ar-LB' DESC 'ar-LB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.62.1 NAME 'caseIgnoreOrderingMatch-ar-LY' DESC 'ar-LY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.62.1.6 NAME 'caseIgnoreSubstringMatch-ar-LY' DESC 'ar-LY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.63.1 NAME 'caseIgnoreOrderingMatch-ar-MA' DESC 'ar-MA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.63.1.6 NAME 'caseIgnoreSubstringMatch-ar-MA' DESC 'ar-MA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.64.1 NAME 'caseIgnoreOrderingMatch-ar-OM' DESC 'ar-OM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.64.1.6 NAME 'caseIgnoreSubstringMatch-ar-OM' DESC 'ar-OM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.65.1 NAME 'caseIgnoreOrderingMatch-ar-QA' DESC 'ar-QA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.65.1.6 NAME 'caseIgnoreSubstringMatch-ar-QA' DESC 'ar-QA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.66.1 NAME 'caseIgnoreOrderingMatch-ar-SA' DESC 'ar-SA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.66.1.6 NAME 'caseIgnoreSubstringMatch-ar-SA' DESC 'ar-SA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.67.1 NAME 'caseIgnoreOrderingMatch-ar-SD' DESC 'ar-SD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.67.1.6 NAME 'caseIgnoreSubstringMatch-ar-SD' DESC 'ar-SD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.68.1 NAME 'caseIgnoreOrderingMatch-ar-SY' DESC 'ar-SY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.68.1.6 NAME 'caseIgnoreSubstringMatch-ar-SY' DESC 'ar-SY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.69.1 NAME 'caseIgnoreOrderingMatch-ar-TN' DESC 'ar-TN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.69.1.6 NAME 'caseIgnoreSubstringMatch-ar-TN' DESC 'ar-TN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.70.1 NAME 'caseIgnoreOrderingMatch-ar-YE' DESC 'ar-YE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.70.1.6 NAME 'caseIgnoreSubstringMatch-ar-YE' DESC 'ar-YE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.71.1 NAME 'caseIgnoreOrderingMatch-as' DESC 'as' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.71.1.6 NAME 'caseIgnoreSubstringMatch-as' DESC 'as' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.72.1 NAME 'caseIgnoreOrderingMatch-as-IN' DESC 'as-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.72.1.6 NAME 'caseIgnoreSubstringMatch-as-IN' DESC 'as-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.73.1 NAME 'caseIgnoreOrderingMatch-az' DESC 'az' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.73.1.6 NAME 'caseIgnoreSubstringMatch-az' DESC 'az' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.74.1 NAME 'caseIgnoreOrderingMatch-az-Latn' DESC 'az-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.74.1.6 NAME 'caseIgnoreSubstringMatch-az-Latn' DESC 'az-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.75.1 NAME 'caseIgnoreOrderingMatch-az-Latn-AZ' DESC 'az-Latn_AZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.75.1.6 NAME 'caseIgnoreSubstringMatch-az-Latn-AZ' DESC 'az-Latn_AZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.76.1 NAME 'caseIgnoreOrderingMatch-bn' DESC 'bn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.76.1.6 NAME 'caseIgnoreSubstringMatch-bn' DESC 'bn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.77.1 NAME 'caseIgnoreOrderingMatch-bn-BD' DESC 'bn-BD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.77.1.6 NAME 'caseIgnoreSubstringMatch-bn-BD' DESC 'bn-BD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.78.1 NAME 'caseIgnoreOrderingMatch-bn-IN' DESC 'bn-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.78.1.6 NAME 'caseIgnoreSubstringMatch-bn-IN' DESC 'bn-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.79.1 NAME 'caseIgnoreOrderingMatch-bs' DESC 'bs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.79.1.6 NAME 'caseIgnoreSubstringMatch-bs' DESC 'bs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.80.1 NAME 'caseIgnoreOrderingMatch-chr' DESC 'chr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.80.1.6 NAME 'caseIgnoreSubstringMatch-chr' DESC 'chr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.81.1 NAME 'caseIgnoreOrderingMatch-chr-US' DESC 'chr-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.81.1.6 NAME 'caseIgnoreSubstringMatch-chr-US' DESC 'chr-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.82.1 NAME 'caseIgnoreOrderingMatch-cy' DESC 'cy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.82.1.6 NAME 'caseIgnoreSubstringMatch-cy' DESC 'cy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.83.1 NAME 'caseIgnoreOrderingMatch-de-BE' DESC 'de-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.83.1.6 NAME 'caseIgnoreSubstringMatch-de-BE' DESC 'de-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.84.1 NAME 'caseIgnoreOrderingMatch-de-LI' DESC 'de-LI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.84.1.6 NAME 'caseIgnoreSubstringMatch-de-LI' DESC 'de-LI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.85.1 NAME 'caseIgnoreOrderingMatch-de-LU' DESC 'de-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.85.1.6 NAME 'caseIgnoreSubstringMatch-de-LU' DESC 'de-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.86.1 NAME 'caseIgnoreOrderingMatch-el-CY' DESC 'el-CY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.86.1.6 NAME 'caseIgnoreSubstringMatch-el-CY' DESC 'el-CY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.87.1 NAME 'caseIgnoreOrderingMatch-el-GR' DESC 'el-GR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.87.1.6 NAME 'caseIgnoreSubstringMatch-el-GR' DESC 'el-GR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.88.1 NAME 'caseIgnoreOrderingMatch-en-AS' DESC 'en-AS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.88.1.6 NAME 'caseIgnoreSubstringMatch-en-AS' DESC 'en-AS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.89.1 NAME 'caseIgnoreOrderingMatch-en-AU' DESC 'en-AU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.89.1.6 NAME 'caseIgnoreSubstringMatch-en-AU' DESC 'en-AU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.90.1 NAME 'caseIgnoreOrderingMatch-en-BE' DESC 'en-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.90.1.6 NAME 'caseIgnoreSubstringMatch-en-BE' DESC 'en-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.91.1 NAME 'caseIgnoreOrderingMatch-en-BW' DESC 'en-BW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.91.1.6 NAME 'caseIgnoreSubstringMatch-en-BW' DESC 'en-BW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.92.1 NAME 'caseIgnoreOrderingMatch-en-BZ' DESC 'en-BZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.92.1.6 NAME 'caseIgnoreSubstringMatch-en-BZ' DESC 'en-BZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.93.1 NAME 'caseIgnoreOrderingMatch-en-GU' DESC 'en-GU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.93.1.6 NAME 'caseIgnoreSubstringMatch-en-GU' DESC 'en-GU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.94.1 NAME 'caseIgnoreOrderingMatch-en-GY' DESC 'en-GY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.94.1.6 NAME 'caseIgnoreSubstringMatch-en-GY' DESC 'en-GY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.95.1 NAME 'caseIgnoreOrderingMatch-en-HK' DESC 'en-HK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.95.1.6 NAME 'caseIgnoreSubstringMatch-en-HK' DESC 'en-HK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.96.1 NAME 'caseIgnoreOrderingMatch-en-IN' DESC 'en-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.96.1.6 NAME 'caseIgnoreSubstringMatch-en-IN' DESC 'en-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.97.1 NAME 'caseIgnoreOrderingMatch-en-JM' DESC 'en-JM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.97.1.6 NAME 'caseIgnoreSubstringMatch-en-JM' DESC 'en-JM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.98.1 NAME 'caseIgnoreOrderingMatch-en-MH' DESC 'en-MH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.98.1.6 NAME 'caseIgnoreSubstringMatch-en-MH' DESC 'en-MH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.99.1 NAME 'caseIgnoreOrderingMatch-en-MP' DESC 'en-MP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.99.1.6 NAME 'caseIgnoreSubstringMatch-en-MP' DESC 'en-MP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.100.1 NAME 'caseIgnoreOrderingMatch-en-MT' DESC 'en-MT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.100.1.6 NAME 'caseIgnoreSubstringMatch-en-MT' DESC 'en-MT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.101.1 NAME 'caseIgnoreOrderingMatch-en-MU' DESC 'en-MU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.101.1.6 NAME 'caseIgnoreSubstringMatch-en-MU' DESC 'en-MU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.102.1 NAME 'caseIgnoreOrderingMatch-en-NA' DESC 'en-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.102.1.6 NAME 'caseIgnoreSubstringMatch-en-NA' DESC 'en-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.103.1 NAME 'caseIgnoreOrderingMatch-en-NZ' DESC 'en-NZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.103.1.6 NAME 'caseIgnoreSubstringMatch-en-NZ' DESC 'en-NZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.104.1 NAME 'caseIgnoreOrderingMatch-en-PH' DESC 'en-PH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.104.1.6 NAME 'caseIgnoreSubstringMatch-en-PH' DESC 'en-PH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.105.1 NAME 'caseIgnoreOrderingMatch-en-PK' DESC 'en-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.105.1.6 NAME 'caseIgnoreSubstringMatch-en-PK' DESC 'en-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.106.1 NAME 'caseIgnoreOrderingMatch-en-SG' DESC 'en-SG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.106.1.6 NAME 'caseIgnoreSubstringMatch-en-SG' DESC 'en-SG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.107.1 NAME 'caseIgnoreOrderingMatch-en-TT' DESC 'en-TT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.107.1.6 NAME 'caseIgnoreSubstringMatch-en-TT' DESC 'en-TT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.108.1 NAME 'caseIgnoreOrderingMatch-en-UM' DESC 'en-UM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.108.1.6 NAME 'caseIgnoreSubstringMatch-en-UM' DESC 'en-UM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.109.1 NAME 'caseIgnoreOrderingMatch-en-US' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.109.1.6 NAME 'caseIgnoreSubstringMatch-en-US' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.110.1 NAME 'caseIgnoreOrderingMatch-en-US-POSIX' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.110.1.6 NAME 'caseIgnoreSubstringMatch-en-US-POSIX' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.111.1 NAME 'caseIgnoreOrderingMatch-en-VI' DESC 'en-VI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.111.1.6 NAME 'caseIgnoreSubstringMatch-en-VI' DESC 'en-VI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.112.1 NAME 'caseIgnoreOrderingMatch-en-ZA' DESC 'en-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.112.1.6 NAME 'caseIgnoreSubstringMatch-en-ZA' DESC 'en-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.113.1 NAME 'caseIgnoreOrderingMatch-en-ZW' DESC 'en-ZW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.113.1.6 NAME 'caseIgnoreSubstringMatch-en-ZW' DESC 'en-ZW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.114.1 NAME 'caseIgnoreOrderingMatch-es-AR' DESC 'es-AR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.114.1.6 NAME 'caseIgnoreSubstringMatch-es-AR' DESC 'es-AR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.115.1 NAME 'caseIgnoreOrderingMatch-es-BO' DESC 'es-BO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.115.1.6 NAME 'caseIgnoreSubstringMatch-es-BO' DESC 'es-BO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.116.1 NAME 'caseIgnoreOrderingMatch-es-CL' DESC 'es-CL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.116.1.6 NAME 'caseIgnoreSubstringMatch-es-CL' DESC 'es-CL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.117.1 NAME 'caseIgnoreOrderingMatch-es-CO' DESC 'es-CO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.117.1.6 NAME 'caseIgnoreSubstringMatch-es-CO' DESC 'es-CO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.118.1 NAME 'caseIgnoreOrderingMatch-es-CR' DESC 'es-CR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.118.1.6 NAME 'caseIgnoreSubstringMatch-es-CR' DESC 'es-CR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.119.1 NAME 'caseIgnoreOrderingMatch-es-DO' DESC 'es-DO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.119.1.6 NAME 'caseIgnoreSubstringMatch-es-DO' DESC 'es-DO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.120.1 NAME 'caseIgnoreOrderingMatch-es-EC' DESC 'es-EC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.120.1.6 NAME 'caseIgnoreSubstringMatch-es-EC' DESC 'es-EC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.121.1 NAME 'caseIgnoreOrderingMatch-es-ES' DESC 'es-ES' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.121.1.6 NAME 'caseIgnoreSubstringMatch-es-ES' DESC 'es-ES' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.122.1 NAME 'caseIgnoreOrderingMatch-es-GQ' DESC 'es-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.122.1.6 NAME 'caseIgnoreSubstringMatch-es-GQ' DESC 'es-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.123.1 NAME 'caseIgnoreOrderingMatch-es-GT' DESC 'es-GT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.123.1.6 NAME 'caseIgnoreSubstringMatch-es-GT' DESC 'es-GT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.124.1 NAME 'caseIgnoreOrderingMatch-es-HN' DESC 'es-HN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.124.1.6 NAME 'caseIgnoreSubstringMatch-es-HN' DESC 'es-HN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.125.1 NAME 'caseIgnoreOrderingMatch-es-MX' DESC 'es-MX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.125.1.6 NAME 'caseIgnoreSubstringMatch-es-MX' DESC 'es-MX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.126.1 NAME 'caseIgnoreOrderingMatch-es-NI' DESC 'es-NI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.126.1.6 NAME 'caseIgnoreSubstringMatch-es-NI' DESC 'es-NI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.127.1 NAME 'caseIgnoreOrderingMatch-es-PA' DESC 'es-PA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.127.1.6 NAME 'caseIgnoreSubstringMatch-es-PA' DESC 'es-PA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.128.1 NAME 'caseIgnoreOrderingMatch-es-PE' DESC 'es-PE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.128.1.6 NAME 'caseIgnoreSubstringMatch-es-PE' DESC 'es-PE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.129.1 NAME 'caseIgnoreOrderingMatch-es-PR' DESC 'es-PR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.129.1.6 NAME 'caseIgnoreSubstringMatch-es-PR' DESC 'es-PR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.130.1 NAME 'caseIgnoreOrderingMatch-es-PY' DESC 'es-PY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.130.1.6 NAME 'caseIgnoreSubstringMatch-es-PY' DESC 'es-PY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.131.1 NAME 'caseIgnoreOrderingMatch-es-SV' DESC 'es-SV' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.131.1.6 NAME 'caseIgnoreSubstringMatch-es-SV' DESC 'es-SV' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.132.1 NAME 'caseIgnoreOrderingMatch-es-US' DESC 'es-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.132.1.6 NAME 'caseIgnoreSubstringMatch-es-US' DESC 'es-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.133.1 NAME 'caseIgnoreOrderingMatch-es-UY' DESC 'es-UY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.133.1.6 NAME 'caseIgnoreSubstringMatch-es-UY' DESC 'es-UY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.134.1 NAME 'caseIgnoreOrderingMatch-es-VE' DESC 'es-VE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.134.1.6 NAME 'caseIgnoreSubstringMatch-es-VE' DESC 'es-VE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.135.1 NAME 'caseIgnoreOrderingMatch-fa' DESC 'fa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.135.1.6 NAME 'caseIgnoreSubstringMatch-fa' DESC 'fa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.136.1 NAME 'caseIgnoreOrderingMatch-fil' DESC 'fil' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.136.1.6 NAME 'caseIgnoreSubstringMatch-fil' DESC 'fil' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.137.1 NAME 'caseIgnoreOrderingMatch-fo' DESC 'fo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.137.1.6 NAME 'caseIgnoreSubstringMatch-fo' DESC 'fo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.138.1 NAME 'caseIgnoreOrderingMatch-fr-BF' DESC 'fr-BF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.138.1.6 NAME 'caseIgnoreSubstringMatch-fr-BF' DESC 'fr-BF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.139.1 NAME 'caseIgnoreOrderingMatch-fr-BI' DESC 'fr-BI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.139.1.6 NAME 'caseIgnoreSubstringMatch-fr-BI' DESC 'fr-BI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.140.1 NAME 'caseIgnoreOrderingMatch-fr-BJ' DESC 'fr-BJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.140.1.6 NAME 'caseIgnoreSubstringMatch-fr-BJ' DESC 'fr-BJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.141.1 NAME 'caseIgnoreOrderingMatch-fr-BL' DESC 'fr-BL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.141.1.6 NAME 'caseIgnoreSubstringMatch-fr-BL' DESC 'fr-BL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.142.1 NAME 'caseIgnoreOrderingMatch-fr-CD' DESC 'fr-CD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.142.1.6 NAME 'caseIgnoreSubstringMatch-fr-CD' DESC 'fr-CD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.143.1 NAME 'caseIgnoreOrderingMatch-fr-CF' DESC 'fr-CF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.143.1.6 NAME 'caseIgnoreSubstringMatch-fr-CF' DESC 'fr-CF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.144.1 NAME 'caseIgnoreOrderingMatch-fr-CG' DESC 'fr-CG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.144.1.6 NAME 'caseIgnoreSubstringMatch-fr-CG' DESC 'fr-CG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.145.1 NAME 'caseIgnoreOrderingMatch-fr-CI' DESC 'fr-CI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.145.1.6 NAME 'caseIgnoreSubstringMatch-fr-CI' DESC 'fr-CI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.146.1 NAME 'caseIgnoreOrderingMatch-fr-CM' DESC 'fr-CM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.146.1.6 NAME 'caseIgnoreSubstringMatch-fr-CM' DESC 'fr-CM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.147.1 NAME 'caseIgnoreOrderingMatch-fr-DJ' DESC 'fr-DJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.147.1.6 NAME 'caseIgnoreSubstringMatch-fr-DJ' DESC 'fr-DJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.148.1 NAME 'caseIgnoreOrderingMatch-fr-GA' DESC 'fr-GA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.148.1.6 NAME 'caseIgnoreSubstringMatch-fr-GA' DESC 'fr-GA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.149.1 NAME 'caseIgnoreOrderingMatch-fr-GN' DESC 'fr-GN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.149.1.6 NAME 'caseIgnoreSubstringMatch-fr-GN' DESC 'fr-GN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.150.1 NAME 'caseIgnoreOrderingMatch-fr-GP' DESC 'fr-GP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.150.1.6 NAME 'caseIgnoreSubstringMatch-fr-GP' DESC 'fr-GP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.151.1 NAME 'caseIgnoreOrderingMatch-fr-GQ' DESC 'fr-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.151.1.6 NAME 'caseIgnoreSubstringMatch-fr-GQ' DESC 'fr-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.152.1 NAME 'caseIgnoreOrderingMatch-fr-KM' DESC 'fr-KM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.152.1.6 NAME 'caseIgnoreSubstringMatch-fr-KM' DESC 'fr-KM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.153.1 NAME 'caseIgnoreOrderingMatch-fr-LU' DESC 'fr-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.153.1.6 NAME 'caseIgnoreSubstringMatch-fr-LU' DESC 'fr-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.154.1 NAME 'caseIgnoreOrderingMatch-fr-MC' DESC 'fr-MC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.154.1.6 NAME 'caseIgnoreSubstringMatch-fr-MC' DESC 'fr-MC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.155.1 NAME 'caseIgnoreOrderingMatch-fr-MF' DESC 'fr-MF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.155.1.6 NAME 'caseIgnoreSubstringMatch-fr-MF' DESC 'fr-MF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.156.1 NAME 'caseIgnoreOrderingMatch-fr-MG' DESC 'fr-MG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.156.1.6 NAME 'caseIgnoreSubstringMatch-fr-MG' DESC 'fr-MG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.157.1 NAME 'caseIgnoreOrderingMatch-fr-ML' DESC 'fr-ML' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.157.1.6 NAME 'caseIgnoreSubstringMatch-fr-ML' DESC 'fr-ML' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.158.1 NAME 'caseIgnoreOrderingMatch-fr-MQ' DESC 'fr-MQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.158.1.6 NAME 'caseIgnoreSubstringMatch-fr-MQ' DESC 'fr-MQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.159.1 NAME 'caseIgnoreOrderingMatch-fr-NE' DESC 'fr-NE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.159.1.6 NAME 'caseIgnoreSubstringMatch-fr-NE' DESC 'fr-NE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.160.1 NAME 'caseIgnoreOrderingMatch-fr-RE' DESC 'fr-RE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.160.1.6 NAME 'caseIgnoreSubstringMatch-fr-RE' DESC 'fr-RE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.161.1 NAME 'caseIgnoreOrderingMatch-fr-RW' DESC 'fr-RW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.161.1.6 NAME 'caseIgnoreSubstringMatch-fr-RW' DESC 'fr-RW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.162.1 NAME 'caseIgnoreOrderingMatch-fr-SN' DESC 'fr-SN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.162.1.6 NAME 'caseIgnoreSubstringMatch-fr-SN' DESC 'fr-SN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.163.1 NAME 'caseIgnoreOrderingMatch-fr-TD' DESC 'fr-TD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.163.1.6 NAME 'caseIgnoreSubstringMatch-fr-TD' DESC 'fr-TD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.164.1 NAME 'caseIgnoreOrderingMatch-fr-TG' DESC 'fr-TG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.164.1.6 NAME 'caseIgnoreSubstringMatch-fr-TG' DESC 'fr-TG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.165.1 NAME 'caseIgnoreOrderingMatch-ga' DESC 'ga' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.165.1.6 NAME 'caseIgnoreSubstringMatch-ga' DESC 'ga' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.166.1 NAME 'caseIgnoreOrderingMatch-ga-IE' DESC 'ga-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.166.1.6 NAME 'caseIgnoreSubstringMatch-ga-IE' DESC 'ga-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.167.1 NAME 'caseIgnoreOrderingMatch-ga-IN' DESC 'ga-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.167.1.6 NAME 'caseIgnoreSubstringMatch-ga-IN' DESC 'ga-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.168.1 NAME 'caseIgnoreOrderingMatch-ha' DESC 'ha' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.168.1.6 NAME 'caseIgnoreSubstringMatch-ha' DESC 'ha' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.169.1 NAME 'caseIgnoreOrderingMatch-ha-Latn' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.169.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.170.1 NAME 'caseIgnoreOrderingMatch-ha-Latn-GH' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.170.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn-GH' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.171.1 NAME 'caseIgnoreOrderingMatch-ha-Latn-NE' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.171.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn-NE' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.172.1 NAME 'caseIgnoreOrderingMatch-ha-Latn-NG' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.172.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn-NG' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.173.1 NAME 'caseIgnoreOrderingMatch-he' DESC 'he' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.173.1.6 NAME 'caseIgnoreSubstringMatch-he' DESC 'he' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.174.1 NAME 'caseIgnoreOrderingMatch-hi' DESC 'hi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.174.1.6 NAME 'caseIgnoreSubstringMatch-hi' DESC 'hi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.175.1 NAME 'caseIgnoreOrderingMatch-hy' DESC 'hy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.175.1.6 NAME 'caseIgnoreSubstringMatch-hy' DESC 'hy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.176.1 NAME 'caseIgnoreOrderingMatch-id-ID' DESC 'id' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.176.1.6 NAME 'caseIgnoreSubstringMatch-id-ID' DESC 'id' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.177.1 NAME 'caseIgnoreOrderingMatch-ig-NG' DESC 'id-ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.177.1.6 NAME 'caseIgnoreSubstringMatch-ig-NG' DESC 'id-ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.178.1 NAME 'caseIgnoreOrderingMatch-it-IT' DESC 'it-IT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.178.1.6 NAME 'caseIgnoreSubstringMatch-it-IT' DESC 'it-IT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.179.1 NAME 'caseIgnoreOrderingMatch-ka' DESC 'ka' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.179.1.6 NAME 'caseIgnoreSubstringMatch-ka' DESC 'ka' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.180.1 NAME 'caseIgnoreOrderingMatch-ka-GE' DESC 'ka-GE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.180.1.6 NAME 'caseIgnoreSubstringMatch-ka-GE' DESC 'ka-GE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.181.1 NAME 'caseIgnoreOrderingMatch-kk' DESC 'kk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.181.1.6 NAME 'caseIgnoreSubstringMatch-kk' DESC 'kk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.182.1 NAME 'caseIgnoreOrderingMatch-kl' DESC 'kl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.182.1.6 NAME 'caseIgnoreSubstringMatch-kl' DESC 'kl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.183.1 NAME 'caseIgnoreOrderingMatch-kn' DESC 'kn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.183.1.6 NAME 'caseIgnoreSubstringMatch-kn' DESC 'kn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.184.1 NAME 'caseIgnoreOrderingMatch-kok' DESC 'kok' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.184.1.6 NAME 'caseIgnoreSubstringMatch-kok' DESC 'kok' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.185.1 NAME 'caseIgnoreOrderingMatch-ml' DESC 'ml' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.185.1.6 NAME 'caseIgnoreSubstringMatch-ml' DESC 'ml' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.186.1 NAME 'caseIgnoreOrderingMatch-ms' DESC 'ms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.186.1.6 NAME 'caseIgnoreSubstringMatch-ms' DESC 'ms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.187.1 NAME 'caseIgnoreOrderingMatch-ms-BN' DESC 'ms-BN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.187.1.6 NAME 'caseIgnoreSubstringMatch-ms-BN' DESC 'ms-BN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.188.1 NAME 'caseIgnoreOrderingMatch-ms-MY' DESC 'ms-MY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.188.1.6 NAME 'caseIgnoreSubstringMatch-ms-MY' DESC 'ms-MY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.189.1 NAME 'caseIgnoreOrderingMatch-mt' DESC 'mt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.189.1.6 NAME 'caseIgnoreSubstringMatch-mt' DESC 'mt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.190.1 NAME 'caseIgnoreOrderingMatch-nl-NL' DESC 'nl-NL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.190.1.6 NAME 'caseIgnoreSubstringMatch-nl-NL' DESC 'nl-NL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.191.1 NAME 'caseIgnoreOrderingMatch-nn' DESC 'nn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.191.1.6 NAME 'caseIgnoreSubstringMatch-nn' DESC 'nn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.192.1 NAME 'caseIgnoreOrderingMatch-om' DESC 'om' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.192.1.6 NAME 'caseIgnoreSubstringMatch-om' DESC 'om' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.193.1 NAME 'caseIgnoreOrderingMatch-om-ET' DESC 'om-ET' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.193.1.6 NAME 'caseIgnoreSubstringMatch-om-ET' DESC 'om-ET' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.194.1 NAME 'caseIgnoreOrderingMatch-om-KE' DESC 'om-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.194.1.6 NAME 'caseIgnoreSubstringMatch-om-KE' DESC 'om-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.195.1 NAME 'caseIgnoreOrderingMatch-or' DESC 'or' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.195.1.6 NAME 'caseIgnoreSubstringMatch-or' DESC 'or' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.196.1 NAME 'caseIgnoreOrderingMatch-pa' DESC 'pa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.196.1.6 NAME 'caseIgnoreSubstringMatch-pa' DESC 'pa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.197.1 NAME 'caseIgnoreOrderingMatch-pa-Arab' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.197.1.6 NAME 'caseIgnoreSubstringMatch-pa-Arab' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.198.1 NAME 'caseIgnoreOrderingMatch-pa-Arab-PK' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.198.1.6 NAME 'caseIgnoreSubstringMatch-pa-Arab-PK' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.199.1 NAME 'caseIgnoreOrderingMatch-pa-Guru' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.199.1.6 NAME 'caseIgnoreSubstringMatch-pa-Guru' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.200.1 NAME 'caseIgnoreOrderingMatch-pa-Guru-IN' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.200.1.6 NAME 'caseIgnoreSubstringMatch-pa-Guru-IN' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.201.1 NAME 'caseIgnoreOrderingMatch-ps' DESC 'ps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.201.1.6 NAME 'caseIgnoreSubstringMatch-ps' DESC 'ps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.202.1 NAME 'caseIgnoreOrderingMatch-pt' DESC 'pt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.202.1.6 NAME 'caseIgnoreSubstringMatch-pt' DESC 'pt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.203.1 NAME 'caseIgnoreOrderingMatch-pt-BR' DESC 'pt-BR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.203.1.6 NAME 'caseIgnoreSubstringMatch-pt-BR' DESC 'pt-BR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.204.1 NAME 'caseIgnoreOrderingMatch-pt-PT' DESC 'pt-PT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.204.1.6 NAME 'caseIgnoreSubstringMatch-pt-PT' DESC 'pt-PT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.205.1 NAME 'caseIgnoreOrderingMatch-ro-MD' DESC 'ro-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.205.1.6 NAME 'caseIgnoreSubstringMatch-ro-MD' DESC 'ro-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.206.1 NAME 'caseIgnoreOrderingMatch-ro-RO' DESC 'ro-RO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.206.1.6 NAME 'caseIgnoreSubstringMatch-ro-RO' DESC 'ro-RO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.207.1 NAME 'caseIgnoreOrderingMatch-ru-MD' DESC 'ru-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.207.1.6 NAME 'caseIgnoreSubstringMatch-ru-MD' DESC 'ru-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.208.1 NAME 'caseIgnoreOrderingMatch-ru-RU' DESC 'ru-RU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.208.1.6 NAME 'caseIgnoreSubstringMatch-ru-RU' DESC 'ru-RU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.209.1 NAME 'caseIgnoreOrderingMatch-ru-UA' DESC 'ru-UA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.209.1.6 NAME 'caseIgnoreSubstringMatch-ru-UA' DESC 'ru-UA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.210.1 NAME 'caseIgnoreOrderingMatch-si' DESC 'si' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.210.1.6 NAME 'caseIgnoreSubstringMatch-si' DESC 'si' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.211.1 NAME 'caseIgnoreOrderingMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.211.1.6 NAME 'caseIgnoreSubstringMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.212.1 NAME 'caseIgnoreOrderingMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.212.1.6 NAME 'caseIgnoreSubstringMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.213.1 NAME 'caseIgnoreOrderingMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.213.1.6 NAME 'caseIgnoreSubstringMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.214.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.214.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.215.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl-BA' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.215.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl-BA' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.216.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl-ME' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.216.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl-ME' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.217.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl-RS' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.217.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl-RS' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.218.1 NAME 'caseIgnoreOrderingMatch-sr-Latn' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.218.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.219.1 NAME 'caseIgnoreOrderingMatch-sr-Latn-BA' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.219.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn-BA' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.220.1 NAME 'caseIgnoreOrderingMatch-sr-Latn-ME' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.220.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn-ME' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.221.1 NAME 'caseIgnoreOrderingMatch-sr-Latn-RS' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.221.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn-RS' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.222.1 NAME 'caseIgnoreOrderingMatch-sv-FI' DESC 'sv-FI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.222.1.6 NAME 'caseIgnoreSubstringMatch-sv-FI' DESC 'sv-FI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.223.1 NAME 'caseIgnoreOrderingMatch-sv-SE' DESC 'sv-SE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.223.1.6 NAME 'caseIgnoreSubstringMatch-sv-SE' DESC 'sv-SE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.224.1 NAME 'caseIgnoreOrderingMatch-sw' DESC 'sw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.224.1.6 NAME 'caseIgnoreSubstringMatch-sw' DESC 'sw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.225.1 NAME 'caseIgnoreOrderingMatch-sw-KE' DESC 'sw-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.225.1.6 NAME 'caseIgnoreSubstringMatch-sw-KE' DESC 'sw-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.226.1 NAME 'caseIgnoreOrderingMatch-sw-TZ' DESC 'sw-TZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.226.1.6 NAME 'caseIgnoreSubstringMatch-sw-TZ' DESC 'sw-TZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.227.1 NAME 'caseIgnoreOrderingMatch-ta' DESC 'ta' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.227.1.6 NAME 'caseIgnoreSubstringMatch-ta' DESC 'ta' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.228.1 NAME 'caseIgnoreOrderingMatch-ta-IN' DESC 'ta-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.228.1.6 NAME 'caseIgnoreSubstringMatch-ta-IN' DESC 'ta-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.229.1 NAME 'caseIgnoreOrderingMatch-ta-LK' DESC 'ta-LK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.229.1.6 NAME 'caseIgnoreSubstringMatch-ta-LK' DESC 'ta-LK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.230.1 NAME 'caseIgnoreOrderingMatch-te' DESC 'te' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.230.1.6 NAME 'caseIgnoreSubstringMatch-te' DESC 'te' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.231.1 NAME 'caseIgnoreOrderingMatch-th' DESC 'th' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.231.1.6 NAME 'caseIgnoreSubstringMatch-th' DESC 'th' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.232.1 NAME 'caseIgnoreOrderingMatch-ur' DESC 'ur' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.232.1.6 NAME 'caseIgnoreSubstringMatch-ur' DESC 'ur' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.233.1 NAME 'caseIgnoreOrderingMatch-ur-IN' DESC 'ur-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.233.1.6 NAME 'caseIgnoreSubstringMatch-ur-IN' DESC 'ur-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.234.1 NAME 'caseIgnoreOrderingMatch-ur-PK' DESC 'ur-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.234.1.6 NAME 'caseIgnoreSubstringMatch-ur-PK' DESC 'ur-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.235.1 NAME 'caseIgnoreOrderingMatch-vi' DESC 'vi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.235.1.6 NAME 'caseIgnoreSubstringMatch-vi' DESC 'vi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.236.1 NAME 'caseIgnoreOrderingMatch-yo' DESC 'yo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.236.1.6 NAME 'caseIgnoreSubstringMatch-yo' DESC 'yo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.237.1 NAME 'caseIgnoreOrderingMatch-zh-Hans' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.237.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hans' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.238.1 NAME 'caseIgnoreOrderingMatch-zh-Hans-CN' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.238.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hans-CN' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.239.1 NAME 'caseIgnoreOrderingMatch-zh-Hans-SG' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.239.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hans-SG' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.240.1 NAME 'caseIgnoreOrderingMatch-zh-Hant-HK' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.240.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hant-HK' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.241.1 NAME 'caseIgnoreOrderingMatch-zh-Hant-MO' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.241.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hant-MO' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.242.1 NAME 'caseIgnoreOrderingMatch-zh-Hant-TW' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.242.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hant-TW' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.243.1 NAME 'caseIgnoreOrderingMatch-zu' DESC 'zu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.243.1.6 NAME 'caseIgnoreSubstringMatch-zu' DESC 'zu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.244.1 NAME 'caseIgnoreOrderingMatch-zu-ZA' DESC 'zu-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.244.1.6 NAME 'caseIgnoreSubstringMatch-zu-ZA' DESC 'zu-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.0.3 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.0.3.6 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.3 NAME 'caseExactOrderingMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.3.6 NAME 'caseExactSubstringMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.23 NAME 'uniqueMemberMatch' DESC 'The uniqueMemberMatch rule compares an assertion value of the Name And Optional UID syntax to an attribute value of a syntax (e.g., the Name And Optional UID syntax) whose corresponding ASN.1 type is NameAndOptionalUID. The rule evaluates to TRUE if and only if the components of the assertion value and attribute value match according to the distinguishedNameMatch rule and either, (1) the component is absent from both the attribute value and assertion value, or (2) the component is present in both the attribute value and the assertion value and the component of the assertion value matches the component of the attribute value according to the bitStringMatch rule. Note that this matching rule has been altered from its description in X.520 [X.520] in order to make the matching rule commutative. Server implementors should consider using the original X.520 semantics (where the matching was less exact) for approximate matching of attributes with uniqueMemberMatch as the equality matching rule.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", + "( 2.5.13.8 NAME 'numericStringMatch' DESC 'The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.9 NAME 'numericStringOrderingMatch' DESC 'The rule evaluates to TRUE if and only if, in the code point collation order, the prepared attribute value character string appears earlier than the prepared assertion value character string; i.e., the attribute value is less than the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.10 NAME 'numericStringSubstringsMatch' DESC 'The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value, (2) an initial substring, if present, matches the beginning of the prepared attribute value character string, and (3) a final substring, if present, matches the end of the prepared attribute value character string.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.20 NAME 'telephoneNumberMatch' DESC 'The telephoneNumberMatch rule compares an assertion value of the Telephone Number syntax to an attribute value of a syntax (e.g., the Telephone Number syntax) whose corresponding ASN.1 type is a PrintableString representing a telephone number. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only telephoneNumber Insignificant Character Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' DESC 'The telephoneNumberSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Telephone Number syntax) whose corresponding ASN.1 type is a PrintableString representing a telephone number. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are case folded in the Map preparation step, and only telephoneNumber Insignificant Character Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )" + ], + "objectClass": [ + "top", + "ldapSubentry", + "subschema" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'top' ABSTRACT MUST objectClass X-ORIGIN 'RFC 4512' )", + "( 2.5.6.1 NAME 'alias' SUP top STRUCTURAL MUST aliasedObjectName X-ORIGIN 'RFC 4512' )", + "( 2.5.20.1 NAME 'subschema' AUXILIARY MAY ( dITStructureRules $ nameForms $ dITContentRules $ objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' SUP top AUXILIARY X-ORIGIN 'RFC 4512' )", + "( 2.5.6.11 NAME 'applicationProcess' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.2 NAME 'country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) X-ORIGIN 'RFC 4519' )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' SUP top AUXILIARY MUST dc X-ORIGIN 'RFC 4519' )", + "( 2.5.6.14 NAME 'device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.9 NAME 'groupOfNames' SUP top STRUCTURAL MUST cn MAY ( member $ businessCategory $ seeAlso $ owner $ ou $ o $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.17 NAME 'groupOfUniqueNames' SUP top STRUCTURAL MUST cn MAY ( uniqueMember $ businessCategory $ seeAlso $ owner $ ou $ o $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.3 NAME 'locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.4 NAME 'organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.6 NAME 'person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.8 NAME 'organizationalRole' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationalISDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP top STRUCTURAL MUST ou MAY ( businessCategory $ description $ destinationIndicator $ facsimileTelephoneNumber $ internationalISDNNumber $ l $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ preferredDeliveryMethod $ registeredAddress $ searchGuide $ seeAlso $ st $ street $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ userPassword $ x121Address ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.10 NAME 'residentialPerson' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) X-ORIGIN 'RFC 4519' )", + "( 1.3.6.1.1.3.1 NAME 'uidObject' SUP top AUXILIARY MUST uid X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113719.2.142.6.1.1 NAME 'ldapSubEntry' DESC 'LDAP Subentry class, version 1' SUP top STRUCTURAL MAY cn X-ORIGIN 'LDAP Subentry Internet Draft' )", + "( 2.16.840.1.113730.3.2.40 NAME 'directoryServerFeature' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( oid $ cn $ multiLineDescription ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.41 NAME 'nsslapdPlugin' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsslapd-pluginPath $ nsslapd-pluginInitfunc $ nsslapd-pluginType $ nsslapd-pluginId $ nsslapd-pluginVersion $ nsslapd-pluginVendor $ nsslapd-pluginDescription $ nsslapd-pluginEnabled ) MAY ( nsslapd-pluginConfigArea $ nsslapd-plugin-depends-on-type ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.44 NAME 'nsIndex' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsSystemIndex ) MAY ( description $ nsIndexType $ nsMatchingRule $ nsIndexIDListScanLimit ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.109 NAME 'nsBackendInstance' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.110 NAME 'nsMappingTree' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.104 NAME 'nsContainer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.108 NAME 'nsDS5Replica' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( nsDS5ReplicaRoot $ nsDS5ReplicaId ) MAY ( cn $ nsds5ReplicaPreciseTombstonePurging $ nsds5ReplicaCleanRUV $ nsds5ReplicaAbortCleanRUV $ nsDS5ReplicaType $ nsDS5ReplicaBindDN $ nsState $ nsDS5ReplicaName $ nsDS5Flags $ nsDS5Task $ nsDS5ReplicaReferral $ nsDS5ReplicaAutoReferral $ nsds5ReplicaPurgeDelay $ nsds5ReplicaTombstonePurgeInterval $ nsds5ReplicaChangeCount $ nsds5ReplicaLegacyConsumer $ nsds5ReplicaProtocolTimeout $ nsds5ReplicaBackoffMin $ nsds5ReplicaBackoffMax ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.113 NAME 'nsTombstone' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( nstombstonecsn $ nsParentUniqueId $ nscpEntryDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.103 NAME 'nsDS5ReplicationAgreement' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsds5ReplicaCleanRUVNotified $ nsDS5ReplicaHost $ nsDS5ReplicaPort $ nsDS5ReplicaTransportInfo $ nsDS5ReplicaBindDN $ nsDS5ReplicaCredentials $ nsDS5ReplicaBindMethod $ nsDS5ReplicaRoot $ nsDS5ReplicatedAttributeList $ nsDS5ReplicatedAttributeListTotal $ nsDS5ReplicaUpdateSchedule $ nsds5BeginReplicaRefresh $ description $ nsds50ruv $ nsruvReplicaLastModified $ nsds5replicaTimeout $ nsds5replicaChangesSentSinceStartup $ nsds5replicaLastUpdateEnd $ nsds5replicaLastUpdateStart $ nsds5replicaLastUpdateStatus $ nsds5replicaUpdateInProgress $ nsds5replicaLastInitEnd $ nsds5ReplicaEnabled $ nsds5replicaLastInitStart $ nsds5replicaLastInitStatus $ nsds5debugreplicatimeout $ nsds5replicaBusyWaitTime $ nsds5ReplicaStripAttrs $ nsds5replicaSessionPauseTime $ nsds5ReplicaProtocolTimeout ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.39 NAME 'nsslapdConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.317 NAME 'nsSaslMapping' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsSaslMapRegexString $ nsSaslMapBaseDNTemplate $ nsSaslMapFilterTemplate ) MAY nsSaslMapPriority X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.43 NAME 'nsSNMP' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsSNMPEnabled ) MAY ( nsSNMPOrganization $ nsSNMPLocation $ nsSNMPContact $ nsSNMPDescription $ nsSNMPName $ nsSNMPMasterHost $ nsSNMPMasterPort ) X-ORIGIN 'Netscape Directory Server' )", + "( nsEncryptionConfig-oid NAME 'nsEncryptionConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsCertfile $ nsKeyfile $ nsSSL2 $ nsSSL3 $ nsTLS1 $ sslVersionMin $ sslVersionMax $ nsSSLSessionTimeout $ nsSSL3SessionTimeout $ nsSSLClientAuth $ nsSSL2Ciphers $ nsSSL3Ciphers $ nsSSLSupportedCiphers ) X-ORIGIN 'Netscape' )", + "( nsEncryptionModule-oid NAME 'nsEncryptionModule' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsSSLToken $ nsSSLPersonalitySSL $ nsSSLActivation ) X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.2.327 NAME 'rootDNPluginConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( rootdn-open-time $ rootdn-close-time $ rootdn-days-allowed $ rootdn-allow-host $ rootdn-deny-host $ rootdn-allow-ip $ rootdn-deny-ip ) X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.2.328 NAME 'nsSchemaPolicy' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( cn $ schemaUpdateObjectclassAccept $ schemaUpdateObjectclassReject $ schemaUpdateAttributeAccept $ schemaUpdateAttributeReject ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.31 NAME 'groupOfCertificates' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( memberCertificateDescription $ businessCategory $ description $ o $ ou $ owner $ seeAlso ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.33 NAME 'groupOfURLs' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( memberURL $ businessCategory $ description $ o $ ou $ owner $ seeAlso ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.35 NAME 'LDAPServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ l $ ou $ seeAlso $ generation $ changeLogMaximumAge $ changeLogMaximumSize ) X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.250.3.18 NAME 'cacheObject' DESC 'object that contains the TTL (time to live) attribute type' SUP top STRUCTURAL MAY ttl X-ORIGIN 'LDAP Caching Internet Draft' )", + "( 2.16.840.1.113730.3.2.10 NAME 'netscapeServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ serverRoot $ serverProductName $ serverVersionNumber $ installationTimeStamp $ administratorContactInfo $ userPassword $ adminUrl $ serverHostName ) X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.2.7 NAME 'nsLicenseUser' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( nsLicensedFor $ nsLicenseStartTime $ nsLicenseEndTime ) X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.2.1 NAME 'changeLogEntry' DESC 'LDAP changelog objectclass' SUP top STRUCTURAL MUST ( targetDn $ changeTime $ changeNumber $ changeType ) MAY ( changes $ newRdn $ deleteOldRdn $ newSuperior ) X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'LDAP referrals objectclass' SUP top STRUCTURAL MAY ref X-ORIGIN 'LDAPv3 referrals Internet Draft' )", + "( 2.16.840.1.113730.3.2.12 NAME 'passwordObject' DESC 'Netscape defined password policy objectclass' SUP top STRUCTURAL MAY ( pwdpolicysubentry $ passwordExpirationTime $ passwordExpWarned $ passwordRetryCount $ retryCountResetTime $ accountUnlockTime $ passwordHistory $ passwordAllowChangeTime $ passwordGraceUserTime ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.13 NAME 'passwordPolicy' DESC 'Netscape defined password policy objectclass' SUP top STRUCTURAL MAY ( passwordMaxAge $ passwordExp $ passwordMinLength $ passwordKeepHistory $ passwordInHistory $ passwordChange $ passwordWarning $ passwordLockout $ passwordMaxFailure $ passwordResetDuration $ passwordUnlock $ passwordLockoutDuration $ passwordCheckSyntax $ passwordMustChange $ passwordStorageScheme $ passwordMinAge $ passwordResetFailureCount $ passwordGraceLimit $ passwordMinDigits $ passwordMinAlphas $ passwordMinUppers $ passwordMinLowers $ passwordMinSpecials $ passwordMin8bit $ passwordMaxRepeats $ passwordMinCategories $ passwordMinTokenLength $ passwordTrackUpdateTime $ passwordAdminDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.30 NAME 'glue' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.32 NAME 'netscapeMachineData' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.38 NAME 'vlvSearch' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ vlvBase $ vlvScope $ vlvFilter ) MAY multiLineDescription X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.42 NAME 'vlvIndex' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ vlvSort ) MAY ( vlvEnabled $ vlvUses ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.84 NAME 'cosDefinition' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( costargettree $ costemplatedn $ cosspecifier $ cosAttribute $ aci $ cn $ uid ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.93 NAME 'nsRoleDefinition' DESC 'Netscape defined objectclass' SUP ldapSubEntry STRUCTURAL MAY ( description $ nsRoleScopeDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.94 NAME 'nsSimpleRoleDefinition' DESC 'Netscape defined objectclass' SUP nsRoleDefinition STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.95 NAME 'nsComplexRoleDefinition' DESC 'Netscape defined objectclass' SUP nsRoleDefinition STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.96 NAME 'nsManagedRoleDefinition' DESC 'Netscape defined objectclass' SUP nsSimpleRoleDefinition STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.97 NAME 'nsFilteredRoleDefinition' DESC 'Netscape defined objectclass' SUP nsComplexRoleDefinition STRUCTURAL MUST nsRoleFilter X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.98 NAME 'nsNestedRoleDefinition' DESC 'Netscape defined objectclass' SUP nsComplexRoleDefinition STRUCTURAL MUST nsRoleDN X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.99 NAME 'cosSuperDefinition' DESC 'Netscape defined objectclass' SUP ldapSubEntry STRUCTURAL MUST cosAttribute MAY description X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.100 NAME 'cosClassicDefinition' DESC 'Netscape defined objectclass' SUP cosSuperDefinition STRUCTURAL MAY ( costemplatedn $ cosspecifier ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.101 NAME 'cosPointerDefinition' DESC 'Netscape defined objectclass' SUP cosSuperDefinition STRUCTURAL MAY costemplatedn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.102 NAME 'cosIndirectDefinition' DESC 'Netscape defined objectclass' SUP cosSuperDefinition STRUCTURAL MAY cosIndirectSpecifier X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.503 NAME 'nsDSWindowsReplicationAgreement' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsDS5ReplicaHost $ nsDS5ReplicaPort $ nsDS5ReplicaTransportInfo $ nsDS5ReplicaBindDN $ nsDS5ReplicaCredentials $ nsDS5ReplicaBindMethod $ nsDS5ReplicaRoot $ nsDS5ReplicatedAttributeList $ nsDS5ReplicaUpdateSchedule $ nsds5BeginReplicaRefresh $ description $ nsds50ruv $ nsruvReplicaLastModified $ nsds5replicaTimeout $ nsds5replicaChangesSentSinceStartup $ nsds5replicaLastUpdateEnd $ nsds5replicaLastUpdateStart $ nsds5replicaLastUpdateStatus $ nsds5replicaUpdateInProgress $ nsds5replicaLastInitEnd $ nsds5replicaLastInitStart $ nsds5replicaLastInitStatus $ nsds5debugreplicatimeout $ nsds5replicaBusyWaitTime $ nsds5replicaSessionPauseTime $ nsds7WindowsReplicaSubtree $ nsds7DirectoryReplicaSubtree $ nsds7NewWinUserSyncEnabled $ nsds7NewWinGroupSyncEnabled $ nsds7WindowsDomain $ nsds7DirsyncCookie $ winSyncInterval $ oneWaySync $ winSyncMoveAction $ nsds5ReplicaEnabled $ winSyncDirectoryFilter $ winSyncWindowsFilter $ winSyncSubtreePair ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.128 NAME 'costemplate' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( cn $ cosPriority ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.304 NAME 'nsView' DESC 'Netscape defined objectclass' SUP top AUXILIARY MAY ( nsViewFilter $ description ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.316 NAME 'nsAttributeEncryption' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsEncryptionAlgorithm ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.6.21 NAME 'pkiUser' DESC 'X.509 PKI User' SUP top AUXILIARY MAY userCertificate X-ORIGIN 'RFC 4523' )", + "( 2.5.6.22 NAME 'pkiCA' DESC 'X.509 PKI Certificate Authority' SUP top AUXILIARY MAY ( cACertificate $ certificateRevocationList $ authorityRevocationList $ crossCertificatePair ) X-ORIGIN 'RFC 4523' )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' DESC 'X.509 CRL distribution point' SUP top STRUCTURAL MUST cn MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) X-ORIGIN 'RFC 4523' )", + "( 2.5.6.23 NAME 'deltaCRL' DESC 'X.509 delta CRL' SUP top AUXILIARY MAY deltaRevocationList X-ORIGIN 'RFC 4523' )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'X.521 strong authentication user' SUP top AUXILIARY MUST userCertificate X-ORIGIN 'RFC 4523' )", + "( 2.5.6.18 NAME 'userSecurityInformation' DESC 'X.521 user security information' SUP top AUXILIARY MAY supportedAlgorithms X-ORIGIN 'RFC 4523' )", + "( 2.5.6.16 NAME 'certificationAuthority' DESC 'X.509 certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair X-ORIGIN 'RFC 4523' )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' DESC 'X.509 certificate authority, version 2' SUP certificationAuthority AUXILIARY MAY deltaRevocationList X-ORIGIN 'RFC 4523' )", + "( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST uid MAY ( description $ seeAlso $ l $ o $ ou $ host ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( cn $ description $ seeAlso $ l $ o $ ou $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST cn MAY ( description $ l $ o $ ou $ seeAlso $ telephoneNumber ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST dc MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description $ o $ associatedName ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' SUP top AUXILIARY MUST associatedDomain X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST co X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.14 NAME 'rFC822localPart' SUP domain STRUCTURAL MAY ( cn $ sn ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST cn MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' SUP top AUXILIARY MUST userPassword X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500UniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.2.322 NAME 'autoMemberDefinition' DESC 'Auto Membership Config Definition Entry' SUP top STRUCTURAL MUST ( cn $ autoMemberScope $ autoMemberFilter $ autoMemberGroupingAttr ) MAY ( autoMemberDefaultGroup $ autoMemberDisabled ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.323 NAME 'autoMemberRegexRule' DESC 'Auto Membership Regex Rule Entry' SUP top STRUCTURAL MUST ( cn $ autoMemberTargetGroup ) MAY ( autoMemberExclusiveRegex $ autoMemberInclusiveRegex $ description ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.324 NAME 'dnaPluginConfig' DESC 'DNA plugin configuration' SUP top AUXILIARY MAY ( dnaType $ dnaPrefix $ dnaNextValue $ dnaMaxValue $ dnaInterval $ dnaMagicRegen $ dnaFilter $ dnaScope $ dnaSharedCfgDN $ dnaThreshold $ dnaNextRange $ dnaRangeRequestTimeout $ dnaRemoteBindDN $ dnaRemoteBindCred $ cn ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.325 NAME 'dnaSharedConfig' DESC 'DNA Shared Configuration' SUP top AUXILIARY MAY ( dnaHostname $ dnaPortNum $ dnaSecurePortNum $ dnaRemoteBindMethod $ dnaRemoteConnProtocol $ dnaRemainingValues ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.319 NAME 'mepManagedEntry' DESC 'Managed Entries Managed Entry' SUP top AUXILIARY MAY mepManagedBy X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.320 NAME 'mepOriginEntry' DESC 'Managed Entries Origin Entry' SUP top AUXILIARY MAY mepManagedEntry X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.321 NAME 'mepTemplateEntry' DESC 'Managed Entries Template Entry' SUP top AUXILIARY MAY ( cn $ mepStaticAttr $ mepMappedAttr $ mepRDNAttr ) X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST uid MAY ( userPassword $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST ( ipHostNumber $ cn ) MAY ( manager $ description $ l $ o $ ou $ owner $ seeAlso $ serialNumber ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( ipNetworkNumber $ cn ) MAY ( ipNetmaskNumber $ manager $ l $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST cn MAY ( macAddress $ description $ l $ o $ ou $ owner $ seeAlso $ serialNumber ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST cn MAY ( bootFile $ bootParameter $ description $ l $ o $ ou $ owner $ seeAlso $ serialNumber ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.13 NAME 'nisMap' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST nisMapName MAY description X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.2.129 NAME 'inetDomain' DESC 'Auxiliary class for virtual domain nodes' SUP top AUXILIARY MAY ( inetDomainBaseDN $ inetDomainStatus ) X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.2.130 NAME 'inetUser' DESC 'Auxiliary class which must be present in an entry for delivery of subscriber services' SUP top AUXILIARY MAY ( uid $ inetUserStatus $ inetUserHttpURL $ userPassword $ memberOf ) X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.6.1.4.1.1466.101.120.141 NAME 'NetscapeLinkedOrganization' AUXILIARY MAY parentOrganization X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.1466.101.120.142 NAME 'NetscapePreferences' AUXILIARY MAY ( preferredLanguage $ preferredLocale $ preferredTimeZone ) X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.2.134 NAME 'inetSubscriber' SUP top AUXILIARY MAY ( inetSubscriberAccountId $ inetSubscriberChallenge $ inetSubscriberResponse ) X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.2.112 NAME 'inetAdmin' DESC 'Marker for an administrative group or user' SUP top AUXILIARY MAY ( aci $ memberOf $ adminRole ) X-ORIGIN 'Netscape Delegated Administrator' )", + "( 1.3.6.1.4.1.42.2.27.4.2.1 NAME 'javaContainer' DESC 'Container for a Java object' SUP top STRUCTURAL MUST cn X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.4 NAME 'javaObject' DESC 'Java object representation' SUP top ABSTRACT MUST javaClassName MAY ( javaClassNames $ javaCodebase $ javaDoc $ description ) X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.5 NAME 'javaSerializedObject' DESC 'Java serialized object' SUP javaObject AUXILIARY MUST javaSerializedData X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.7 NAME 'javaNamingReference' DESC 'JNDI reference' SUP javaObject AUXILIARY MAY ( javaReferenceAddress $ javaFactory ) X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.8 NAME 'javaMarshalledObject' DESC 'Java marshalled object' SUP javaObject AUXILIARY MUST javaSerializedData X-ORIGIN 'RFC 2713' )", + "( 0.9.2342.19200300.100.4.3 NAME 'pilotObject' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MAY ( audio $ ditRedirect $ info $ jpegPhoto $ lastModifiedBy $ lastModifiedTime $ manager $ photo $ uniqueIdentifier ) X-ORIGIN 'RFC 1274' )", + "( nsAdminDomain-oid NAME 'nsAdminDomain' DESC 'Netscape defined objectclass' SUP organizationalUnit STRUCTURAL MAY nsAdminDomainName X-ORIGIN 'Netscape' )", + "( nsHost-oid NAME 'nsHost' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( serverHostName $ description $ l $ nsHostLocation $ nsHardwarePlatform $ nsOsVersion ) X-ORIGIN 'Netscape' )", + "( nsAdminGroup-oid NAME 'nsAdminGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsAdminGroupName $ description $ nsConfigRoot $ nsAdminSIEDN ) X-ORIGIN 'Netscape' )", + "( nsApplication-oid NAME 'nsApplication' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsVendor $ description $ nsProductName $ nsNickName $ nsProductVersion $ nsBuildNumber $ nsRevisionNumber $ nsSerialNumber $ nsInstalledLocation $ installationTimeStamp $ nsExpirationDate $ nsBuildSecurity $ nsLdapSchemaVersion $ nsServerMigrationClassname $ nsServerCreationClassname ) X-ORIGIN 'Netscape' )", + "( nsResourceRef-oid NAME 'nsResourceRef' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY seeAlso X-ORIGIN 'Netscape' )", + "( nsTask-oid NAME 'nsTask' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsTaskLabel $ nsHelpRef $ nsExecRef $ nsLogSuppress ) X-ORIGIN 'Netscape' )", + "( nsTaskGroup-oid NAME 'nsTaskGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY nsTaskLabel X-ORIGIN 'Netscape' )", + "( nsAdminObject-oid NAME 'nsAdminObject' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsJarfilename $ nsClassname ) X-ORIGIN 'Netscape' )", + "( nsConfig-oid NAME 'nsConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ nsServerPort $ nsServerAddress $ nsSuiteSpotUser $ nsErrorLog $ nsPidLog $ nsAccessLog $ nsDefaultAcceptLanguage $ nsServerSecurity ) X-ORIGIN 'Netscape' )", + "( nsDirectoryInfo-oid NAME 'nsDirectoryInfo' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsBindDN $ nsBindPassword $ nsDirectoryURL $ nsDirectoryFailoverList $ nsDirectoryInfoRef ) X-ORIGIN 'Netscape' )", + "( nsAdminServer-oid NAME 'nsAdminServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsServerID ) MAY description X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminConfig-oid NAME 'nsAdminConfig' DESC 'Netscape defined objectclass' SUP nsConfig STRUCTURAL MAY ( nsAdminCgiWaitPid $ nsAdminUsers $ nsAdminAccessHosts $ nsAdminAccessAddresses $ nsAdminOneACLDir $ nsAdminEnableDSGW $ nsAdminEnableEnduser $ nsAdminCacheLifetime ) X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminResourceEditorExtension-oid NAME 'nsAdminResourceEditorExtension' DESC 'Netscape defined objectclass' SUP nsAdminObject STRUCTURAL MAY ( nsAdminAccountInfo $ nsDeleteclassname ) X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminGlobalParameters-oid NAME 'nsAdminGlobalParameters' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsAdminEndUserHTMLIndex $ nsNickName ) X-ORIGIN 'Netscape Administration Services' )", + "( nsGlobalParameters-oid NAME 'nsGlobalParameters' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsUniqueAttribute $ nsUserIDFormat $ nsUserRDNComponent $ nsGroupRDNComponent $ nsWellKnownJarfiles $ nsNYR ) X-ORIGIN 'Netscape Administration Services' )", + "( nsDefaultObjectClasses-oid NAME 'nsDefaultObjectClasses' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY nsDefaultObjectClass X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminConsoleUser-oid NAME 'nsAdminConsoleUser' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY nsPreference X-ORIGIN 'Netscape Administration Services' )", + "( nsCustomView-oid NAME 'nsCustomView' DESC 'Netscape defined objectclass' SUP nsAdminObject STRUCTURAL MAY nsDisplayName X-ORIGIN 'Netscape Administration Services' )", + "( nsTopologyCustomView-oid NAME 'nsTopologyCustomView' DESC 'Netscape defined objectclass' SUP nsCustomView STRUCTURAL MAY nsViewConfiguration X-ORIGIN 'Netscape Administration Services' )", + "( nsTopologyPlugin-oid NAME 'nsTopologyPlugin' DESC 'Netscape defined objectclass' SUP nsAdminObject STRUCTURAL X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.2.18 NAME 'netscapeCertificateServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Certificate Management System' )", + "( nsCertificateServer-oid NAME 'nsCertificateServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST nsServerID MAY ( serverHostName $ nsServerPort $ nsCertConfig ) X-ORIGIN 'Netscape Certificate Management System' )", + "( 2.16.840.1.113730.3.2.23 NAME 'netscapeDirectoryServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( nsDirectoryServer-oid NAME 'nsDirectoryServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST nsServerID MAY ( serverHostName $ nsServerPort $ nsSecureServerPort $ nsBindPassword $ nsBindDN $ nsBaseDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.8 NAME 'ntUser' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ntUserDomainId MAY ( description $ l $ ou $ seeAlso $ ntUserPriv $ ntUserHomeDir $ ntUserComment $ ntUserFlags $ ntUserScriptPath $ ntUserAuthFlags $ ntUserUsrComment $ ntUserParms $ ntUserWorkstations $ ntUserLastLogon $ ntUserLastLogoff $ ntUserAcctExpires $ ntUserMaxStorage $ ntUserUnitsPerWeek $ ntUserLogonHours $ ntUserBadPwCount $ ntUserNumLogons $ ntUserLogonServer $ ntUserCountryCode $ ntUserCodePage $ ntUserUniqueId $ ntUserPrimaryGroupId $ ntUserProfile $ ntUserHomeDirDrive $ ntUserPasswordExpired $ ntUserCreateNewAccount $ ntUserDeleteAccount $ ntUniqueId ) X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.2.9 NAME 'ntGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ntUserDomainId MAY ( description $ l $ ou $ seeAlso $ ntGroupId $ ntGroupAttributes $ ntGroupCreateNewGroup $ ntGroupDeleteGroup $ ntGroupType $ ntUniqueId $ mail ) X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.2.82 NAME 'nsChangelog4Config' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.114 NAME 'nsConsumer4Config' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.36 NAME 'LDAPReplica' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ l $ ou $ seeAlso $ replicaRoot $ replicaHost $ replicaPort $ replicaBindDn $ replicaCredentials $ replicaBindMethod $ replicaUseSSL $ replicaUpdateSchedule $ replicaUpdateReplayed $ replicaUpdateFailedAt $ replicaBeginOrc $ replicaNickName $ replicaEntryFilter $ replicatedattributelist $ replicaCFUpdated $ replicaAbandonedChanges $ replicaLastRelevantChange ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.11 NAME 'cirReplicaSource' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( cirReplicaRoot $ cirHost $ cirPort $ cirBindDn $ cirUsePersistentSearch $ cirUseSsl $ cirBindCredentials $ cirLastUpdateApplied $ cirUpdateSchedule $ cirSyncInterval $ cirUpdateFailedat $ cirBeginORC $ replicaNickName $ replicaEntryFilter $ replicatedattributelist ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.3 NAME 'mailRecipient' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MAY ( cn $ mail $ mailAlternateAddress $ mailHost $ mailRoutingAddress $ mailAccessDomain $ mailAutoReplyMode $ mailAutoReplyText $ mailDeliveryOption $ mailForwardingAddress $ mailMessageStore $ mailProgramDeliveryInfo $ mailQuota $ multiLineDescription $ uid $ userPassword ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.113730.3.2.37 NAME 'nsMessagingServerUser' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MAY ( cn $ mailAccessDomain $ mailAutoReplyMode $ mailAutoReplyText $ mailDeliveryOption $ mailForwardingAddress $ mailMessageStore $ mailProgramDeliveryInfo $ mailQuota $ nsmsgDisallowAccess $ nsmsgNumMsgQuota $ nswmExtendedUserPrefs $ vacationstartdate $ vacationenddate ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.4 NAME 'mailGroup' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MAY ( cn $ mail $ mailAlternateAddress $ mailHost $ mailRoutingAddress $ mgrpAddHeader $ mgrpAllowedBroadcaster $ mgrpAllowedDomain $ mgrpApprovePassword $ mgrpBroadcasterPolicy $ mgrpDeliverTo $ mgrpErrorsTo $ mgrpModerator $ mgrpMsgMaxSize $ mgrpMsgRejectAction $ mgrpMsgRejectText $ mgrpNoDuplicateChecks $ mgrpRemoveHeader $ mgrpRFC822MailMember $ owner ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.5 NAME 'groupOfMailEnhancedUniqueNames' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MUST cn MAY ( businessCategory $ description $ mailEnhancedUniqueMember $ o $ ou $ owner $ seeAlso ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.24 NAME 'netscapeMailServer' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.45 NAME 'nsValueItem' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsValueCIS $ nsValueCES $ nsValueTel $ nsValueInt $ nsValueBin $ nsValueDN $ nsValueType $ nsValueSyntax $ nsValueDescription $ nsValueHelpURL $ nsValueFlags $ nsValueDefault ) X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.2.29 NAME 'netscapeWebServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsServerID ) MAY ( description $ nsServerPort ) X-ORIGIN 'Netscape Web Server' )", + "( 2.16.840.1.113730.3.2.154 NAME 'netscapeReversiblePasswordObject' DESC 'object that contains an netscapeReversiblePassword' AUXILIARY MAY netscapeReversiblePassword X-ORIGIN 'Netscape Web Server' )", + "( 1.3.6.1.4.1.11.1.3.2.2.1 NAME 'accountPolicy' DESC 'Account policy entry' SUP top AUXILIARY MAY accountInactivityLimit X-ORIGIN 'Account Policy Plugin' )", + "( 1.3.6.1.1.1.2.17 NAME 'automount' DESC 'An entry in an automounter map' SUP top STRUCTURAL MUST ( cn $ automountInformation ) MAY description X-ORIGIN 'draft-howard-rfc2307bis' )", + "( 1.3.6.1.1.1.2.16 NAME 'automountMap' DESC 'An group of related automount objects' SUP top STRUCTURAL MUST ou X-ORIGIN 'draft-howard-rfc2307bis' )", + "( 1.3.6.1.4.1.5923.1.1.2 NAME 'eduPerson' AUXILIARY MAY ( eduPersonAffiliation $ eduPersonNickName $ eduPersonOrgDN $ eduPersonOrgUnitDN $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonPrimaryOrgUnitDN $ eduPersonScopedAffiliation ) X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 1.3.6.1.4.1.13769.9.1 NAME 'mozillaAbPersonAlpha' SUP top AUXILIARY MUST cn MAY ( c $ description $ displayName $ facsimileTelephoneNumber $ givenName $ homePhone $ l $ mail $ mobile $ mozillaCustom1 $ mozillaCustom2 $ mozillaCustom3 $ mozillaCustom4 $ mozillaHomeCountryName $ mozillaHomeLocalityName $ mozillaHomePostalCode $ mozillaHomeState $ mozillaHomeStreet $ mozillaHomeStreet2 $ mozillaHomeUrl $ mozillaNickname $ mozillaSecondEmail $ mozillaUseHtmlMail $ mozillaWorkStreet2 $ mozillaWorkUrl $ nsAIMid $ o $ ou $ pager $ postalCode $ postOfficeBox $ sn $ st $ street $ telephoneNumber $ title ) X-ORIGIN 'Mozilla Address Book' )", + "( 1.3.6.1.4.1.5322.17.1.1 NAME 'authorizedServiceObject' DESC 'Auxiliary object class for adding authorizedService attribute' SUP top AUXILIARY MAY authorizedService X-ORIGIN 'NSS LDAP schema' )", + "( 1.3.6.1.4.1.5322.17.1.2 NAME 'hostObject' DESC 'Auxiliary object class for adding host attribute' SUP top AUXILIARY MAY host X-ORIGIN 'NSS LDAP schema' )", + "( 2.16.840.1.113730.3.2.318 NAME 'pamConfig' DESC 'PAM plugin configuration' SUP top AUXILIARY MAY ( cn $ pamMissingSuffix $ pamExcludeSuffix $ pamIncludeSuffix $ pamIDAttr $ pamIDMapMethod $ pamFallback $ pamSecure $ pamService $ pamFilter ) X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.2.326 NAME 'dynamicGroup' DESC 'Group containing internal dynamically-generated members' SUP posixGroup AUXILIARY MAY dsOnlyMemberUid X-ORIGIN 'Red Hat Directory Server' )", + "( 1.3.6.1.4.1.6981.11.2.3 NAME 'PureFTPdUser' DESC 'PureFTPd user with optional quota, throttling and ratio' STRUCTURAL MAY ( FTPStatus $ FTPQuotaFiles $ FTPQuotaMBytes $ FTPUploadRatio $ FTPDownloadRatio $ FTPUploadBandwidth $ FTPDownloadBandwidth $ FTPuid $ FTPgid ) X-ORIGIN 'Pure-FTPd' )", + "( 1.2.840.113556.1.5.87 NAME 'calEntry' DESC 'RFC2739: Calendar Entry' SUP top AUXILIARY MAY ( calCalURI $ calFBURL $ calOtherCalURIs $ calOtherFBURLs $ calCAPURI $ calOtherCAPURIs ) X-ORIGIN 'rfc2739' )", + "( 1.3.18.0.2.6.258 NAME 'printerAbstract' DESC 'Printer related information.' SUP top ABSTRACT MAY ( printer-name $ printer-natural-language-configured $ printer-location $ printer-info $ printer-more-info $ printer-make-and-model $ printer-multiple-document-jobs-supported $ printer-charset-configured $ printer-charset-supported $ printer-generated-natural-language-supported $ printer-document-format-supported $ printer-color-supported $ printer-compression-supported $ printer-pages-per-minute $ printer-pages-per-minute-color $ printer-finishings-supported $ printer-number-up-supported $ printer-sides-supported $ printer-media-supported $ printer-media-local-supported $ printer-resolution-supported $ printer-print-quality-supported $ printer-job-priority-supported $ printer-copies-supported $ printer-job-k-octets-supported $ printer-current-operator $ printer-service-person $ printer-delivery-orientation-supported $ printer-stacking-order-supported $ printer-output-features-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.255 NAME 'printerService' DESC 'Printer information.' SUP printerAbstract STRUCTURAL MAY ( printer-uri $ printer-xri-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.257 NAME 'printerServiceAuxClass' DESC 'Printer information.' SUP printerAbstract AUXILIARY MAY ( printer-uri $ printer-xri-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.256 NAME 'printerIPP' DESC 'Internet Printing Protocol (IPP) information.' SUP top AUXILIARY MAY ( printer-ipp-versions-supported $ printer-multiple-document-jobs-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.253 NAME 'printerLPR' DESC 'LPR information.' SUP top AUXILIARY MUST printer-name MAY printer-aliases X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.4.1.2312.4.3.4.1 NAME 'sabayonProfile' DESC 'sabayon profile' SUP top STRUCTURAL MUST cn MAY ( sabayonProfileURL $ description ) X-ORIGIN 'Sabayon' )", + "( 1.3.6.1.4.1.2312.4.3.4.2 NAME 'sabayonProfileNameObject' DESC 'contains sabayon profile name' SUP top AUXILIARY MUST sabayonProfileName X-ORIGIN 'Sabayon' )", + "( 1.3.6.1.4.1.2312.4.3.4.3 NAME 'sabayonProfileURLObject' DESC 'contains sabayon profile' SUP top AUXILIARY MUST cn MAY sabayonProfileURL X-ORIGIN 'Sabayon' )", + "( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'Sudoer Entries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoNotBefore $ sudoNotAfter $ sudoOrder $ description ) X-ORIGIN 'SUDO' )", + "( 5.3.6.1.1.1.2.0 NAME 'trustAccount' DESC 'Sets trust accounts information' SUP top AUXILIARY MUST trustModel MAY accessTo X-ORIGIN 'nss_ldap/pam_ldap' )" + ] + }, + "schema_entry": "cn=schema", + "type": "SchemaInfo" +} +""" + +ds389_1_3_3_dsa_info = """ +{ + "raw": { + "aci": [ + "(targetattr != \\"aci\\")(version 3.0; aci \\"rootdse anon read access\\"; allow(read,search,compare) userdn=\\"ldap:///anyone\\";)" + ], + "dataversion": [ + "020141110230816" + ], + "defaultnamingcontext": [ + "dc=labldap06,dc=a3,dc=internal,dc=cloudapp,dc=net" + ], + "namingContexts": [ + "dc=labldap06,dc=a3,dc=internal,dc=cloudapp,dc=net" + ], + "netscapemdsuffix": [ + "cn=ldap://dc=DS3891,dc=labldap06,dc=a3,dc=internal,dc=cloudapp,dc=net:389" + ], + "objectClass": [ + "top" + ], + "subschemaSubentry": [ + "cn=schema" + ], + "supportedControl": [ + "2.16.840.1.113730.3.4.2", + "2.16.840.1.113730.3.4.3", + "2.16.840.1.113730.3.4.4", + "2.16.840.1.113730.3.4.5", + "1.2.840.113556.1.4.473", + "2.16.840.1.113730.3.4.9", + "2.16.840.1.113730.3.4.16", + "2.16.840.1.113730.3.4.15", + "2.16.840.1.113730.3.4.17", + "2.16.840.1.113730.3.4.19", + "1.3.6.1.1.13.1", + "1.3.6.1.1.13.2", + "1.3.6.1.4.1.42.2.27.8.5.1", + "1.3.6.1.4.1.42.2.27.9.5.2", + "1.2.840.113556.1.4.319", + "1.3.6.1.4.1.42.2.27.9.5.8", + "1.3.6.1.4.1.4203.666.5.16", + "2.16.840.1.113730.3.4.14", + "2.16.840.1.113730.3.4.20", + "1.3.6.1.4.1.1466.29539.12", + "2.16.840.1.113730.3.4.12", + "2.16.840.1.113730.3.4.18", + "2.16.840.1.113730.3.4.13" + ], + "supportedExtension": [ + "2.16.840.1.113730.3.5.7", + "2.16.840.1.113730.3.5.8", + "2.16.840.1.113730.3.5.3", + "2.16.840.1.113730.3.5.12", + "2.16.840.1.113730.3.5.5", + "2.16.840.1.113730.3.5.6", + "2.16.840.1.113730.3.5.9", + "2.16.840.1.113730.3.5.4", + "2.16.840.1.113730.3.6.5", + "2.16.840.1.113730.3.6.6", + "2.16.840.1.113730.3.6.7", + "2.16.840.1.113730.3.6.8", + "1.3.6.1.4.1.4203.1.11.3", + "1.3.6.1.4.1.4203.1.11.1" + ], + "supportedLdapVersion": [ + "2", + "3" + ], + "supportedSASLMechanisms": [ + "EXTERNAL", + "PLAIN", + "DIGEST-MD5", + "ANONYMOUS", + "GSSAPI", + "LOGIN" + ], + "vendorName": [ + "389 Project" + ], + "vendorVersion": [ + "389-Directory/1.3.3.0 B2014.289.2022" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir888.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir888.py new file mode 100644 index 0000000..8243a7e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir888.py @@ -0,0 +1,1127 @@ +""" +""" + +# Created on 2014.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +edir_8_8_8_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 2.5.4.35 NAME 'userPassword' DESC 'Internal NDS policy forces this to be single-valued' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} USAGE directoryOperation )", + "( 2.5.18.1 NAME 'createTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.2 NAME 'modifyTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.10 NAME 'subschemaSubentry' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation )", + "( 2.5.21.9 NAME 'structuralObjectClass' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.49 NAME 'subordinateCount' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.48 NAME 'entryFlags' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.51 NAME 'federationBoundary' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.21.5 NAME 'attributeTypes' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", + "( 2.5.21.6 NAME 'objectClasses' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", + "( 1.3.6.1.1.20 NAME 'entryDN' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.1.4.1.2 NAME 'ACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.1 NAME 'aliasedObjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Aliased Object Name' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.6 NAME 'backLink' SYNTAX 2.16.840.1.113719.1.1.5.1.23 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Back Link' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.8 NAME 'binderyProperty' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Property' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.7 NAME 'binderyObjectRestriction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Object Restriction' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.9 NAME 'binderyType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Type' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.11 NAME 'cAPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.12 NAME 'cAPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.10 NAME 'Cartridge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'CN' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.78 NAME 'printerConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} SINGLE-VALUE X-NDS_NAME 'Printer Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.15 NAME 'Convergence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{1} SINGLE-VALUE X-NDS_UPPER_BOUND '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2} SINGLE-VALUE X-NDS_NAME 'C' X-NDS_LOWER_BOUND '2' X-NDS_UPPER_BOUND '2' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.18 NAME 'defaultQueue' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Default Queue' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.13 NAME ( 'description' 'multiLineDescription' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} X-NDS_NAME 'Description' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '1024' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.64 NAME 'partitionCreationTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Creation Time' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.23 NAME 'facsimileTelephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22{64512} X-NDS_NAME 'Facsimile Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.117 NAME 'highConvergenceSyncInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'High Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.25 NAME 'groupMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Group Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.26 NAME 'ndsHomeDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{255} SINGLE-VALUE X-NDS_NAME 'Home Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.27 NAME 'hostDevice' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Device' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.28 NAME 'hostResourceName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Host Resource Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.29 NAME 'hostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.30 NAME 'inheritedACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Inherited ACL' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.7 NAME ( 'l' 'localityname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'L' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.39 NAME 'loginAllowedTimeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{42} SINGLE-VALUE X-NDS_NAME 'Login Allowed Time Map' X-NDS_LOWER_BOUND '42' X-NDS_UPPER_BOUND '42' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.40 NAME 'loginDisabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Login Disabled' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.41 NAME 'loginExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.42 NAME 'loginGraceLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Grace Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.43 NAME 'loginGraceRemaining' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Grace Remaining' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.44 NAME 'loginIntruderAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 SINGLE-VALUE X-NDS_NAME 'Login Intruder Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.45 NAME 'loginIntruderAttempts' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Intruder Attempts' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.46 NAME 'loginIntruderLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Intruder Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.31 NAME 'intruderAttemptResetInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Attempt Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.47 NAME 'loginIntruderResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Intruder Reset Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.48 NAME 'loginMaximumSimultaneous' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Maximum Simultaneous' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.49 NAME 'loginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Login Script' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.50 NAME 'loginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.31 NAME ( 'member' 'uniqueMember' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Member' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.52 NAME 'Memory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.22 NAME 'eMailAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.14{64512} X-NDS_NAME 'EMail Address' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.55 NAME 'networkAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.56 NAME 'networkAddressRestriction' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address Restriction' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.57 NAME 'notify' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Notify' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.114 NAME 'Obituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.0 NAME 'objectClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_NAME 'Object Class' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.59 NAME 'operator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Operator' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'OU' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.10 NAME ( 'o' 'organizationname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'O' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.32 NAME 'owner' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Owner' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.63 NAME 'pageDescriptionLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Page Description Language' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.65 NAME 'passwordsUsed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'Passwords Used' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.66 NAME 'passwordAllowChange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Allow Change' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.67 NAME 'passwordExpirationInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Password Expiration Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.68 NAME 'passwordExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Password Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.69 NAME 'passwordMinimumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Password Minimum Length' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.70 NAME 'passwordRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.71 NAME 'passwordUniqueRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Unique Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.72 NAME 'path' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Path' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'Physical Delivery Office Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.16 NAME 'postalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'Postal Address' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.17 NAME 'postalCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Code' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.18 NAME 'postOfficeBox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Office Box' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.80 NAME 'printJobConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Print Job Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.79 NAME 'printerControl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Printer Control' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.82 NAME 'privateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.83 NAME 'Profile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.84 NAME 'publicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.85 NAME 'queue' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Queue' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.86 NAME 'queueDirectory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE X-NDS_NAME 'Queue Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.115 NAME 'Reference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.88 NAME 'Replica' SYNTAX 2.16.840.1.113719.1.1.5.1.16{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.89 NAME 'Resource' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.33 NAME 'roleOccupant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Role Occupant' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.116 NAME 'higherPrivileges' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Higher Privileges' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.92 NAME 'securityEquals' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Security Equals' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.34 NAME 'seeAlso' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'See Also' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.5 NAME 'serialNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Serial Number' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.95 NAME 'server' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Server' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'S' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.98 NAME 'status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Status' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.5.4.9 NAME 'street' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'SA' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.102 NAME 'supportedTypefaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Typefaces' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.101 NAME 'supportedServices' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Services' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.4 NAME ( 'sn' 'surname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Surname' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.20 NAME 'telephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} X-NDS_NAME 'Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.12 NAME 'title' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Title' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.111 NAME 'User' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.112 NAME 'Version' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.1 NAME 'accountBalance' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.4 NAME 'allowUnlimitedCredit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Allow Unlimited Credit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.118 NAME 'lowConvergenceResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Low Convergence Reset Time' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.54 NAME 'minimumAccountBalance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Minimum Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.104 NAME 'lowConvergenceSyncInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Low Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.21 NAME 'Device' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.53 NAME 'messageServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Message Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.34 NAME 'Language' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.100 NAME 'supportedConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Supported Connections' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.107 NAME 'typeCreatorMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Type Creator Map' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.108 NAME 'ndsUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'UID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.24 NAME 'groupID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'GID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.110 NAME 'unknownBaseClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Unknown Base Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.87 NAME 'receivedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.33 NAME 'synchronizedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Synchronized Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.5 NAME 'authorityRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Authority Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.13 NAME 'certificateRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Certificate Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.17 NAME 'ndsCrossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'Cross Certificate Pair' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.37 NAME 'lockedByIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Locked By Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.77 NAME 'printer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Printer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.20 NAME 'detectIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Detect Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.38 NAME 'lockoutAfterDetection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Lockout After Detection' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.32 NAME 'intruderLockoutResetInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Lockout Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.96 NAME 'serverHolds' SYNTAX 2.16.840.1.113719.1.1.5.1.23 X-NDS_NAME 'Server Holds' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.91 NAME 'sAPName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{47} SINGLE-VALUE X-NDS_NAME 'SAP Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '47' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.113 NAME 'Volume' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.35 NAME 'lastLoginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Last Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.81 NAME 'printServer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 SINGLE-VALUE X-NDS_NAME 'Print Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.119 NAME 'nNSDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'NNS Domain' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.120 NAME 'fullName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{127} X-NDS_NAME 'Full Name' X-NDS_UPPER_BOUND '127' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.121 NAME 'partitionControl' SYNTAX 2.16.840.1.113719.1.1.5.1.25 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Control' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.122 NAME 'revision' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Revision' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.123 NAME 'certificateValidityInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'Certificate Validity Interval' X-NDS_LOWER_BOUND '60' X-NDS_UPPER_BOUND '-1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.124 NAME 'externalSynchronizer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'External Synchronizer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.125 NAME 'messagingDatabaseLocation' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Messaging Database Location' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.126 NAME 'messageRoutingGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Message Routing Group' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.127 NAME 'messagingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Messaging Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.128 NAME 'Postmaster' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.162 NAME 'mailboxLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Mailbox Location' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.163 NAME 'mailboxID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Mailbox ID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.164 NAME 'externalName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'External Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.165 NAME 'securityFlags' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Security Flags' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.166 NAME 'messagingServerType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE X-NDS_NAME 'Messaging Server Type' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.167 NAME 'lastReferencedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Last Referenced Time' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.42 NAME 'givenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_NAME 'Given Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.43 NAME 'initials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} X-NDS_NAME 'Initials' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.44 NAME 'generationQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Generational Qualifier' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.171 NAME 'profileMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Profile Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.172 NAME 'dsRevision' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'DS Revision' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.16.840.1.113719.1.1.4.1.173 NAME 'supportedGateway' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} X-NDS_NAME 'Supported Gateway' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '4096' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.174 NAME 'equivalentToMe' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Equivalent To Me' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.175 NAME 'replicaUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Replica Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.176 NAME 'partitionStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Status' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.177 NAME 'permanentConfigParms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Permanent Config Parms' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.178 NAME 'Timezone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.179 NAME 'binderyRestrictionLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Bindery Restriction Level' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.180 NAME 'transitiveVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Transitive Vector' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.181 NAME 'T' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.183 NAME 'purgeVector' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Purge Vector' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.184 NAME 'synchronizationTolerance' SYNTAX 2.16.840.1.113719.1.1.5.1.19 USAGE directoryOperation X-NDS_NAME 'Synchronization Tolerance' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.185 NAME 'passwordManagement' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Password Management' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.186 NAME 'usedBy' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Used By' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.187 NAME 'Uses' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.500 NAME 'obituaryNotify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Obituary Notify' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.501 NAME 'GUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.502 NAME 'otherGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} USAGE directoryOperation X-NDS_NAME 'Other GUID' X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.503 NAME 'auxiliaryClassFlag' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Auxiliary Class Flag' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.504 NAME 'unknownAuxiliaryClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} USAGE directoryOperation X-NDS_NAME 'Unknown Auxiliary Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userId' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'uniqueID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.1.25 NAME 'dc' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} X-NDS_NAME 'dc' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.507 NAME 'auxClassObjectClassBackup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'AuxClass Object Class Backup' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.508 NAME 'localReceivedUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Local Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.4 NAME 'federationControl' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.2 NAME 'federationSearchPath' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.3 NAME 'federationDNSName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.1 NAME 'federationBoundaryType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.14.4.1.4 NAME 'DirXML-Associations' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.18.3 NAME 'creatorsName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.18.4 NAME 'modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.300 NAME 'languageId' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.35 NAME 'ndsPredicate' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.36 NAME 'ndsPredicateState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.37 NAME 'ndsPredicateFlush' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.38 NAME 'ndsPredicateTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.40 NAME 'ndsPredicateStatsDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.39 NAME 'ndsPredicateUseValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.601 NAME 'syncPanePoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.600 NAME 'syncWindowVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.602 NAME 'objectVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'memberQueryURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'memberQuery' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.302 NAME 'excludedMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.525 NAME 'auxClassCompatibility' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.518 NAME 'ndsAgentPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.519 NAME 'ndsOperationCheckpoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.520 NAME 'localReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.521 NAME 'treeReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.522 NAME 'schemaResetLock' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.523 NAME 'modifiedACLEntry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.524 NAME 'monitoredConnection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.526 NAME 'localFederationBoundary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.527 NAME 'replicationFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.296 NAME 'loginActivationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.687 NAME 'UpdateInProgress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.400.1 NAME 'edirSchemaFlagVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.512 NAME 'indexDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.513 NAME 'ndsStatusRepair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.514 NAME 'ndsStatusExternalReference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.515 NAME 'ndsStatusObituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.516 NAME 'ndsStatusSchema' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.517 NAME 'ndsStatusLimber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.511 NAME 'authoritative' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'CachedAttrsOnExtRefs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.547 NAME 'ExtRefLastUpdatedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.688 NAME 'NCPKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.1.4.713 NAME 'UTF8LoginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.714 NAME 'loginScriptCharset' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.1.192 NAME 'lDAPLogLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Log Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.12 NAME 'lDAPUDPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP UDP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.1.4.1.204 NAME 'lDAPLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.205 NAME 'lDAPBackupLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Backup Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.206 NAME 'lDAPLogSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Log Size Limit' X-NDS_LOWER_BOUND '2048' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.1.4.1.194 NAME 'lDAPSearchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Size Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.195 NAME 'lDAPSearchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Time Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.207 NAME 'lDAPSuffix' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Suffix' )", + "( 2.16.840.1.113719.1.27.4.70 NAME 'ldapConfigVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.14 NAME 'ldapReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Referral' )", + "( 2.16.840.1.113719.1.27.4.73 NAME 'ldapDefaultReferralBehavior' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.23 NAME 'ldapSearchReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:searchReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.24 NAME 'lDAPOtherReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:otherReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.1 NAME 'ldapHostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Host Server' )", + "( 2.16.840.1.113719.1.27.4.2 NAME 'ldapGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Group' )", + "( 2.16.840.1.113719.1.27.4.3 NAME 'ldapTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Screen Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.4 NAME 'searchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.5 NAME 'searchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.6 NAME 'ldapServerBindLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Bind Limit' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.7 NAME 'ldapServerIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Idle Timeout' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.8 NAME 'ldapEnableTCP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable TCP' )", + "( 2.16.840.1.113719.1.27.4.10 NAME 'ldapEnableSSL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable SSL' )", + "( 2.16.840.1.113719.1.27.4.11 NAME 'ldapTCPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP TCP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.13 NAME 'ldapSSLPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP SSL Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.21 NAME 'filteredReplicaUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.22 NAME 'ldapKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP:keyMaterialName' )", + "( 2.16.840.1.113719.1.27.4.42 NAME 'extensionInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.27.4.45 NAME 'nonStdClientSchemaCompatMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.46 NAME 'sslEnableMutualAuthentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.62 NAME 'ldapEnablePSearch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.63 NAME 'ldapMaximumPSearchOperations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.64 NAME 'ldapIgnorePSearchLimitsForEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.65 NAME 'ldapTLSTrustedRootContainer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.27.4.66 NAME 'ldapEnableMonitorEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.67 NAME 'ldapMaximumMonitorEventsLoad' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.68 NAME 'ldapTLSRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.69 NAME 'ldapTLSVerifyClientCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.71 NAME 'ldapDerefAlias' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.72 NAME 'ldapNonStdAllUserAttrsMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.75 NAME 'ldapBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.79 NAME 'ldapInterfaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.80 NAME 'ldapChainSecureRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.82 NAME 'ldapStdCompliance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.83 NAME 'ldapDerefAliasOnAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.84 NAME 'ldapGeneralizedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.85 NAME 'ldapPermissiveModify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.15 NAME 'ldapServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server List' )", + "( 2.16.840.1.113719.1.27.4.16 NAME 'ldapAttributeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Attribute Map v11' )", + "( 2.16.840.1.113719.1.27.4.17 NAME 'ldapClassMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Class Map v11' )", + "( 2.16.840.1.113719.1.27.4.18 NAME 'ldapAllowClearTextPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Allow Clear Text Password' )", + "( 2.16.840.1.113719.1.27.4.19 NAME 'ldapAnonymousIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Anonymous Identity' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'ldapAttributeList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.53 NAME 'ldapClassList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.56 NAME 'transitionGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.74 NAME 'ldapTransitionBackLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.78 NAME 'ldapLBURPNumWriterThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.20 NAME 'ldapServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server' )", + "( 0.9.2342.19200300.100.1.3 NAME 'mail' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'Internet EMail Address' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'NSCP:employeeNumber' )", + "( 2.16.840.1.113719.1.27.4.76 NAME 'referralExcludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.77 NAME 'referralIncludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.5.4.36 NAME 'userCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'userCertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.37 NAME 'cACertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'cACertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.40 NAME 'crossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'crossCertificatePair' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.58 NAME 'attributeCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.2 NAME 'knowledgeInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25{64512} X-NDS_NAME 'searchGuide' )", + "( 2.5.4.15 NAME 'businessCategory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52{64512} X-NDS_NAME 'telexNumber' )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51{64512} X-NDS_NAME 'teletexTerminalIdentifier' )", + "( 2.5.4.24 NAME 'x121Address' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '15' )", + "( 2.5.4.25 NAME 'internationaliSDNNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '16' )", + "( 2.5.4.26 NAME 'registeredAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'registeredAddress' )", + "( 2.5.4.27 NAME 'destinationIndicator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14{64512} SINGLE-VALUE X-NDS_NAME 'preferredDeliveryMethod' )", + "( 2.5.4.29 NAME 'presentationAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.43{64512} SINGLE-VALUE X-NDS_NAME 'presentationAddress' )", + "( 2.5.4.30 NAME 'supportedApplicationContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38{64512} X-NDS_NAME 'supportedApplicationContext' )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6{64512} X-NDS_NAME 'x500UniqueIdentifier' )", + "( 2.5.4.46 NAME 'dnQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64512} )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21{64512} X-NDS_NAME 'enhancedSearchGuide' )", + "( 2.5.4.48 NAME 'protocolInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.42{64512} X-NDS_NAME 'protocolInformation' )", + "( 2.5.4.51 NAME 'houseIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.52 NAME 'supportedAlgorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49{64512} X-NDS_NAME 'supportedAlgorithms' )", + "( 2.5.4.54 NAME 'dmdName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.4.49 NAME 'dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.1 NAME 'httpServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.3.4.2 NAME 'httpHostServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.3 NAME 'httpThreadsPerCPU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.4 NAME 'httpIOBufferSize' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.5 NAME 'httpRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.6 NAME 'httpKeepAliveRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.7 NAME 'httpSessionTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.8 NAME 'httpKeyMaterialObject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.9 NAME 'httpTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.10 NAME 'httpAuthRequiresTLS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.11 NAME 'httpDefaultClearPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.12 NAME 'httpDefaultTLSPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.13 NAME 'httpBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.295 NAME 'emboxConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.54.4.1.1 NAME 'trusteesOfNewObject' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'Trustees Of New Object' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.55.4.1.1 NAME 'newObjectSDSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's DS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.56.4.1.1 NAME 'newObjectSFSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'New Object's FS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.57.4.1.1 NAME 'setupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.58.4.1.1 NAME 'runSetupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Run Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.59.4.1.1 NAME 'membersOfTemplate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Members Of Template' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.60.4.1.1 NAME 'volumeSpaceRestrictions' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Volume Space Restrictions' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.61.4.1.1 NAME 'setPasswordAfterCreate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Set Password After Create' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.62.4.1.1 NAME 'homeDirectoryRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NAME 'Home Directory Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.63.4.1.1 NAME 'newObjectSSelfRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's Self Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.8.4.1 NAME 'digitalMeID' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.2 NAME 'assistant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.3 NAME 'assistantPhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.4 NAME 'city' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.5 NAME 'company' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.43 NAME 'co' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.6 NAME 'directReports' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.7 NAME 'mailstop' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.41 NAME 'mobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.42 NAME 'pager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.8 NAME 'workforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.9 NAME 'instantMessagingID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.10 NAME 'preferredName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.8.4.11 NAME 'jobCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.12 NAME 'siteLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.13 NAME 'employeeStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.14 NAME 'costCenter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.15 NAME 'costCenterDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.16 NAME 'tollFreePhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.17 NAME 'otherPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.18 NAME 'managerWorkforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.19 NAME 'jackNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.20 NAME 'vehicleInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.21 NAME 'accessCardNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.32 NAME 'isManager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.22 NAME 'homeCity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.23 NAME 'homeEmailAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 1.3.6.1.4.1.1466.101.120.31 NAME 'homeFax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.20 NAME 'homePhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.24 NAME 'homeState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} )", + "( 2.16.840.1.113719.1.8.4.25 NAME 'homeZipCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.26 NAME 'personalMobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.27 NAME 'children' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.28 NAME 'spouse' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.29 NAME 'vendorName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.30 NAME 'vendorAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.31 NAME 'vendorPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.1.4.1.303 NAME 'dgIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME_VALUE_ACCESS '1' )", + "( 2.16.840.1.113719.1.1.4.1.304 NAME 'dgTimeOut' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.305 NAME 'dgAllowUnknown' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.306 NAME 'dgAllowDuplicates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'allowAliasToAncestor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.39.4.1.1 NAME 'sASSecurityDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Security DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.2 NAME 'sASServiceDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Service DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.3 NAME 'sASSecretStore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:SecretStore' )", + "( 2.16.840.1.113719.1.39.4.1.4 NAME 'sASSecretStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Key' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.5 NAME 'sASSecretStoreData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Data' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.6 NAME 'sASPKIStoreKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:PKIStore:Keys' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.48.4.1.1 NAME 'nDSPKIPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.2 NAME 'nDSPKIPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Private Key' )", + "( 2.16.840.1.113719.1.48.4.1.3 NAME 'nDSPKIPublicKeyCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.4 NAME 'nDSPKICertificateChain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:Certificate Chain' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.5 NAME 'nDSPKIParentCA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA' )", + "( 2.16.840.1.113719.1.48.4.1.6 NAME 'nDSPKIParentCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA DN' )", + "( 2.16.840.1.113719.1.48.4.1.7 NAME 'nDSPKIKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Key File' )", + "( 2.16.840.1.113719.1.48.4.1.8 NAME 'nDSPKISubjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Subject Name' )", + "( 2.16.840.1.113719.1.48.4.1.11 NAME 'nDSPKIGivenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Given Name' )", + "( 2.16.840.1.113719.1.48.4.1.9 NAME 'nDSPKIKeyMaterialDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Key Material DN' )", + "( 2.16.840.1.113719.1.48.4.1.10 NAME 'nDSPKITreeCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Tree CA DN' )", + "( 2.16.840.1.113719.1.48.4.1.12 NAME 'nDSPKIUserCertificateInfo' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'NDSPKI:userCertificateInfo' )", + "( 2.16.840.1.113719.1.48.4.1.13 NAME 'nDSPKITrustedRootCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Trusted Root Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.14 NAME 'nDSPKINotBefore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not Before' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.15 NAME 'nDSPKINotAfter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not After' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.101 NAME 'nDSPKISDKeyServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:SD Key Server DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.102 NAME 'nDSPKISDKeyStruct' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:SD Key Struct' )", + "( 2.16.840.1.113719.1.48.4.1.103 NAME 'nDSPKISDKeyCert' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key Cert' )", + "( 2.16.840.1.113719.1.48.4.1.104 NAME 'nDSPKISDKeyID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key ID' )", + "( 2.16.840.1.113719.1.39.4.1.105 NAME 'nDSPKIKeystore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'NDSPKI:Keystore' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.106 NAME 'ndspkiAdditionalRoots' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.3 NAME 'masvLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.4 NAME 'masvProposedLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.5 NAME 'masvDefaultRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.6 NAME 'masvAuthorizedRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.7 NAME 'masvDomainPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.8 NAME 'masvClearanceNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.9 NAME 'masvLabelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.10 NAME 'masvLabelSecrecyLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.11 NAME 'masvLabelSecrecyCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.12 NAME 'masvLabelIntegrityLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.13 NAME 'masvLabelIntegrityCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.14 NAME 'masvPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.31.4.1.16 NAME 'masvNDSAttributeLabels' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.15 NAME 'masvPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.2 NAME 'sASLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'SAS:Login Sequence' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.8 NAME 'sASLoginPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy Update' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'sasNMASProductOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.74 NAME 'sasAuditConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.14 NAME 'sASNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.15 NAME 'sASPolicyCredentials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Policy Credentials' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.16 NAME 'sASPolicyMethods' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Methods' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.17 NAME 'sASPolicyObjectVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Policy Object Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.18 NAME 'sASPolicyServiceSubtypes' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Service Subtypes' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.19 NAME 'sASPolicyServices' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Services' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.20 NAME 'sASPolicyUsers' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Users' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.21 NAME 'sASAllowNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:Allow NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.9 NAME 'sASMethodIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Identifier' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.10 NAME 'sASMethodVendor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Vendor' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.11 NAME 'sASAdvisoryMethodGrade' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Advisory Method Grade' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.12 NAME 'sASVendorSupport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Vendor Support' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.13 NAME 'sasCertificateSearchContainers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.70 NAME 'sasNMASMethodConfigData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.22 NAME 'sASLoginClientMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.23 NAME 'sASLoginServerMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.24 NAME 'sASLoginClientMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.25 NAME 'sASLoginServerMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.26 NAME 'sasLoginClientMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.27 NAME 'sasLoginServerMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.28 NAME 'sasLoginClientMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.29 NAME 'sasLoginServerMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.30 NAME 'sasLoginClientMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.31 NAME 'sasLoginServerMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.32 NAME 'sasLoginClientMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.33 NAME 'sasLoginServerMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.34 NAME 'sasLoginClientMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.35 NAME 'sasLoginServerMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1000 NAME 'sasLoginClientMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1001 NAME 'sasLoginServerMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1002 NAME 'sasLoginClientMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1003 NAME 'sasLoginServerMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1004 NAME 'sasLoginClientMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1005 NAME 'sasLoginServerMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1006 NAME 'sasLoginClientMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1007 NAME 'sasLoginServerMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1008 NAME 'sasLoginClientMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1009 NAME 'sasLoginServerMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasLoginServerMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasLoginClientMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.78 NAME 'sasUnsignedMethodModules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.79 NAME 'sasServerModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.80 NAME 'sasServerModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.81 NAME 'sasSASLMechanismName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.82 NAME 'sasSASLMechanismEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.83 NAME 'sasClientModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.84 NAME 'sasClientModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.36 NAME 'sASLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Method Container DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.37 NAME 'sASLoginPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.63 NAME 'sasPostLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'rADIUSActiveConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Active Connections' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.39 NAME 'rADIUSAgedInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Aged Interval' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.40 NAME 'rADIUSAttributeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Attribute List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.41 NAME 'rADIUSAttributeLists' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Attribute Lists' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.42 NAME 'rADIUSClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Client' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.43 NAME 'rADIUSCommonNameResolution' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Common Name Resolution' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.44 NAME 'rADIUSConcurrentLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Concurrent Limit' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.45 NAME 'rADIUSConnectionHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Connection History' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.46 NAME 'rADIUSDASVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:DAS Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.47 NAME 'rADIUSDefaultProfile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Default Profile' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.48 NAME 'rADIUSDialAccessGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'RADIUS:Dial Access Group' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.49 NAME 'rADIUSEnableCommonNameLogin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Common Name Login' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.50 NAME 'rADIUSEnableDialAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Dial Access' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.51 NAME 'rADIUSInterimAcctingTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Interim Accting Timeout' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.52 NAME 'rADIUSLookupContexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'RADIUS:Lookup Contexts' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.53 NAME 'rADIUSMaxDASHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Max DAS History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.54 NAME 'rADIUSMaximumHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Maximum History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.55 NAME 'rADIUSPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Password' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.56 NAME 'rADIUSPasswordPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Password Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.57 NAME 'rADIUSPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Private Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.58 NAME 'rADIUSProxyContext' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Proxy Context' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.59 NAME 'rADIUSProxyDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Domain' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.60 NAME 'rADIUSProxyTarget' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Target' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.61 NAME 'rADIUSPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Public Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.62 NAME 'rADIUSServiceList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Service List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.3 NAME 'sASLoginSecret' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.4 NAME 'sASLoginSecretKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.5 NAME 'sASEncryptionType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Encryption Type' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.6 NAME 'sASLoginConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.7 NAME 'sASLoginConfigurationKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.73 NAME 'sasDefaultLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.64 NAME 'sasAuthorizedLoginSequences' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.69 NAME 'sasAllowableSubjectNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.71 NAME 'sasLoginFailureDelay' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.72 NAME 'sasMethodVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1010 NAME 'sasUpdateLoginInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasOTPEnabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasOTPCounter' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1013 NAME 'sasOTPLookAheadWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1014 NAME 'sasOTPDigits' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1015 NAME 'sasOTPReSync' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1016 NAME 'sasUpdateLoginTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.6.4.1 NAME 'snmpGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.2 NAME 'snmpServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.6.4.3 NAME 'snmpTrapConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.4 NAME 'snmpTrapDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.5 NAME 'snmpTrapInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.6 NAME 'snmpTrapDisable' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.528 NAME 'ndapPartitionPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.529 NAME 'ndapClassPasswordMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.530 NAME 'ndapPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.537 NAME 'ndapPartitionLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.538 NAME 'ndapClassLoginMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.539 NAME 'ndapLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.1 NAME 'nspmPasswordKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.2 NAME 'nspmPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.3 NAME 'nspmDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.4 NAME 'nspmPasswordHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.5 NAME 'nspmAdministratorChangeCount' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.6 NAME 'nspmPasswordPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.7 NAME 'nspmPreviousDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.8 NAME 'nspmDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.42.2.27.8.1.16 NAME 'pwdChangedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.17 NAME 'pwdAccountLockedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.19 NAME 'pwdFailureTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.39.43.4.100 NAME 'nspmConfigurationOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.102 NAME 'nspmChangePasswordMessage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.103 NAME 'nspmPasswordHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.104 NAME 'nspmPasswordHistoryExpiration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.105 NAME 'nspmMinPasswordLifetime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.106 NAME 'nspmAdminsDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.107 NAME 'nspmPasswordACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 )", + "( 2.16.840.1.113719.1.39.43.4.200 NAME 'nspmMaximumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.201 NAME 'nspmMinUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.202 NAME 'nspmMaxUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.203 NAME 'nspmMinLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.204 NAME 'nspmMaxLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.205 NAME 'nspmNumericCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.206 NAME 'nspmNumericAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.207 NAME 'nspmNumericAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.208 NAME 'nspmMinNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.209 NAME 'nspmMaxNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.210 NAME 'nspmSpecialCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.211 NAME 'nspmSpecialAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.212 NAME 'nspmSpecialAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.213 NAME 'nspmMinSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.214 NAME 'nspmMaxSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.215 NAME 'nspmMaxRepeatedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.216 NAME 'nspmMaxConsecutiveCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.217 NAME 'nspmMinUniqueCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.218 NAME 'nspmDisallowedAttributeValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.219 NAME 'nspmExcludeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.220 NAME 'nspmCaseSensitive' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.221 NAME 'nspmPolicyPrecedence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.222 NAME 'nspmExtendedCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.223 NAME 'nspmExtendedAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.224 NAME 'nspmExtendedAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.225 NAME 'nspmMinExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.226 NAME 'nspmMaxExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.227 NAME 'nspmUpperAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.228 NAME 'nspmUpperAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.229 NAME 'nspmLowerAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.230 NAME 'nspmLowerAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.231 NAME 'nspmComplexityRules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.233 NAME 'nspmAD2K8Syntax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.234 NAME 'nspmAD2K8maxViolation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.235 NAME 'nspmXCharLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.236 NAME 'nspmXCharHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.237 NAME 'nspmUnicodeAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.238 NAME 'nspmNonAlphaCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.239 NAME 'nspmMinNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.240 NAME 'nspmMaxNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.241 NAME 'nspmGraceLoginHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.300 NAME 'nspmPolicyAgentContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.301 NAME 'nspmPolicyAgentNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.302 NAME 'nspmPolicyAgentWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.303 NAME 'nspmPolicyAgentSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.304 NAME 'nspmPolicyAgentLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.305 NAME 'nspmPolicyAgentAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.306 NAME 'nspmPolicyAgentHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledUri' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'ldapPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.12.4.1.0 NAME 'auditAEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:A Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.2.0 NAME 'auditBEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:B Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.3.0 NAME 'auditContents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Contents' )", + "( 2.16.840.1.113719.1.12.4.4.0 NAME 'auditType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Type' )", + "( 2.16.840.1.113719.1.12.4.5.0 NAME 'auditCurrentEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Current Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.6.0 NAME 'auditFileLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Audit:File Link' )", + "( 2.16.840.1.113719.1.12.4.7.0 NAME 'auditLinkList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Audit:Link List' )", + "( 2.16.840.1.113719.1.12.4.8.0 NAME 'auditPath' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Path' )", + "( 2.16.840.1.113719.1.12.4.9.0 NAME 'auditPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Policy' )", + "( 2.16.840.1.113719.1.38.4.1.1 NAME 'wANMANWANPolicy' SYNTAX 2.16.840.1.113719.1.1.5.1.13{64512} X-NDS_NAME 'WANMAN:WAN Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.2 NAME 'wANMANLANAreaMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'WANMAN:LAN Area Membership' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.3 NAME 'wANMANCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'WANMAN:Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.4 NAME 'wANMANDefaultCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'WANMAN:Default Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.135.4.30 NAME 'rbsAssignedRoles' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.31 NAME 'rbsContent' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.32 NAME 'rbsContentMembership' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.33 NAME 'rbsEntryPoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.34 NAME 'rbsMember' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.35 NAME 'rbsOwnedCollections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.135.4.36 NAME 'rbsPath' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.37 NAME 'rbsParameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.38 NAME 'rbsTaskRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.39 NAME 'rbsTrusteeOf' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.40 NAME 'rbsType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '256' )", + "( 2.16.840.1.113719.1.135.4.41 NAME 'rbsURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.42 NAME 'rbsTaskTemplates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.43 NAME 'rbsTaskTemplatesURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.44 NAME 'rbsGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.45 NAME 'rbsPageMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.46 NAME 'rbsTargetObjectType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.135.4.47 NAME 'rbsContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.48 NAME 'rbsXMLInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.51 NAME 'rbsAssignedRoles2' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.52 NAME 'rbsOwnedCollections2' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.1.540 NAME 'prSyncPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.541 NAME 'prSyncAttributes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.542 NAME 'dsEncryptedReplicationConfig' SYNTAX 2.16.840.1.113719.1.1.5.1.19 )", + "( 2.16.840.1.113719.1.1.4.1.543 NAME 'encryptionPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.544 NAME 'attrEncryptionRequiresSecure' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.545 NAME 'attrEncryptionDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.48.4.1.16 NAME 'ndspkiCRLFileName' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.17 NAME 'ndspkiStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.18 NAME 'ndspkiIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.19 NAME 'ndspkiNextIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'ndspkiAttemptTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.21 NAME 'ndspkiTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.22 NAME 'ndspkiCRLMaxProcessingInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.23 NAME 'ndspkiCRLNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.24 NAME 'ndspkiDistributionPoints' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.25 NAME 'ndspkiCRLProcessData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.26 NAME 'ndspkiCRLConfigurationDNList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.27 NAME 'ndspkiCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.28 NAME 'ndspkiCRLContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.29 NAME 'ndspkiIssuedCertContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.30 NAME 'ndspkiDistributionPointDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.31 NAME 'ndspkiCRLConfigurationDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.32 NAME 'ndspkiDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} )", + "( 2.5.4.38 NAME 'authorityRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'ndspkiAuthorityRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.39 NAME 'certificateRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'ndspkiCertificateRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.53 NAME 'deltaRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'ndspkiDeltaRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.36 NAME 'ndspkiTrustedRootList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.37 NAME 'ndspkiSecurityRightsLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.48.4.1.38 NAME 'ndspkiKMOExport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.7.4.1 NAME 'notfSMTPEmailHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.2 NAME 'notfSMTPEmailFrom' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.3 NAME 'notfSMTPEmailUserName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.5 NAME 'notfMergeTemplateData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.6 NAME 'notfMergeTemplateSubject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.1 NAME 'nsimRequiredQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.2 NAME 'nsimRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.3 NAME 'nsimNumberRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.4 NAME 'nsimMinResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.5 NAME 'nsimMaxResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.6 NAME 'nsimForgottenLoginConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.7 NAME 'nsimForgottenAction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.8 NAME 'nsimAssignments' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.9 NAME 'nsimChallengeSetDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.10 NAME 'nsimChallengeSetGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.11 NAME 'nsimPwdRuleEnforcement' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.12 NAME 'nsimHint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.44.4.13 NAME 'nsimPasswordReminder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.4 NAME 'sssProxyStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.5 NAME 'sssProxyStoreSecrets' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.6 NAME 'sssActiveServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.7 NAME 'sssCacheRefreshInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.8 NAME 'sssAdminList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.266.4.9 NAME 'sssAdminGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.10 NAME 'sssEnableReadTimestamps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.11 NAME 'sssDisableMasterPasswords' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.12 NAME 'sssEnableAdminAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.13 NAME 'sssReadSecretPolicies' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.14 NAME 'sssServerPolicyOverrideDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.531 NAME 'eDirCloneSource' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.532 NAME 'eDirCloneKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.1.4.1.533 NAME 'eDirCloneLock' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.711 NAME 'groupMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.712 NAME 'nestedConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.717 NAME 'xdasDSConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.718 NAME 'xdasConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.719 NAME 'xdasVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.347.4.79 NAME 'NAuditInstrumentation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.347.4.2 NAME 'NAuditLoggingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.135.4.53 NAME 'rbsRoleMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.135.4.54 NAME 'rbsCategoryMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )" + ], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.1 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.2 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.3 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.4 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.5 X-NDS_SYNTAX '21' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 X-NDS_SYNTAX '7' )", + "( 2.16.840.1.113719.1.1.5.1.6 X-NDS_SYNTAX '6' )", + "( 1.3.6.1.4.1.1466.115.121.1.8 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.9 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.10 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.22 X-NDS_SYNTAX '22' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SYNTAX '1' )", + "( 1.3.6.1.4.1.1466.115.121.1.13 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.16 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.17 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.18 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.19 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.20 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.21 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 X-NDS_SYNTAX '11' )", + "( 1.3.6.1.4.1.1466.115.121.1.23 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 X-NDS_SYNTAX '24' )", + "( 1.3.6.1.4.1.1466.115.121.1.25 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 X-NDS_SYNTAX '2' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_SYNTAX '8' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 X-NDS_SYNTAX '9' )", + "( 1.2.840.113556.1.4.906 X-NDS_SYNTAX '29' )", + "( 1.3.6.1.4.1.1466.115.121.1.54 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.56 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.57 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.29 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.30 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.31 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.32 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.33 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.55 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.35 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.19 X-NDS_SYNTAX '19' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 X-NDS_SYNTAX '5' )", + "( 2.16.840.1.113719.1.1.5.1.17 X-NDS_SYNTAX '17' )", + "( 1.3.6.1.4.1.1466.115.121.1.37 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.13 X-NDS_SYNTAX '13' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.39 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 X-NDS_SYNTAX '18' )", + "( 1.3.6.1.4.1.1466.115.121.1.43 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 X-NDS_SYNTAX '4' )", + "( 1.3.6.1.4.1.1466.115.121.1.42 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.16 X-NDS_SYNTAX '16' )", + "( 1.3.6.1.4.1.1466.115.121.1.58 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.45 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.46 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.47 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.48 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.49 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.12 X-NDS_SYNTAX '12' )", + "( 2.16.840.1.113719.1.1.5.1.23 X-NDS_SYNTAX '23' )", + "( 2.16.840.1.113719.1.1.5.1.15 X-NDS_SYNTAX '15' )", + "( 2.16.840.1.113719.1.1.5.1.14 X-NDS_SYNTAX '14' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 X-NDS_SYNTAX '10' )", + "( 1.3.6.1.4.1.1466.115.121.1.51 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.25 X-NDS_SYNTAX '25' )", + "( 1.3.6.1.4.1.1466.115.121.1.53 X-NDS_SYNTAX '9' )" + ], + "modifyTimestamp": [ + "20141014222353Z" + ], + "objectClass": [ + "top", + "subschema" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'Top' STRUCTURAL MUST objectClass MAY ( cAPublicKey $ cAPrivateKey $ certificateValidityInterval $ authorityRevocation $ lastReferencedTime $ equivalentToMe $ ACL $ backLink $ binderyProperty $ Obituary $ Reference $ revision $ ndsCrossCertificatePair $ certificateRevocation $ usedBy $ GUID $ otherGUID $ DirXML-Associations $ creatorsName $ modifiersName $ objectVersion $ auxClassCompatibility $ unknownBaseClass $ unknownAuxiliaryClass $ masvProposedLabel $ masvDefaultRange $ masvAuthorizedRange $ auditFileLink $ rbsAssignedRoles $ rbsOwnedCollections $ rbsAssignedRoles2 $ rbsOwnedCollections2 ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '16#subtree#[Creator]#[Entry Rights]' )", + "( 1.3.6.1.4.1.42.2.27.1.2.1 NAME 'aliasObject' SUP Top STRUCTURAL MUST aliasedObjectName X-NDS_NAME 'Alias' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.2 NAME 'Country' SUP Top STRUCTURAL MUST c MAY ( description $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING 'c' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.3 NAME 'Locality' SUP Top STRUCTURAL MAY ( description $ l $ seeAlso $ st $ street $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING ( 'l' 'st' ) X-NDS_CONTAINMENT ( 'Country' 'organizationalUnit' 'Locality' 'Organization' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.4 NAME 'Organization' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST o MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'o' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'domain' ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST ou MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'ou' X-NDS_CONTAINMENT ( 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Unit' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.8 NAME 'organizationalRole' SUP Top STRUCTURAL MUST cn MAY ( description $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ roleOccupant $ seeAlso $ st $ street $ telephoneNumber $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Role' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.9 NAME ( 'groupOfNames' 'group' 'groupOfUniqueNames' ) SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ owner $ seeAlso $ groupID $ fullName $ eMailAddress $ mailboxLocation $ mailboxID $ Profile $ profileMembership $ loginScript $ businessCategory $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.6 NAME 'Person' SUP ndsLoginProperties STRUCTURAL MUST ( cn $ sn ) MAY ( description $ seeAlso $ telephoneNumber $ fullName $ givenName $ initials $ generationQualifier $ uid $ assistant $ assistantPhone $ city $ st $ company $ co $ directReports $ manager $ mailstop $ mobile $ personalTitle $ pager $ workforceID $ instantMessagingID $ preferredName $ photo $ jobCode $ siteLocation $ employeeStatus $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ otherPhoneNumber $ managerWorkforceID $ roomNumber $ jackNumber $ departmentNumber $ vehicleInformation $ accessCardNumber $ isManager $ userPassword ) X-NDS_NAMING ( 'cn' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP Person STRUCTURAL MAY ( facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ mailboxLocation $ mailboxID $ uid $ mail $ employeeNumber $ destinationIndicator $ internationaliSDNNumber $ preferredDeliveryMethod $ registeredAddress $ teletexTerminalIdentifier $ telexNumber $ x121Address $ businessCategory $ roomNumber $ x500UniqueIdentifier ) X-NDS_NAMING ( 'cn' 'ou' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP organizationalPerson STRUCTURAL MAY ( groupMembership $ ndsHomeDirectory $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ printJobConfiguration $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ messageServer $ Language $ ndsUID $ lockedByIntruder $ serverHolds $ lastLoginTime $ typeCreatorMap $ higherPrivileges $ printerControl $ securityFlags $ profileMembership $ Timezone $ sASServiceDN $ sASSecretStore $ sASSecretStoreKey $ sASSecretStoreData $ sASPKIStoreKeys $ userCertificate $ nDSPKIUserCertificateInfo $ nDSPKIKeystore $ rADIUSActiveConnections $ rADIUSAttributeLists $ rADIUSConcurrentLimit $ rADIUSConnectionHistory $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSPassword $ rADIUSServiceList $ audio $ businessCategory $ carLicense $ departmentNumber $ employeeNumber $ employeeType $ displayName $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledUri $ mail $ manager $ mobile $ o $ pager $ ldapPhoto $ preferredLanguage $ roomNumber $ secretary $ uid $ userSMIMECertificate $ x500UniqueIdentifier $ userPKCS12 $ sssProxyStoreKey $ sssProxyStoreSecrets $ sssServerPolicyOverrideDN ) X-NDS_NAME 'User' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#loginScript' '1#subtree#[Root Template]#[Entry Rights]' '2#entry#[Public]#messageServer' '2#entry#[Root Template]#groupMembership' '6#entry#[Self]#printJobConfiguration' '2#entry#[Root Template]#networkAddress') )", + "( 2.5.6.14 NAME 'Device' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ networkAddress $ ou $ o $ owner $ seeAlso $ serialNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.4 NAME 'Computer' SUP Device STRUCTURAL MAY ( operator $ server $ status ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.17 NAME 'Printer' SUP Device STRUCTURAL MAY ( Cartridge $ printerConfiguration $ defaultQueue $ hostDevice $ printServer $ Memory $ networkAddressRestriction $ notify $ operator $ pageDescriptionLanguage $ queue $ status $ supportedTypefaces ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.21 NAME 'Resource' SUP Top ABSTRACT MUST cn MAY ( description $ hostResourceName $ l $ ou $ o $ seeAlso $ Uses ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.20 NAME 'Queue' SUP Resource STRUCTURAL MUST queueDirectory MAY ( Device $ operator $ server $ User $ networkAddress $ Volume $ hostServer ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.3 NAME 'binderyQueue' SUP Queue STRUCTURAL MUST binderyType X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_NAME 'Bindery Queue' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.26 NAME 'Volume' SUP Resource STRUCTURAL MUST hostServer MAY status X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Root Template]#hostResourceName' '2#entry#[Root Template]#hostServer') )", + "( 2.16.840.1.113719.1.1.6.1.7 NAME 'directoryMap' SUP Resource STRUCTURAL MUST hostServer MAY path X-NDS_NAME 'Directory Map' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.19 NAME 'Profile' SUP Top STRUCTURAL MUST ( cn $ loginScript ) MAY ( description $ l $ ou $ o $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.22 NAME 'Server' SUP Top ABSTRACT MUST cn MAY ( description $ hostDevice $ l $ ou $ o $ privateKey $ publicKey $ Resource $ seeAlso $ status $ User $ Version $ networkAddress $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ fullName $ securityEquals $ securityFlags $ Timezone $ ndapClassPasswordMgmt $ ndapClassLoginMgmt ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Public]#networkAddress' '16#subtree#[Self]#[Entry Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.10 NAME 'ncpServer' SUP Server STRUCTURAL MAY ( operator $ supportedServices $ messagingServer $ dsRevision $ permanentConfigParms $ ndsPredicateStatsDN $ languageId $ indexDefinition $ CachedAttrsOnExtRefs $ NCPKeyMaterialName $ ldapServerDN $ httpServerDN $ emboxConfig $ sASServiceDN $ cACertificate $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKICertificateChain $ nDSPKIParentCADN $ nDSPKISDKeyID $ nDSPKISDKeyStruct $ snmpGroupDN $ wANMANWANPolicy $ wANMANLANAreaMembership $ wANMANCost $ wANMANDefaultCost $ encryptionPolicyDN $ eDirCloneSource $ eDirCloneLock $ xdasDSConfiguration $ xdasConfiguration $ xdasVersion $ NAuditLoggingServer $ NAuditInstrumentation ) X-NDS_NAME 'NCP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#messagingServer' )", + "( 2.16.840.1.113719.1.1.6.1.18 NAME 'printServer' SUP Server STRUCTURAL MAY ( operator $ printer $ sAPName ) X-NDS_NAME 'Print Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.31 NAME 'CommExec' SUP Server STRUCTURAL MAY networkAddressRestriction X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.2 NAME 'binderyObject' SUP Top STRUCTURAL MUST ( binderyObjectRestriction $ binderyType $ cn ) X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Bindery Object' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.15 NAME 'Partition' AUXILIARY MAY ( Convergence $ partitionCreationTime $ Replica $ inheritedACL $ lowConvergenceSyncInterval $ receivedUpTo $ synchronizedUpTo $ authorityRevocation $ certificateRevocation $ cAPrivateKey $ cAPublicKey $ ndsCrossCertificatePair $ lowConvergenceResetTime $ highConvergenceSyncInterval $ partitionControl $ replicaUpTo $ partitionStatus $ transitiveVector $ purgeVector $ synchronizationTolerance $ obituaryNotify $ localReceivedUpTo $ federationControl $ syncPanePoint $ syncWindowVector $ authoritative $ allowAliasToAncestor $ sASSecurityDN $ masvLabel $ ndapPartitionPasswordMgmt $ ndapPartitionLoginMgmt $ prSyncPolicyDN $ dsEncryptedReplicationConfig ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.0 NAME 'aFPServer' SUP Server STRUCTURAL MAY ( serialNumber $ supportedConnections ) X-NDS_NAME 'AFP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.27 NAME 'messagingServer' SUP Server STRUCTURAL MAY ( messagingDatabaseLocation $ messageRoutingGroup $ Postmaster $ supportedServices $ messagingServerType $ supportedGateway ) X-NDS_NAME 'Messaging Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#status' '2#entry#[Public]#messagingServerType' '2#entry#[Public]#messagingDatabaseLocation') )", + "( 2.16.840.1.113719.1.1.6.1.28 NAME 'messageRoutingGroup' SUP groupOfNames STRUCTURAL X-NDS_NAME 'Message Routing Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.29 NAME 'externalEntity' SUP Top STRUCTURAL MUST cn MAY ( description $ seeAlso $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ externalName $ mailboxLocation $ mailboxID ) X-NDS_NAMING ( 'cn' 'ou' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'External Entity' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#externalName' )", + "( 2.16.840.1.113719.1.1.6.1.30 NAME 'List' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ eMailAddress $ mailboxLocation $ mailboxID $ owner $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member' )", + "( 2.16.840.1.113719.1.1.6.1.32 NAME 'treeRoot' SUP Top STRUCTURAL MUST T MAY sssActiveServerList X-NDS_NAMING 'T' X-NDS_NAME 'Tree Root' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP ( Top $ ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST dc MAY ( searchGuide $ o $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ associatedName $ description $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'dc' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' AUXILIARY MUST dc X-NDS_NAMING 'dc' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.33 NAME 'ndsLoginProperties' SUP Top ABSTRACT MAY ( groupMembership $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ Language $ lockedByIntruder $ serverHolds $ lastLoginTime $ higherPrivileges $ securityFlags $ profileMembership $ Timezone $ loginActivationTime $ UTF8LoginScript $ loginScriptCharset $ sASNDSPasswordWindow $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAllowableSubjectNames $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPCounter $ sasOTPDigits $ sasOTPReSync $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordKey $ nspmPassword $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ nsimHint $ nsimPasswordReminder $ userPassword ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.141.6.1 NAME 'federationBoundary' AUXILIARY MUST federationBoundaryType MAY ( federationControl $ federationDNSName $ federationSearchPath ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.34 NAME 'ndsContainerLoginProperties' SUP Top ABSTRACT MAY ( loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPDigits $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordPolicyDN ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.6.3 NAME 'ndsPredicateStats' SUP Top STRUCTURAL MUST ( cn $ ndsPredicateState $ ndsPredicateFlush ) MAY ( ndsPredicate $ ndsPredicateTimeout $ ndsPredicateUseValues ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.400.1 NAME 'edirSchemaVersion' SUP Top ABSTRACT MAY edirSchemaFlagVersion X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.47 NAME 'immediateSuperiorReference' AUXILIARY MAY ref X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.1 NAME 'ldapServer' SUP Top STRUCTURAL MUST cn MAY ( ldapHostServer $ ldapGroupDN $ ldapTraceLevel $ ldapServerBindLimit $ ldapServerIdleTimeout $ lDAPUDPPort $ lDAPSearchSizeLimit $ lDAPSearchTimeLimit $ lDAPLogLevel $ lDAPLogFilename $ lDAPBackupLogFilename $ lDAPLogSizeLimit $ Version $ searchSizeLimit $ searchTimeLimit $ ldapEnableTCP $ ldapTCPPort $ ldapEnableSSL $ ldapSSLPort $ ldapKeyMaterialName $ filteredReplicaUsage $ extensionInfo $ nonStdClientSchemaCompatMode $ sslEnableMutualAuthentication $ ldapEnablePSearch $ ldapMaximumPSearchOperations $ ldapIgnorePSearchLimitsForEvents $ ldapTLSTrustedRootContainer $ ldapEnableMonitorEvents $ ldapMaximumMonitorEventsLoad $ ldapTLSRequired $ ldapTLSVerifyClientCertificate $ ldapConfigVersion $ ldapDerefAlias $ ldapNonStdAllUserAttrsMode $ ldapBindRestrictions $ ldapDefaultReferralBehavior $ ldapReferral $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ ldapLBURPNumWriterThreads $ ldapInterfaces $ ldapChainSecureRequired $ ldapStdCompliance $ ldapDerefAliasOnAuth $ ldapGeneralizedTime $ ldapPermissiveModify ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Server' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.2 NAME 'ldapGroup' SUP Top STRUCTURAL MUST cn MAY ( ldapReferral $ ldapServerList $ ldapAllowClearTextPassword $ ldapAnonymousIdentity $ lDAPSuffix $ ldapAttributeMap $ ldapClassMap $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ transitionGroupDN $ ldapAttributeList $ ldapClassList $ ldapConfigVersion $ Version $ ldapDefaultReferralBehavior $ ldapTransitionBackLink $ referralIncludeFilter $ referralExcludeFilter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Group' X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.22 NAME 'pkiCA' AUXILIARY MAY ( cACertificate $ certificateRevocationList $ authorityRevocationList $ crossCertificatePair $ attributeCertificate $ publicKey $ privateKey $ networkAddress $ loginTime $ lastLoginTime ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.21 NAME 'pkiUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.11 NAME 'applicationProcess' SUP Top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.12 NAME 'applicationEntity' SUP Top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.13 NAME 'dSA' SUP applicationEntity STRUCTURAL MAY knowledgeInformation X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.16 NAME 'certificationAuthority' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.18 NAME 'userSecurityInformation' AUXILIARY MAY supportedAlgorithms X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.20 NAME 'dmd' SUP ndsLoginProperties AUXILIARY MUST dmdName MAY ( searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ description $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY ( crossCertificatePair $ deltaRevocationList ) X-NDS_NAME 'certificationAuthorityVer2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.3.6.1 NAME 'httpServer' SUP Top STRUCTURAL MUST cn MAY ( httpHostServerDN $ httpThreadsPerCPU $ httpIOBufferSize $ httpRequestTimeout $ httpKeepAliveRequestTimeout $ httpSessionTimeout $ httpKeyMaterialObject $ httpTraceLevel $ httpAuthRequiresTLS $ httpDefaultClearPort $ httpDefaultTLSPort $ httpBindRestrictions ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.64.6.1.1 NAME 'Template' SUP Top STRUCTURAL MUST cn MAY ( trusteesOfNewObject $ newObjectSDSRights $ newObjectSFSRights $ setupScript $ runSetupScript $ membersOfTemplate $ volumeSpaceRestrictions $ setPasswordAfterCreate $ homeDirectoryRights $ accountBalance $ allowUnlimitedCredit $ description $ eMailAddress $ facsimileTelephoneNumber $ groupMembership $ higherPrivileges $ ndsHomeDirectory $ l $ Language $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginMaximumSimultaneous $ loginScript $ mailboxID $ mailboxLocation $ member $ messageServer $ minimumAccountBalance $ networkAddressRestriction $ newObjectSSelfRights $ ou $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ Profile $ st $ street $ securityEquals $ securityFlags $ seeAlso $ telephoneNumber $ title $ assistant $ assistantPhone $ city $ company $ co $ manager $ managerWorkforceID $ mailstop $ siteLocation $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ departmentNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.1 NAME 'homeInfo' AUXILIARY MAY ( homeCity $ homeEmailAddress $ homeFax $ homePhone $ homeState $ homePostalAddress $ homeZipCode $ personalMobile $ spouse $ children ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.2 NAME 'contingentWorker' AUXILIARY MAY ( vendorName $ vendorAddress $ vendorPhoneNumber ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.45 NAME 'dynamicGroup' SUP ( groupOfNames $ ndsLoginProperties ) STRUCTURAL MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.46 NAME 'dynamicGroupAux' SUP ( groupOfNames $ ndsLoginProperties ) AUXILIARY MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.6.1.1 NAME 'sASSecurity' SUP Top STRUCTURAL MUST cn MAY ( nDSPKITreeCADN $ masvPolicyDN $ sASLoginPolicyDN $ sASLoginMethodContainerDN $ sasPostLoginMethodContainerDN $ nspmPolicyAgentContainerDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Organization' 'domain' ) X-NDS_NAME 'SAS:Security' )", + "( 2.16.840.1.113719.1.39.6.1.2 NAME 'sASService' SUP Resource STRUCTURAL MAY ( hostServer $ privateKey $ publicKey $ allowUnlimitedCredit $ fullName $ lastLoginTime $ lockedByIntruder $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginTime $ networkAddress $ networkAddressRestriction $ notify $ operator $ owner $ path $ securityEquals $ securityFlags $ status $ Version $ nDSPKIKeyMaterialDN $ ndspkiKMOExport ) X-NDS_NAMING 'cn' X-NDS_NAME 'SAS:Service' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.1 NAME 'nDSPKICertificateAuthority' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ cACertificate $ ndspkiCRLContainerDN $ ndspkiIssuedCertContainerDN $ ndspkiCRLConfigurationDNList $ ndspkiSecurityRightsLevel ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:Certificate Authority' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.2 NAME 'nDSPKIKeyMaterial' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIKeyFile $ nDSPKIPrivateKey $ nDSPKIPublicKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKISubjectName $ nDSPKIGivenName $ ndspkiAdditionalRoots $ nDSPKINotBefore $ nDSPKINotAfter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'NDSPKI:Key Material' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.3 NAME 'nDSPKITrustedRoot' SUP Top STRUCTURAL MUST cn MAY ndspkiTrustedRootList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NAME 'NDSPKI:Trusted Root' )", + "( 2.16.840.1.113719.1.48.6.1.4 NAME 'nDSPKITrustedRootObject' SUP Top STRUCTURAL MUST ( cn $ nDSPKITrustedRootCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKITrustedRoot' X-NDS_NAME 'NDSPKI:Trusted Root Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.101 NAME 'nDSPKISDKeyAccessPartition' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:SD Key Access Partition' )", + "( 2.16.840.1.113719.1.48.6.1.102 NAME 'nDSPKISDKeyList' SUP Top STRUCTURAL MUST cn MAY ( nDSPKISDKeyServerDN $ nDSPKISDKeyStruct $ nDSPKISDKeyCert ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKISDKeyAccessPartition' X-NDS_NAME 'NDSPKI:SD Key List' )", + "( 2.16.840.1.113719.1.31.6.2.1 NAME 'mASVSecurityPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ masvDomainPolicy $ masvPolicyUpdate $ masvClearanceNames $ masvLabelNames $ masvLabelSecrecyLevelNames $ masvLabelSecrecyCategoryNames $ masvLabelIntegrityLevelNames $ masvLabelIntegrityCategoryNames $ masvNDSAttributeLabels ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'MASV:Security Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.1 NAME 'sASLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'SAS:Login Method Container' )", + "( 2.16.840.1.113719.1.39.42.2.0.4 NAME 'sASLoginPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ privateKey $ publicKey $ sASAllowNDSPasswordWindow $ sASPolicyCredentials $ sASPolicyMethods $ sASPolicyObjectVersion $ sASPolicyServiceSubtypes $ sASPolicyServices $ sASPolicyUsers $ sASLoginSequence $ sASLoginPolicyUpdate $ sasNMASProductOptions $ sasPolicyMethods $ sasPolicyServices $ sasPolicyUsers $ sasAllowNDSPasswordWindow $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAuditConfiguration $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPLookAheadWindow $ sasOTPDigits $ sasUpdateLoginTimeInterval $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'SAS:Login Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.7 NAME 'sASNMASBaseLoginMethod' SUP Top ABSTRACT MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasCertificateSearchContainers $ sasNMASMethodConfigData $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASLoginMethodContainer' X-NDS_NAME 'SAS:NMAS Base Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.8 NAME 'sASNMASLoginMethod' SUP sASNMASBaseLoginMethod STRUCTURAL X-NDS_NAME 'SAS:NMAS Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.9 NAME 'rADIUSDialAccessSystem' SUP Top STRUCTURAL MUST cn MAY ( publicKey $ privateKey $ rADIUSAgedInterval $ rADIUSClient $ rADIUSCommonNameResolution $ rADIUSConcurrentLimit $ rADIUSDASVersion $ rADIUSEnableCommonNameLogin $ rADIUSEnableDialAccess $ rADIUSInterimAcctingTimeout $ rADIUSLookupContexts $ rADIUSMaxDASHistoryRecord $ rADIUSMaximumHistoryRecord $ rADIUSPasswordPolicy $ rADIUSPrivateKey $ rADIUSProxyContext $ rADIUSProxyDomain $ rADIUSProxyTarget $ rADIUSPublicKey $ sASLoginConfiguration $ sASLoginConfigurationKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Dial Access System' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.10 NAME 'rADIUSProfile' SUP Top STRUCTURAL MUST cn MAY rADIUSAttributeList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Profile' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.11 NAME 'sasPostLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.39.42.2.0.12 NAME 'sasPostLoginMethod' SUP Top STRUCTURAL MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sasPostLoginMethodContainer' )", + "( 2.16.840.1.113719.1.6.6.1 NAME 'snmpGroup' SUP Top STRUCTURAL MUST cn MAY ( Version $ snmpServerList $ snmpTrapDisable $ snmpTrapInterval $ snmpTrapDescription $ snmpTrapConfig ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.2 NAME 'nspmPasswordPolicyContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) )", + "( 2.16.840.1.113719.1.39.43.6.3 NAME 'nspmPolicyAgent' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyAgentNetWare $ nspmPolicyAgentWINNT $ nspmPolicyAgentSolaris $ nspmPolicyAgentLinux $ nspmPolicyAgentAIX $ nspmPolicyAgentHPUX ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nspmPasswordPolicyContainer' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.1 NAME 'nspmPasswordPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyPrecedence $ nspmConfigurationOptions $ nspmChangePasswordMessage $ passwordExpirationInterval $ loginGraceLimit $ nspmMinPasswordLifetime $ passwordUniqueRequired $ nspmPasswordHistoryLimit $ nspmPasswordHistoryExpiration $ passwordAllowChange $ passwordRequired $ passwordMinimumLength $ nspmMaximumLength $ nspmCaseSensitive $ nspmMinUpperCaseCharacters $ nspmMaxUpperCaseCharacters $ nspmMinLowerCaseCharacters $ nspmMaxLowerCaseCharacters $ nspmNumericCharactersAllowed $ nspmNumericAsFirstCharacter $ nspmNumericAsLastCharacter $ nspmMinNumericCharacters $ nspmMaxNumericCharacters $ nspmSpecialCharactersAllowed $ nspmSpecialAsFirstCharacter $ nspmSpecialAsLastCharacter $ nspmMinSpecialCharacters $ nspmMaxSpecialCharacters $ nspmMaxRepeatedCharacters $ nspmMaxConsecutiveCharacters $ nspmMinUniqueCharacters $ nspmDisallowedAttributeValues $ nspmExcludeList $ nspmExtendedCharactersAllowed $ nspmExtendedAsFirstCharacter $ nspmExtendedAsLastCharacter $ nspmMinExtendedCharacters $ nspmMaxExtendedCharacters $ nspmUpperAsFirstCharacter $ nspmUpperAsLastCharacter $ nspmLowerAsFirstCharacter $ nspmLowerAsLastCharacter $ nspmComplexityRules $ nspmAD2K8Syntax $ nspmAD2K8maxViolation $ nspmXCharLimit $ nspmXCharHistoryLimit $ nspmUnicodeAllowed $ nspmNonAlphaCharactersAllowed $ nspmMinNonAlphaCharacters $ nspmMaxNonAlphaCharacters $ pwdInHistory $ nspmAdminsDoNotExpirePassword $ nspmPasswordACL $ nsimChallengeSetDN $ nsimForgottenAction $ nsimForgottenLoginConfig $ nsimAssignments $ nsimChallengeSetGUID $ nsimPwdRuleEnforcement ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'domain' 'Locality' 'Organization' 'organizationalUnit' 'Country' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.4 NAME 'nspmPasswordAux' AUXILIARY MAY ( publicKey $ privateKey $ loginGraceLimit $ loginGraceRemaining $ passwordExpirationTime $ passwordRequired $ nspmPasswordKey $ nspmPassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.12.6.1.0 NAME 'auditFileObject' SUP Top STRUCTURAL MUST ( cn $ auditPolicy $ auditContents ) MAY ( description $ auditPath $ auditLinkList $ auditType $ auditCurrentEncryptionKey $ auditAEncryptionKey $ auditBEncryptionKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'treeRoot' 'domain' ) X-NDS_NAME 'Audit:File Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.38.6.1.4 NAME 'wANMANLANArea' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ o $ ou $ owner $ seeAlso $ wANMANWANPolicy $ wANMANCost $ wANMANDefaultCost ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NAME 'WANMAN:LAN Area' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.37.1 NAME 'rbsCollection' SUP Top STRUCTURAL MUST cn MAY ( owner $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.30.1 NAME 'rbsExternalScope' SUP Top ABSTRACT MUST cn MAY ( rbsURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.31.1 NAME 'rbsModule' SUP Top STRUCTURAL MUST cn MAY ( rbsURL $ rbsPath $ rbsType $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.32.1 NAME 'rbsRole' SUP Top STRUCTURAL MUST cn MAY ( rbsContent $ rbsMember $ rbsTrusteeOf $ rbsGALabel $ rbsParameters $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.33.1 NAME 'rbsTask' SUP Top STRUCTURAL MUST cn MAY ( rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ rbsTaskTemplates $ rbsTaskTemplatesURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.34.1 NAME 'rbsBook' SUP rbsTask STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.35.1 NAME 'rbsScope' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.45.1 NAME 'rbsCollection2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsParameters $ owner $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.38.1 NAME 'rbsExternalScope2' SUP Top ABSTRACT MUST cn MAY ( rbsXMLInfo $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.39.1 NAME 'rbsModule2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsPath $ rbsType $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.40.1 NAME 'rbsRole2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContent $ rbsMember $ rbsTrusteeOf $ rbsParameters $ description $ rbsCategoryMembership ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.41.1 NAME 'rbsTask2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.42.1 NAME 'rbsBook2' SUP rbsTask2 STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.43.1 NAME 'rbsScope2' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.49 NAME 'prSyncPolicy' SUP Top STRUCTURAL MUST cn MAY prSyncAttributes X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.50 NAME 'encryptionPolicy' SUP Top STRUCTURAL MUST cn MAY ( attrEncryptionDefinition $ attrEncryptionRequiresSecure ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.5 NAME 'ndspkiContainer' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'ndspkiContainer' 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'nDSPKITrustedRoot' ) )", + "( 2.16.840.1.113719.1.48.6.1.6 NAME 'ndspkiCertificate' SUP Top STRUCTURAL MUST ( cn $ userCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'ndspkiContainer' 'nDSPKITrustedRoot' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.7 NAME 'ndspkiCRLConfiguration' SUP Top STRUCTURAL MUST cn MAY ( ndspkiCRLFileName $ ndspkiDirectory $ ndspkiStatus $ ndspkiIssueTime $ ndspkiNextIssueTime $ ndspkiAttemptTime $ ndspkiTimeInterval $ ndspkiCRLMaxProcessingInterval $ ndspkiCRLNumber $ ndspkiDistributionPoints $ ndspkiDistributionPointDN $ ndspkiCADN $ ndspkiCRLProcessData $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ cACertificate $ hostServer ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'ndspkiContainer' )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP Top STRUCTURAL MUST cn MAY ( authorityRevocationList $ authorityRevocationList $ cACertificate $ certificateRevocationList $ certificateRevocationList $ crossCertificatePair $ deltaRevocationList $ deltaRevocationList $ ndspkiCRLConfigurationDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'sASSecurity' 'domain' 'ndspkiCRLConfiguration' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.7.6.1 NAME 'notfTemplateCollection' SUP Top STRUCTURAL MUST cn MAY ( notfSMTPEmailHost $ notfSMTPEmailFrom $ notfSMTPEmailUserName $ sASSecretStore ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.7.6.2 NAME 'notfMergeTemplate' SUP Top STRUCTURAL MUST cn MAY ( notfMergeTemplateData $ notfMergeTemplateSubject ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'notfTemplateCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.44.6.1 NAME 'nsimChallengeSet' SUP Top STRUCTURAL MUST cn MAY ( description $ nsimRequiredQuestions $ nsimRandomQuestions $ nsimNumberRandomQuestions $ nsimMinResponseLength $ nsimMaxResponseLength ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.266.6.1 NAME 'sssServerPolicies' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.266.6.2 NAME 'sssServerPolicyOverride' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sssServerPolicies' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.91 NAME 'nestedGroupAux' AUXILIARY MAY ( groupMember $ excludedMember $ nestedConfig $ groupMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.46.1 NAME 'rbsCategory2' SUP Top STRUCTURAL MUST cn MAY ( rbsRoleMember $ rbsXMLInfo $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' X-NDS_NOT_CONTAINER '1' )" + ] + }, + "schema_entry": "cn=schema", + "type": "SchemaInfo" +} +""" + +edir_8_8_8_dsa_info = """ +{ + "raw": { + "abandonOps": [ + "0" + ], + "addEntryOps": [ + "947" + ], + "altServer": [], + "bindSecurityErrors": [ + "3" + ], + "chainings": [ + "0" + ], + "compareOps": [ + "61" + ], + "directoryTreeName": [ + "EDIR-TEST" + ], + "dsaName": [ + "cn=edir1,o=services" + ], + "errors": [ + "984" + ], + "extendedOps": [ + "213" + ], + "inBytes": [ + "1253717" + ], + "inOps": [ + "14342" + ], + "listOps": [ + "0" + ], + "modifyEntryOps": [ + "121" + ], + "modifyRDNOps": [ + "63" + ], + "namingContexts": [ + "" + ], + "oneLevelSearchOps": [ + "129" + ], + "outBytes": [ + "547685251" + ], + "readOps": [ + "7427" + ], + "referralsReturned": [ + "0" + ], + "removeEntryOps": [ + "146" + ], + "repUpdatesIn": [ + "0" + ], + "repUpdatesOut": [ + "0" + ], + "searchOps": [ + "8316" + ], + "securityErrors": [ + "3" + ], + "simpleAuthBinds": [ + "1654" + ], + "strongAuthBinds": [ + "57" + ], + "subschemaSubentry": [ + "cn=schema" + ], + "supportedControl": [ + "2.16.840.1.113719.1.27.101.6", + "2.16.840.1.113719.1.27.101.5", + "1.2.840.113556.1.4.319", + "2.16.840.1.113730.3.4.3", + "2.16.840.1.113730.3.4.2", + "2.16.840.1.113719.1.27.103.7", + "2.16.840.1.113719.1.27.101.40", + "2.16.840.1.113719.1.27.101.41", + "1.2.840.113556.1.4.1413", + "1.2.840.113556.1.4.805" + ], + "supportedExtension": [ + "2.16.840.1.113719.1.148.100.1", + "2.16.840.1.113719.1.148.100.3", + "2.16.840.1.113719.1.148.100.5", + "2.16.840.1.113719.1.148.100.7", + "2.16.840.1.113719.1.148.100.9", + "2.16.840.1.113719.1.148.100.11", + "2.16.840.1.113719.1.148.100.13", + "2.16.840.1.113719.1.148.100.15", + "2.16.840.1.113719.1.148.100.17", + "2.16.840.1.113719.1.39.42.100.1", + "2.16.840.1.113719.1.39.42.100.3", + "2.16.840.1.113719.1.39.42.100.5", + "2.16.840.1.113719.1.39.42.100.7", + "2.16.840.1.113719.1.39.42.100.9", + "2.16.840.1.113719.1.39.42.100.11", + "2.16.840.1.113719.1.39.42.100.13", + "2.16.840.1.113719.1.39.42.100.15", + "2.16.840.1.113719.1.39.42.100.17", + "2.16.840.1.113719.1.39.42.100.19", + "2.16.840.1.113719.1.39.42.100.21", + "2.16.840.1.113719.1.39.42.100.23", + "2.16.840.1.113719.1.39.42.100.25", + "2.16.840.1.113719.1.39.42.100.27", + "2.16.840.1.113719.1.27.100.1", + "2.16.840.1.113719.1.27.100.3", + "2.16.840.1.113719.1.27.100.5", + "2.16.840.1.113719.1.27.100.7", + "2.16.840.1.113719.1.27.100.11", + "2.16.840.1.113719.1.27.100.13", + "2.16.840.1.113719.1.27.100.15", + "2.16.840.1.113719.1.27.100.17", + "2.16.840.1.113719.1.27.100.19", + "2.16.840.1.113719.1.27.100.21", + "2.16.840.1.113719.1.27.100.23", + "2.16.840.1.113719.1.27.100.25", + "2.16.840.1.113719.1.27.100.27", + "2.16.840.1.113719.1.27.100.29", + "2.16.840.1.113719.1.27.100.31", + "2.16.840.1.113719.1.27.100.33", + "2.16.840.1.113719.1.27.100.35", + "2.16.840.1.113719.1.27.100.37", + "2.16.840.1.113719.1.27.100.39", + "2.16.840.1.113719.1.27.100.41", + "2.16.840.1.113719.1.27.100.96", + "2.16.840.1.113719.1.27.100.98", + "2.16.840.1.113719.1.27.100.101", + "2.16.840.1.113719.1.27.100.103", + "2.16.840.1.113719.1.142.100.1", + "2.16.840.1.113719.1.142.100.4", + "2.16.840.1.113719.1.142.100.6", + "2.16.840.1.113719.1.27.100.9", + "2.16.840.1.113719.1.27.100.43", + "2.16.840.1.113719.1.27.100.45", + "2.16.840.1.113719.1.27.100.47", + "2.16.840.1.113719.1.27.100.49", + "2.16.840.1.113719.1.27.100.51", + "2.16.840.1.113719.1.27.100.53", + "2.16.840.1.113719.1.27.100.55", + "1.3.6.1.4.1.1466.20037", + "2.16.840.1.113719.1.27.100.79", + "2.16.840.1.113719.1.27.100.84", + "2.16.840.1.113719.1.27.103.1", + "2.16.840.1.113719.1.27.103.2" + ], + "supportedFeatures": [ + "1.3.6.1.4.1.4203.1.5.1", + "2.16.840.1.113719.1.27.99.1" + ], + "supportedGroupingTypes": [ + "2.16.840.1.113719.1.27.103.8" + ], + "supportedLDAPVersion": [ + "2", + "3" + ], + "supportedSASLMechanisms": [ + "NMAS_LOGIN", + "EXTERNAL", + "DIGEST-MD5", + "GSSAPI" + ], + "unAuthBinds": [ + "1897" + ], + "vendorName": [ + "NetIQ Corporation" + ], + "vendorVersion": [ + "LDAP Agent for NetIQ eDirectory 8.8 SP8 (20804.04)" + ], + "wholeSubtreeSearchOps": [ + "760" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir914.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir914.py new file mode 100644 index 0000000..0a1d2e6 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/edir914.py @@ -0,0 +1,1157 @@ +""" +""" + +# Created on 2019.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +edir_9_1_4_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 2.5.4.35 NAME 'userPassword' DESC 'Internal NDS policy forces this to be single-valued' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} USAGE directoryOperation )", + "( 2.5.18.1 NAME 'createTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.2 NAME 'modifyTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.10 NAME 'subschemaSubentry' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation )", + "( 2.5.21.9 NAME 'structuralObjectClass' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.49 NAME 'subordinateCount' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.48 NAME 'entryFlags' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.51 NAME 'federationBoundary' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.21.5 NAME 'attributeTypes' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", + "( 2.5.21.6 NAME 'objectClasses' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", + "( 1.3.6.1.1.20 NAME 'entryDN' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.1.4.1.2 NAME 'ACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.1 NAME 'aliasedObjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Aliased Object Name' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.6 NAME 'backLink' SYNTAX 2.16.840.1.113719.1.1.5.1.23 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Back Link' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.8 NAME 'binderyProperty' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Property' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.7 NAME 'binderyObjectRestriction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Object Restriction' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.9 NAME 'binderyType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Type' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.11 NAME 'cAPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.12 NAME 'cAPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.10 NAME 'Cartridge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'CN' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.78 NAME 'printerConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Printer Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.15 NAME 'Convergence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{1} SINGLE-VALUE X-NDS_UPPER_BOUND '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2} SINGLE-VALUE X-NDS_NAME 'C' X-NDS_LOWER_BOUND '2' X-NDS_UPPER_BOUND '2' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.18 NAME 'defaultQueue' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Default Queue' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.13 NAME ( 'description' 'multiLineDescription' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} X-NDS_NAME 'Description' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '1024' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.64 NAME 'partitionCreationTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Creation Time' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.23 NAME 'facsimileTelephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22{64512} X-NDS_NAME 'Facsimile Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.117 NAME 'highConvergenceSyncInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'High Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.25 NAME 'groupMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Group Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.26 NAME 'ndsHomeDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{255} SINGLE-VALUE X-NDS_NAME 'Home Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.27 NAME 'hostDevice' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Device' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.28 NAME 'hostResourceName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Host Resource Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.29 NAME 'hostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.30 NAME 'inheritedACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Inherited ACL' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.7 NAME ( 'l' 'localityname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'L' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.39 NAME 'loginAllowedTimeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{42} SINGLE-VALUE X-NDS_NAME 'Login Allowed Time Map' X-NDS_LOWER_BOUND '42' X-NDS_UPPER_BOUND '42' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.40 NAME 'loginDisabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Login Disabled' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.41 NAME 'loginExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.42 NAME 'loginGraceLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Grace Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.43 NAME 'loginGraceRemaining' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Grace Remaining' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.44 NAME 'loginIntruderAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 SINGLE-VALUE X-NDS_NAME 'Login Intruder Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.45 NAME 'loginIntruderAttempts' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Intruder Attempts' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.46 NAME 'loginIntruderLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Intruder Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.31 NAME 'intruderAttemptResetInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Attempt Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.47 NAME 'loginIntruderResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Intruder Reset Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.48 NAME 'loginMaximumSimultaneous' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Maximum Simultaneous' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.49 NAME 'loginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Login Script' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.50 NAME 'loginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.31 NAME ( 'member' 'uniqueMember' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Member' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.52 NAME 'Memory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.22 NAME 'eMailAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.14{64512} X-NDS_NAME 'EMail Address' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.55 NAME 'networkAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.56 NAME 'networkAddressRestriction' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address Restriction' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.57 NAME 'notify' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Notify' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.114 NAME 'Obituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.0 NAME 'objectClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_NAME 'Object Class' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.59 NAME 'operator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Operator' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'OU' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.10 NAME ( 'o' 'organizationname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'O' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.32 NAME 'owner' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Owner' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.63 NAME 'pageDescriptionLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Page Description Language' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.65 NAME 'passwordsUsed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'Passwords Used' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.66 NAME 'passwordAllowChange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Allow Change' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.67 NAME 'passwordExpirationInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Password Expiration Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.68 NAME 'passwordExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Password Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.69 NAME 'passwordMinimumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Password Minimum Length' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.70 NAME 'passwordRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.71 NAME 'passwordUniqueRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Unique Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.72 NAME 'path' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Path' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'Physical Delivery Office Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.16 NAME 'postalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'Postal Address' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.17 NAME 'postalCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Code' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.18 NAME 'postOfficeBox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Office Box' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.80 NAME 'printJobConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Print Job Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.79 NAME 'printerControl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Printer Control' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.82 NAME 'privateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.83 NAME 'Profile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.84 NAME 'publicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.85 NAME 'queue' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Queue' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.86 NAME 'queueDirectory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE X-NDS_NAME 'Queue Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.115 NAME 'Reference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.88 NAME 'Replica' SYNTAX 2.16.840.1.113719.1.1.5.1.16{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.89 NAME 'Resource' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.33 NAME 'roleOccupant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Role Occupant' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.116 NAME 'higherPrivileges' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Higher Privileges' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.92 NAME 'securityEquals' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Security Equals' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.34 NAME 'seeAlso' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'See Also' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.5 NAME 'serialNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Serial Number' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.95 NAME 'server' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Server' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'S' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.98 NAME 'status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Status' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.5.4.9 NAME 'street' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'SA' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.102 NAME 'supportedTypefaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Typefaces' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.101 NAME 'supportedServices' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Services' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.4 NAME ( 'sn' 'surname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Surname' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.20 NAME 'telephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} X-NDS_NAME 'Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.12 NAME 'title' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Title' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.111 NAME 'User' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.112 NAME 'Version' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.1 NAME 'accountBalance' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.4 NAME 'allowUnlimitedCredit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Allow Unlimited Credit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.118 NAME 'lowConvergenceResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Low Convergence Reset Time' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.54 NAME 'minimumAccountBalance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Minimum Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.104 NAME 'lowConvergenceSyncInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Low Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.21 NAME 'Device' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.53 NAME 'messageServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Message Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.34 NAME 'Language' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.100 NAME 'supportedConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Supported Connections' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.107 NAME 'typeCreatorMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Type Creator Map' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.108 NAME 'ndsUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'UID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.24 NAME 'groupID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'GID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.110 NAME 'unknownBaseClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Unknown Base Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.87 NAME 'receivedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.33 NAME 'synchronizedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Synchronized Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.5 NAME 'authorityRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Authority Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.13 NAME 'certificateRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Certificate Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.17 NAME 'ndsCrossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Cross Certificate Pair' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.37 NAME 'lockedByIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Locked By Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.77 NAME 'printer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Printer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.20 NAME 'detectIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Detect Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.38 NAME 'lockoutAfterDetection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Lockout After Detection' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.32 NAME 'intruderLockoutResetInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Lockout Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.96 NAME 'serverHolds' SYNTAX 2.16.840.1.113719.1.1.5.1.26 X-NDS_NAME 'Server Holds' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.91 NAME 'sAPName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{47} SINGLE-VALUE X-NDS_NAME 'SAP Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '47' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.113 NAME 'Volume' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.35 NAME 'lastLoginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Last Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.81 NAME 'printServer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 SINGLE-VALUE X-NDS_NAME 'Print Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.119 NAME 'nNSDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'NNS Domain' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.120 NAME 'fullName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{127} X-NDS_NAME 'Full Name' X-NDS_UPPER_BOUND '127' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.121 NAME 'partitionControl' SYNTAX 2.16.840.1.113719.1.1.5.1.25 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Control' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.122 NAME 'revision' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Revision' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.123 NAME 'certificateValidityInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'Certificate Validity Interval' X-NDS_LOWER_BOUND '60' X-NDS_UPPER_BOUND '-1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.124 NAME 'externalSynchronizer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'External Synchronizer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.125 NAME 'messagingDatabaseLocation' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Messaging Database Location' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.126 NAME 'messageRoutingGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Message Routing Group' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.127 NAME 'messagingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Messaging Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.128 NAME 'Postmaster' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.162 NAME 'mailboxLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Mailbox Location' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.163 NAME 'mailboxID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Mailbox ID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.164 NAME 'externalName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'External Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.165 NAME 'securityFlags' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Security Flags' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.166 NAME 'messagingServerType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE X-NDS_NAME 'Messaging Server Type' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.167 NAME 'lastReferencedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Last Referenced Time' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.42 NAME 'givenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_NAME 'Given Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.43 NAME 'initials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} X-NDS_NAME 'Initials' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.44 NAME 'generationQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Generational Qualifier' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.171 NAME 'profileMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Profile Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.172 NAME 'dsRevision' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'DS Revision' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.16.840.1.113719.1.1.4.1.173 NAME 'supportedGateway' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} X-NDS_NAME 'Supported Gateway' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '4096' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.174 NAME 'equivalentToMe' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Equivalent To Me' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.175 NAME 'replicaUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Replica Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.176 NAME 'partitionStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Status' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.177 NAME 'permanentConfigParms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Permanent Config Parms' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.178 NAME 'Timezone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.179 NAME 'binderyRestrictionLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Bindery Restriction Level' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.180 NAME 'transitiveVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Transitive Vector' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.181 NAME 'T' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.183 NAME 'purgeVector' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Purge Vector' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.184 NAME 'synchronizationTolerance' SYNTAX 2.16.840.1.113719.1.1.5.1.19 USAGE directoryOperation X-NDS_NAME 'Synchronization Tolerance' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.185 NAME 'passwordManagement' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Password Management' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.186 NAME 'usedBy' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Used By' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.187 NAME 'Uses' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.500 NAME 'obituaryNotify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Obituary Notify' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.501 NAME 'GUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.502 NAME 'otherGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} USAGE directoryOperation X-NDS_NAME 'Other GUID' X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.503 NAME 'auxiliaryClassFlag' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Auxiliary Class Flag' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.504 NAME 'unknownAuxiliaryClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} USAGE directoryOperation X-NDS_NAME 'Unknown Auxiliary Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userId' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'uniqueID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.1.25 NAME 'dc' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} X-NDS_NAME 'dc' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.507 NAME 'auxClassObjectClassBackup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'AuxClass Object Class Backup' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.508 NAME 'localReceivedUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Local Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.4 NAME 'federationControl' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.2 NAME 'federationSearchPath' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.3 NAME 'federationDNSName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.1 NAME 'federationBoundaryType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.14.4.1.4 NAME 'DirXML-Associations' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.18.3 NAME 'creatorsName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.18.4 NAME 'modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.300 NAME 'languageId' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.35 NAME 'ndsPredicate' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.36 NAME 'ndsPredicateState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.37 NAME 'ndsPredicateFlush' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.38 NAME 'ndsPredicateTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.40 NAME 'ndsPredicateStatsDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.39 NAME 'ndsPredicateUseValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.601 NAME 'syncPanePoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.600 NAME 'syncWindowVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.602 NAME 'objectVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'memberQueryURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'memberQuery' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.302 NAME 'excludedMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.525 NAME 'auxClassCompatibility' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.518 NAME 'ndsAgentPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.519 NAME 'ndsOperationCheckpoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.520 NAME 'localReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.521 NAME 'treeReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.522 NAME 'schemaResetLock' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.523 NAME 'modifiedACLEntry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.524 NAME 'monitoredConnection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.526 NAME 'localFederationBoundary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.527 NAME 'replicationFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.721 NAME 'ServerEBAEnabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.716 NAME 'EBATreeConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.722 NAME 'EBAPartitionConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.723 NAME 'EBAServerConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.1.4.1.296 NAME 'loginActivationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.687 NAME 'UpdateInProgress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.720 NAME 'dsContainerReadyAttrs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.400.1 NAME 'edirSchemaFlagVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.512 NAME 'indexDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.513 NAME 'ndsStatusRepair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.514 NAME 'ndsStatusExternalReference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.515 NAME 'ndsStatusObituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.516 NAME 'ndsStatusSchema' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.517 NAME 'ndsStatusLimber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.511 NAME 'authoritative' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'CachedAttrsOnExtRefs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.547 NAME 'ExtRefLastUpdatedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.688 NAME 'NCPKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.1.4.713 NAME 'UTF8LoginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.714 NAME 'loginScriptCharset' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.721 NAME 'NDSRightsToMonitor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.1.192 NAME 'lDAPLogLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Log Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.12 NAME 'lDAPUDPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP UDP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.1.4.1.204 NAME 'lDAPLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.205 NAME 'lDAPBackupLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Backup Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.206 NAME 'lDAPLogSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Log Size Limit' X-NDS_LOWER_BOUND '2048' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.1.4.1.194 NAME 'lDAPSearchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Size Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.195 NAME 'lDAPSearchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Time Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.207 NAME 'lDAPSuffix' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Suffix' )", + "( 2.16.840.1.113719.1.27.4.70 NAME 'ldapConfigVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.14 NAME 'ldapReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Referral' )", + "( 2.16.840.1.113719.1.27.4.73 NAME 'ldapDefaultReferralBehavior' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.23 NAME 'ldapSearchReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:searchReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.24 NAME 'lDAPOtherReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:otherReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.1 NAME 'ldapHostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Host Server' )", + "( 2.16.840.1.113719.1.27.4.2 NAME 'ldapGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Group' )", + "( 2.16.840.1.113719.1.27.4.3 NAME 'ldapTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Screen Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.4 NAME 'searchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.5 NAME 'searchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.6 NAME 'ldapServerBindLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Bind Limit' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.7 NAME 'ldapServerIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Idle Timeout' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.8 NAME 'ldapEnableTCP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable TCP' )", + "( 2.16.840.1.113719.1.27.4.10 NAME 'ldapEnableSSL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable SSL' )", + "( 2.16.840.1.113719.1.27.4.11 NAME 'ldapTCPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP TCP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.13 NAME 'ldapSSLPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP SSL Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.21 NAME 'filteredReplicaUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.22 NAME 'ldapKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP:keyMaterialName' )", + "( 2.16.840.1.113719.1.27.4.42 NAME 'extensionInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.27.4.45 NAME 'nonStdClientSchemaCompatMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.46 NAME 'sslEnableMutualAuthentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.62 NAME 'ldapEnablePSearch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.63 NAME 'ldapMaximumPSearchOperations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.64 NAME 'ldapIgnorePSearchLimitsForEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.65 NAME 'ldapTLSTrustedRootContainer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.27.4.66 NAME 'ldapEnableMonitorEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.67 NAME 'ldapMaximumMonitorEventsLoad' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.68 NAME 'ldapTLSRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.69 NAME 'ldapTLSVerifyClientCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.71 NAME 'ldapDerefAlias' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.72 NAME 'ldapNonStdAllUserAttrsMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.75 NAME 'ldapBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.79 NAME 'ldapInterfaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.80 NAME 'ldapChainSecureRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.82 NAME 'ldapStdCompliance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.83 NAME 'ldapDerefAliasOnAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.84 NAME 'ldapGeneralizedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.85 NAME 'ldapPermissiveModify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.86 NAME 'ldapSSLConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.27.4.15 NAME 'ldapServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server List' )", + "( 2.16.840.1.113719.1.27.4.16 NAME 'ldapAttributeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Attribute Map v11' )", + "( 2.16.840.1.113719.1.27.4.17 NAME 'ldapClassMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Class Map v11' )", + "( 2.16.840.1.113719.1.27.4.18 NAME 'ldapAllowClearTextPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Allow Clear Text Password' )", + "( 2.16.840.1.113719.1.27.4.19 NAME 'ldapAnonymousIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Anonymous Identity' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'ldapAttributeList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.53 NAME 'ldapClassList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.56 NAME 'transitionGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.74 NAME 'ldapTransitionBackLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.78 NAME 'ldapLBURPNumWriterThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.20 NAME 'ldapServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server' )", + "( 0.9.2342.19200300.100.1.3 NAME 'mail' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'Internet EMail Address' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'NSCP:employeeNumber' )", + "( 2.16.840.1.113719.1.27.4.76 NAME 'referralExcludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.77 NAME 'referralIncludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.5.4.36 NAME 'userCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'userCertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.37 NAME 'cACertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'cACertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.40 NAME 'crossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'crossCertificatePair' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.58 NAME 'attributeCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.2 NAME 'knowledgeInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25{64512} X-NDS_NAME 'searchGuide' )", + "( 2.5.4.15 NAME 'businessCategory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52{64512} X-NDS_NAME 'telexNumber' )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51{64512} X-NDS_NAME 'teletexTerminalIdentifier' )", + "( 2.5.4.24 NAME 'x121Address' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '15' )", + "( 2.5.4.25 NAME 'internationaliSDNNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '16' )", + "( 2.5.4.26 NAME 'registeredAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'registeredAddress' )", + "( 2.5.4.27 NAME 'destinationIndicator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14{64512} SINGLE-VALUE X-NDS_NAME 'preferredDeliveryMethod' )", + "( 2.5.4.29 NAME 'presentationAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.43{64512} SINGLE-VALUE X-NDS_NAME 'presentationAddress' )", + "( 2.5.4.30 NAME 'supportedApplicationContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38{64512} X-NDS_NAME 'supportedApplicationContext' )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6{64512} X-NDS_NAME 'x500UniqueIdentifier' )", + "( 2.5.4.46 NAME 'dnQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64512} )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21{64512} X-NDS_NAME 'enhancedSearchGuide' )", + "( 2.5.4.48 NAME 'protocolInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.42{64512} X-NDS_NAME 'protocolInformation' )", + "( 2.5.4.51 NAME 'houseIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.52 NAME 'supportedAlgorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49{64512} X-NDS_NAME 'supportedAlgorithms' )", + "( 2.5.4.54 NAME 'dmdName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.4.49 NAME 'dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.1 NAME 'httpServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.3.4.2 NAME 'httpHostServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.3 NAME 'httpThreadsPerCPU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.4 NAME 'httpIOBufferSize' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.5 NAME 'httpRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.6 NAME 'httpKeepAliveRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.7 NAME 'httpSessionTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.8 NAME 'httpKeyMaterialObject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.9 NAME 'httpTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.10 NAME 'httpAuthRequiresTLS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.11 NAME 'httpDefaultClearPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.12 NAME 'httpDefaultTLSPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.13 NAME 'httpBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.295 NAME 'emboxConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.54.4.1.1 NAME 'trusteesOfNewObject' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'Trustees Of New Object' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.55.4.1.1 NAME 'newObjectSDSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's DS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.56.4.1.1 NAME 'newObjectSFSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'New Object's FS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.57.4.1.1 NAME 'setupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.58.4.1.1 NAME 'runSetupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Run Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.59.4.1.1 NAME 'membersOfTemplate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Members Of Template' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.60.4.1.1 NAME 'volumeSpaceRestrictions' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Volume Space Restrictions' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.61.4.1.1 NAME 'setPasswordAfterCreate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Set Password After Create' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.62.4.1.1 NAME 'homeDirectoryRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NAME 'Home Directory Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.63.4.1.1 NAME 'newObjectSSelfRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's Self Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.8.4.1 NAME 'digitalMeID' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.2 NAME 'assistant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.3 NAME 'assistantPhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.4 NAME 'city' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.5 NAME 'company' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.43 NAME 'co' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.6 NAME 'directReports' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.7 NAME 'mailstop' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.41 NAME 'mobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.42 NAME 'pager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.8 NAME 'workforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.9 NAME 'instantMessagingID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.10 NAME 'preferredName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.8.4.11 NAME 'jobCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.12 NAME 'siteLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.13 NAME 'employeeStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.14 NAME 'costCenter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.15 NAME 'costCenterDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.16 NAME 'tollFreePhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.17 NAME 'otherPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.18 NAME 'managerWorkforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.19 NAME 'jackNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.20 NAME 'vehicleInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.21 NAME 'accessCardNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.32 NAME 'isManager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.22 NAME 'homeCity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.23 NAME 'homeEmailAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 1.3.6.1.4.1.1466.101.120.31 NAME 'homeFax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.20 NAME 'homePhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.24 NAME 'homeState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} )", + "( 2.16.840.1.113719.1.8.4.25 NAME 'homeZipCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.26 NAME 'personalMobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.27 NAME 'children' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.28 NAME 'spouse' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.29 NAME 'vendorName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.30 NAME 'vendorAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.31 NAME 'vendorPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.1.4.1.303 NAME 'dgIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME_VALUE_ACCESS '1' )", + "( 2.16.840.1.113719.1.1.4.1.304 NAME 'dgTimeOut' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.305 NAME 'dgAllowUnknown' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.306 NAME 'dgAllowDuplicates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'allowAliasToAncestor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.39.4.1.1 NAME 'sASSecurityDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Security DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.2 NAME 'sASServiceDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Service DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.3 NAME 'sASSecretStore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:SecretStore' )", + "( 2.16.840.1.113719.1.39.4.1.4 NAME 'sASSecretStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Key' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.5 NAME 'sASSecretStoreData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Data' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.6 NAME 'sASPKIStoreKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:PKIStore:Keys' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.48.4.1.1 NAME 'nDSPKIPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.2 NAME 'nDSPKIPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Private Key' )", + "( 2.16.840.1.113719.1.48.4.1.3 NAME 'nDSPKIPublicKeyCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.4 NAME 'nDSPKICertificateChain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:Certificate Chain' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.16 NAME 'nDSPKIPublicKeyEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.17 NAME 'nDSPKIPrivateKeyEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Private Key EC' )", + "( 2.16.840.1.113719.1.48.4.1.18 NAME 'nDSPKIPublicKeyCertificateEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key Certificate EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.19 NAME 'crossCertificatePairEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Cross Certificate Pair EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'nDSPKICertificateChainEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:Certificate Chain EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.5 NAME 'nDSPKIParentCA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA' )", + "( 2.16.840.1.113719.1.48.4.1.6 NAME 'nDSPKIParentCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA DN' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'nDSPKISuiteBMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'NDSPKI:SuiteBMode' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.7 NAME 'nDSPKIKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Key File' )", + "( 2.16.840.1.113719.1.48.4.1.8 NAME 'nDSPKISubjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Subject Name' )", + "( 2.16.840.1.113719.1.48.4.1.11 NAME 'nDSPKIGivenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Given Name' )", + "( 2.16.840.1.113719.1.48.4.1.9 NAME 'nDSPKIKeyMaterialDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Key Material DN' )", + "( 2.16.840.1.113719.1.48.4.1.10 NAME 'nDSPKITreeCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Tree CA DN' )", + "( 2.5.4.59 NAME 'cAECCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.12 NAME 'nDSPKIUserCertificateInfo' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'NDSPKI:userCertificateInfo' )", + "( 2.16.840.1.113719.1.48.4.1.13 NAME 'nDSPKITrustedRootCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Trusted Root Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.14 NAME 'nDSPKINotBefore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not Before' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.15 NAME 'nDSPKINotAfter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not After' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.101 NAME 'nDSPKISDKeyServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:SD Key Server DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.102 NAME 'nDSPKISDKeyStruct' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:SD Key Struct' )", + "( 2.16.840.1.113719.1.48.4.1.103 NAME 'nDSPKISDKeyCert' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key Cert' )", + "( 2.16.840.1.113719.1.48.4.1.104 NAME 'nDSPKISDKeyID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key ID' )", + "( 2.16.840.1.113719.1.39.4.1.105 NAME 'nDSPKIKeystore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'NDSPKI:Keystore' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.106 NAME 'ndspkiAdditionalRoots' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.3 NAME 'masvLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.4 NAME 'masvProposedLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.5 NAME 'masvDefaultRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.6 NAME 'masvAuthorizedRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.7 NAME 'masvDomainPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.8 NAME 'masvClearanceNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.9 NAME 'masvLabelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.10 NAME 'masvLabelSecrecyLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.11 NAME 'masvLabelSecrecyCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.12 NAME 'masvLabelIntegrityLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.13 NAME 'masvLabelIntegrityCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.14 NAME 'masvPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.31.4.1.16 NAME 'masvNDSAttributeLabels' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.15 NAME 'masvPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.2 NAME 'sASLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'SAS:Login Sequence' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.8 NAME 'sASLoginPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy Update' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'sasNMASProductOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.74 NAME 'sasAuditConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.14 NAME 'sASNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.15 NAME 'sASPolicyCredentials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Policy Credentials' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.16 NAME 'sASPolicyMethods' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Methods' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.17 NAME 'sASPolicyObjectVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Policy Object Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.18 NAME 'sASPolicyServiceSubtypes' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Service Subtypes' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.19 NAME 'sASPolicyServices' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Services' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.20 NAME 'sASPolicyUsers' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Users' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.21 NAME 'sASAllowNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:Allow NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.9 NAME 'sASMethodIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Identifier' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.10 NAME 'sASMethodVendor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Vendor' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.11 NAME 'sASAdvisoryMethodGrade' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Advisory Method Grade' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.12 NAME 'sASVendorSupport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Vendor Support' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.13 NAME 'sasCertificateSearchContainers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.70 NAME 'sasNMASMethodConfigData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.22 NAME 'sASLoginClientMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.23 NAME 'sASLoginServerMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.24 NAME 'sASLoginClientMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.25 NAME 'sASLoginServerMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.26 NAME 'sasLoginClientMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.27 NAME 'sasLoginServerMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.28 NAME 'sasLoginClientMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.29 NAME 'sasLoginServerMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.30 NAME 'sasLoginClientMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.31 NAME 'sasLoginServerMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.32 NAME 'sasLoginClientMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.33 NAME 'sasLoginServerMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.34 NAME 'sasLoginClientMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.35 NAME 'sasLoginServerMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1000 NAME 'sasLoginClientMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1001 NAME 'sasLoginServerMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1002 NAME 'sasLoginClientMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1003 NAME 'sasLoginServerMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1004 NAME 'sasLoginClientMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1005 NAME 'sasLoginServerMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1006 NAME 'sasLoginClientMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1007 NAME 'sasLoginServerMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1008 NAME 'sasLoginClientMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1009 NAME 'sasLoginServerMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasLoginServerMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasLoginClientMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.78 NAME 'sasUnsignedMethodModules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.79 NAME 'sasServerModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.80 NAME 'sasServerModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.81 NAME 'sasSASLMechanismName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.82 NAME 'sasSASLMechanismEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.83 NAME 'sasClientModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.84 NAME 'sasClientModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.36 NAME 'sASLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Method Container DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.37 NAME 'sASLoginPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.63 NAME 'sasPostLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'rADIUSActiveConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Active Connections' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.39 NAME 'rADIUSAgedInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Aged Interval' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.40 NAME 'rADIUSAttributeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Attribute List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.41 NAME 'rADIUSAttributeLists' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Attribute Lists' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.42 NAME 'rADIUSClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Client' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.43 NAME 'rADIUSCommonNameResolution' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Common Name Resolution' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.44 NAME 'rADIUSConcurrentLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Concurrent Limit' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.45 NAME 'rADIUSConnectionHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Connection History' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.46 NAME 'rADIUSDASVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:DAS Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.47 NAME 'rADIUSDefaultProfile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Default Profile' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.48 NAME 'rADIUSDialAccessGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'RADIUS:Dial Access Group' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.49 NAME 'rADIUSEnableCommonNameLogin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Common Name Login' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.50 NAME 'rADIUSEnableDialAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Dial Access' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.51 NAME 'rADIUSInterimAcctingTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Interim Accting Timeout' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.52 NAME 'rADIUSLookupContexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'RADIUS:Lookup Contexts' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.53 NAME 'rADIUSMaxDASHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Max DAS History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.54 NAME 'rADIUSMaximumHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Maximum History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.55 NAME 'rADIUSPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Password' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.56 NAME 'rADIUSPasswordPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Password Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.57 NAME 'rADIUSPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Private Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.58 NAME 'rADIUSProxyContext' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Proxy Context' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.59 NAME 'rADIUSProxyDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Domain' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.60 NAME 'rADIUSProxyTarget' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Target' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.61 NAME 'rADIUSPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Public Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.62 NAME 'rADIUSServiceList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Service List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.3 NAME 'sASLoginSecret' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.4 NAME 'sASLoginSecretKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.5 NAME 'sASEncryptionType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Encryption Type' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.6 NAME 'sASLoginConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.7 NAME 'sASLoginConfigurationKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.73 NAME 'sasDefaultLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.64 NAME 'sasAuthorizedLoginSequences' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.69 NAME 'sasAllowableSubjectNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.71 NAME 'sasLoginFailureDelay' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.72 NAME 'sasMethodVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1010 NAME 'sasUpdateLoginInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasOTPEnabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasOTPCounter' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1013 NAME 'sasOTPLookAheadWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1014 NAME 'sasOTPDigits' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1015 NAME 'sasOTPReSync' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1016 NAME 'sasUpdateLoginTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.6.4.1 NAME 'snmpGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.2 NAME 'snmpServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.6.4.3 NAME 'snmpTrapConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.4 NAME 'snmpTrapDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.5 NAME 'snmpTrapInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.6 NAME 'snmpTrapDisable' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.528 NAME 'ndapPartitionPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.529 NAME 'ndapClassPasswordMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.530 NAME 'ndapPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.537 NAME 'ndapPartitionLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.538 NAME 'ndapClassLoginMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.539 NAME 'ndapLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.1 NAME 'nspmPasswordKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.2 NAME 'nspmPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.3 NAME 'nspmDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.4 NAME 'nspmPasswordHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.5 NAME 'nspmAdministratorChangeCount' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.6 NAME 'nspmPasswordPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.7 NAME 'nspmPreviousDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.8 NAME 'nspmDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.42.2.27.8.1.16 NAME 'pwdChangedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.17 NAME 'pwdAccountLockedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.19 NAME 'pwdFailureTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.39.43.4.100 NAME 'nspmConfigurationOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.102 NAME 'nspmChangePasswordMessage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.103 NAME 'nspmPasswordHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.104 NAME 'nspmPasswordHistoryExpiration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.105 NAME 'nspmMinPasswordLifetime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.106 NAME 'nspmAdminsDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.107 NAME 'nspmPasswordACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 )", + "( 2.16.840.1.113719.1.39.43.4.200 NAME 'nspmMaximumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.201 NAME 'nspmMinUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.202 NAME 'nspmMaxUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.203 NAME 'nspmMinLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.204 NAME 'nspmMaxLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.205 NAME 'nspmNumericCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.206 NAME 'nspmNumericAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.207 NAME 'nspmNumericAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.208 NAME 'nspmMinNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.209 NAME 'nspmMaxNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.210 NAME 'nspmSpecialCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.211 NAME 'nspmSpecialAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.212 NAME 'nspmSpecialAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.213 NAME 'nspmMinSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.214 NAME 'nspmMaxSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.215 NAME 'nspmMaxRepeatedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.216 NAME 'nspmMaxConsecutiveCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.217 NAME 'nspmMinUniqueCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.218 NAME 'nspmDisallowedAttributeValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.219 NAME 'nspmExcludeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.220 NAME 'nspmCaseSensitive' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.221 NAME 'nspmPolicyPrecedence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.222 NAME 'nspmExtendedCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.223 NAME 'nspmExtendedAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.224 NAME 'nspmExtendedAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.225 NAME 'nspmMinExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.226 NAME 'nspmMaxExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.227 NAME 'nspmUpperAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.228 NAME 'nspmUpperAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.229 NAME 'nspmLowerAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.230 NAME 'nspmLowerAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.231 NAME 'nspmComplexityRules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.233 NAME 'nspmAD2K8Syntax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.234 NAME 'nspmAD2K8maxViolation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.235 NAME 'nspmXCharLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.236 NAME 'nspmXCharHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.237 NAME 'nspmUnicodeAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.238 NAME 'nspmNonAlphaCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.239 NAME 'nspmMinNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.240 NAME 'nspmMaxNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.241 NAME 'nspmGraceLoginHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.300 NAME 'nspmPolicyAgentContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.301 NAME 'nspmPolicyAgentNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.302 NAME 'nspmPolicyAgentWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.303 NAME 'nspmPolicyAgentSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.304 NAME 'nspmPolicyAgentLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.305 NAME 'nspmPolicyAgentAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.306 NAME 'nspmPolicyAgentHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledUri' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'ldapPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.12.4.1.0 NAME 'auditAEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:A Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.2.0 NAME 'auditBEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:B Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.3.0 NAME 'auditContents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Contents' )", + "( 2.16.840.1.113719.1.12.4.4.0 NAME 'auditType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Type' )", + "( 2.16.840.1.113719.1.12.4.5.0 NAME 'auditCurrentEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Current Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.6.0 NAME 'auditFileLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Audit:File Link' )", + "( 2.16.840.1.113719.1.12.4.7.0 NAME 'auditLinkList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Audit:Link List' )", + "( 2.16.840.1.113719.1.12.4.8.0 NAME 'auditPath' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Path' )", + "( 2.16.840.1.113719.1.12.4.9.0 NAME 'auditPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Policy' )", + "( 2.16.840.1.113719.1.38.4.1.1 NAME 'wANMANWANPolicy' SYNTAX 2.16.840.1.113719.1.1.5.1.13{64512} X-NDS_NAME 'WANMAN:WAN Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.2 NAME 'wANMANLANAreaMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'WANMAN:LAN Area Membership' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.3 NAME 'wANMANCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'WANMAN:Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.4 NAME 'wANMANDefaultCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'WANMAN:Default Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.135.4.30 NAME 'rbsAssignedRoles' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.31 NAME 'rbsContent' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.32 NAME 'rbsContentMembership' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.33 NAME 'rbsEntryPoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.34 NAME 'rbsMember' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.35 NAME 'rbsOwnedCollections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.135.4.36 NAME 'rbsPath' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.37 NAME 'rbsParameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.38 NAME 'rbsTaskRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.39 NAME 'rbsTrusteeOf' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.40 NAME 'rbsType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '256' )", + "( 2.16.840.1.113719.1.135.4.41 NAME 'rbsURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.42 NAME 'rbsTaskTemplates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.43 NAME 'rbsTaskTemplatesURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.44 NAME 'rbsGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.45 NAME 'rbsPageMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.46 NAME 'rbsTargetObjectType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.135.4.47 NAME 'rbsContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.48 NAME 'rbsXMLInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.51 NAME 'rbsAssignedRoles2' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.52 NAME 'rbsOwnedCollections2' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.1.540 NAME 'prSyncPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.541 NAME 'prSyncAttributes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.542 NAME 'dsEncryptedReplicationConfig' SYNTAX 2.16.840.1.113719.1.1.5.1.19 )", + "( 2.16.840.1.113719.1.1.4.1.543 NAME 'encryptionPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.544 NAME 'attrEncryptionRequiresSecure' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.545 NAME 'attrEncryptionDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.48.4.1.16 NAME 'ndspkiCRLFileName' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.17 NAME 'ndspkiStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.18 NAME 'ndspkiIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.19 NAME 'ndspkiNextIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'ndspkiAttemptTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.21 NAME 'ndspkiTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.22 NAME 'ndspkiCRLMaxProcessingInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.23 NAME 'ndspkiCRLNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.24 NAME 'ndspkiDistributionPoints' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.25 NAME 'ndspkiCRLProcessData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.26 NAME 'ndspkiCRLConfigurationDNList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.27 NAME 'ndspkiCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.28 NAME 'ndspkiCRLContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.29 NAME 'ndspkiIssuedCertContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.30 NAME 'ndspkiDistributionPointDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.31 NAME 'ndspkiCRLConfigurationDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.32 NAME 'ndspkiDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} )", + "( 2.5.4.38 NAME 'authorityRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-NDS_NAME 'ndspkiAuthorityRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.39 NAME 'certificateRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-NDS_NAME 'ndspkiCertificateRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.53 NAME 'deltaRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-NDS_NAME 'ndspkiDeltaRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.36 NAME 'ndspkiTrustedRootList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.37 NAME 'ndspkiSecurityRightsLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.48.4.1.38 NAME 'ndspkiKMOExport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.48.4.1.39 NAME 'ndspkiCRLECConfigurationDNList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.40 NAME 'ndspkiCRLType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.41 NAME 'ndspkiCRLExtendValidity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.42 NAME 'ndspkiDefaultRSAKeySize' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.43 NAME 'ndspkiDefaultECCurve' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.44 NAME 'ndspkiDefaultCertificateLife' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.7.4.1 NAME 'notfSMTPEmailHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.2 NAME 'notfSMTPEmailFrom' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.3 NAME 'notfSMTPEmailUserName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.5 NAME 'notfMergeTemplateData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.6 NAME 'notfMergeTemplateSubject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.1 NAME 'nsimRequiredQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.2 NAME 'nsimRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.3 NAME 'nsimNumberRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.4 NAME 'nsimMinResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.5 NAME 'nsimMaxResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.6 NAME 'nsimForgottenLoginConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.7 NAME 'nsimForgottenAction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.8 NAME 'nsimAssignments' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.9 NAME 'nsimChallengeSetDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.10 NAME 'nsimChallengeSetGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.11 NAME 'nsimPwdRuleEnforcement' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.12 NAME 'nsimHint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.44.4.13 NAME 'nsimPasswordReminder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.4 NAME 'sssProxyStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.5 NAME 'sssProxyStoreSecrets' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.6 NAME 'sssActiveServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.7 NAME 'sssCacheRefreshInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.8 NAME 'sssAdminList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.266.4.9 NAME 'sssAdminGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.10 NAME 'sssEnableReadTimestamps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.11 NAME 'sssDisableMasterPasswords' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.12 NAME 'sssEnableAdminAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.13 NAME 'sssReadSecretPolicies' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.14 NAME 'sssServerPolicyOverrideDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.531 NAME 'eDirCloneSource' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.532 NAME 'eDirCloneKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.1.4.1.533 NAME 'eDirCloneLock' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.711 NAME 'groupMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.712 NAME 'nestedConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.717 NAME 'xdasDSConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.718 NAME 'xdasConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.719 NAME 'xdasVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.347.4.79 NAME 'NAuditInstrumentation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.347.4.2 NAME 'NAuditLoggingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.1.4.724 NAME 'cefConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.725 NAME 'cefVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_UPPER_BOUND '32768' )" + ], + "createTimestamp": [], + "dITContentRules": [], + "dITStructureRules": [], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.1 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.2 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.3 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.4 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.5 X-NDS_SYNTAX '21' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 X-NDS_SYNTAX '7' )", + "( 2.16.840.1.113719.1.1.5.1.6 X-NDS_SYNTAX '6' )", + "( 1.3.6.1.4.1.1466.115.121.1.8 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.9 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.10 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.22 X-NDS_SYNTAX '22' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SYNTAX '1' )", + "( 1.3.6.1.4.1.1466.115.121.1.13 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.16 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.17 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.18 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.19 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.20 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.21 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 X-NDS_SYNTAX '11' )", + "( 1.3.6.1.4.1.1466.115.121.1.23 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 X-NDS_SYNTAX '24' )", + "( 1.3.6.1.4.1.1466.115.121.1.25 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 X-NDS_SYNTAX '2' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_SYNTAX '8' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 X-NDS_SYNTAX '9' )", + "( 1.2.840.113556.1.4.906 X-NDS_SYNTAX '29' )", + "( 1.3.6.1.4.1.1466.115.121.1.54 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.56 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.57 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.29 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.30 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.31 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.32 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.33 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.55 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.35 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.19 X-NDS_SYNTAX '19' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 X-NDS_SYNTAX '5' )", + "( 2.16.840.1.113719.1.1.5.1.17 X-NDS_SYNTAX '17' )", + "( 1.3.6.1.4.1.1466.115.121.1.37 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.13 X-NDS_SYNTAX '13' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_SYNTAX '20' )", + "( 1.3.6.1.4.1.1466.115.121.1.39 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 X-NDS_SYNTAX '18' )", + "( 1.3.6.1.4.1.1466.115.121.1.43 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 X-NDS_SYNTAX '4' )", + "( 1.3.6.1.4.1.1466.115.121.1.42 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.16 X-NDS_SYNTAX '16' )", + "( 1.3.6.1.4.1.1466.115.121.1.58 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.45 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.46 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.47 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.48 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.49 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.12 X-NDS_SYNTAX '12' )", + "( 2.16.840.1.113719.1.1.5.1.23 X-NDS_SYNTAX '23' )", + "( 2.16.840.1.113719.1.1.5.1.15 X-NDS_SYNTAX '15' )", + "( 2.16.840.1.113719.1.1.5.1.14 X-NDS_SYNTAX '14' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 X-NDS_SYNTAX '10' )", + "( 1.3.6.1.4.1.1466.115.121.1.51 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.25 X-NDS_SYNTAX '25' )", + "( 1.3.6.1.4.1.1466.115.121.1.53 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.26 X-NDS_SYNTAX '26' )", + "( 2.16.840.1.113719.1.1.5.1.27 X-NDS_SYNTAX '27' )" + ], + "matchingRuleUse": [], + "matchingRules": [], + "modifyTimestamp": [ + "20190831135835Z" + ], + "nameForms": [], + "objectClass": [ + "top", + "subschema" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'Top' STRUCTURAL MUST objectClass MAY ( cAPublicKey $ cAPrivateKey $ certificateValidityInterval $ authorityRevocation $ lastReferencedTime $ equivalentToMe $ ACL $ backLink $ binderyProperty $ Obituary $ Reference $ revision $ ndsCrossCertificatePair $ certificateRevocation $ usedBy $ GUID $ otherGUID $ DirXML-Associations $ creatorsName $ modifiersName $ objectVersion $ auxClassCompatibility $ unknownBaseClass $ unknownAuxiliaryClass $ masvProposedLabel $ masvDefaultRange $ masvAuthorizedRange $ auditFileLink $ rbsAssignedRoles $ rbsOwnedCollections $ rbsAssignedRoles2 $ rbsOwnedCollections2 ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '16#subtree#[Creator]#[Entry Rights]' )", + "( 1.3.6.1.4.1.42.2.27.1.2.1 NAME 'aliasObject' SUP Top STRUCTURAL MUST aliasedObjectName X-NDS_NAME 'Alias' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.2 NAME 'Country' SUP Top STRUCTURAL MUST c MAY ( description $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING 'c' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.3 NAME 'Locality' SUP Top STRUCTURAL MAY ( description $ l $ seeAlso $ st $ street $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING ( 'l' 'st' ) X-NDS_CONTAINMENT ( 'Country' 'organizationalUnit' 'Locality' 'Organization' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.4 NAME 'Organization' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST o MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'o' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'domain' ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST ou MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'ou' X-NDS_CONTAINMENT ( 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Unit' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.8 NAME 'organizationalRole' SUP Top STRUCTURAL MUST cn MAY ( description $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ roleOccupant $ seeAlso $ st $ street $ telephoneNumber $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Role' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.9 NAME ( 'groupOfNames' 'group' 'groupOfUniqueNames' ) SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ owner $ seeAlso $ groupID $ fullName $ eMailAddress $ mailboxLocation $ mailboxID $ Profile $ profileMembership $ loginScript $ businessCategory $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.6 NAME 'Person' SUP ndsLoginProperties STRUCTURAL MUST ( cn $ sn ) MAY ( description $ seeAlso $ telephoneNumber $ fullName $ givenName $ initials $ generationQualifier $ uid $ assistant $ assistantPhone $ city $ st $ company $ co $ directReports $ manager $ mailstop $ mobile $ personalTitle $ pager $ workforceID $ instantMessagingID $ preferredName $ photo $ jobCode $ siteLocation $ employeeStatus $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ otherPhoneNumber $ managerWorkforceID $ roomNumber $ jackNumber $ departmentNumber $ vehicleInformation $ accessCardNumber $ isManager $ userPassword ) X-NDS_NAMING ( 'cn' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP Person STRUCTURAL MAY ( facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ mailboxLocation $ mailboxID $ uid $ mail $ employeeNumber $ destinationIndicator $ internationaliSDNNumber $ preferredDeliveryMethod $ registeredAddress $ teletexTerminalIdentifier $ telexNumber $ x121Address $ businessCategory $ roomNumber $ x500UniqueIdentifier ) X-NDS_NAMING ( 'cn' 'ou' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP organizationalPerson STRUCTURAL MAY ( groupMembership $ ndsHomeDirectory $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ printJobConfiguration $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ messageServer $ Language $ ndsUID $ lockedByIntruder $ serverHolds $ lastLoginTime $ typeCreatorMap $ higherPrivileges $ printerControl $ securityFlags $ profileMembership $ Timezone $ sASServiceDN $ sASSecretStore $ sASSecretStoreKey $ sASSecretStoreData $ sASPKIStoreKeys $ userCertificate $ nDSPKIUserCertificateInfo $ nDSPKIKeystore $ rADIUSActiveConnections $ rADIUSAttributeLists $ rADIUSConcurrentLimit $ rADIUSConnectionHistory $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSPassword $ rADIUSServiceList $ audio $ businessCategory $ carLicense $ departmentNumber $ employeeNumber $ employeeType $ displayName $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledUri $ mail $ manager $ mobile $ o $ pager $ ldapPhoto $ preferredLanguage $ roomNumber $ secretary $ uid $ userSMIMECertificate $ x500UniqueIdentifier $ userPKCS12 $ sssProxyStoreKey $ sssProxyStoreSecrets $ sssServerPolicyOverrideDN ) X-NDS_NAME 'User' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#loginScript' '1#subtree#[Root Template]#[Entry Rights]' '2#entry#[Public]#messageServer' '2#entry#[Root Template]#groupMembership' '6#entry#[Self]#printJobConfiguration' '2#entry#[Root Template]#networkAddress') )", + "( 2.5.6.14 NAME 'Device' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ networkAddress $ ou $ o $ owner $ seeAlso $ serialNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.4 NAME 'Computer' SUP Device STRUCTURAL MAY ( operator $ server $ status ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.17 NAME 'Printer' SUP Device STRUCTURAL MAY ( Cartridge $ printerConfiguration $ defaultQueue $ hostDevice $ printServer $ Memory $ networkAddressRestriction $ notify $ operator $ pageDescriptionLanguage $ queue $ status $ supportedTypefaces ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.21 NAME 'Resource' SUP Top ABSTRACT MUST cn MAY ( description $ hostResourceName $ l $ ou $ o $ seeAlso $ Uses ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.20 NAME 'Queue' SUP Resource STRUCTURAL MUST queueDirectory MAY ( Device $ operator $ server $ User $ networkAddress $ Volume $ hostServer ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.3 NAME 'binderyQueue' SUP Queue STRUCTURAL MUST binderyType X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_NAME 'Bindery Queue' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.26 NAME 'Volume' SUP Resource STRUCTURAL MUST hostServer MAY status X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Root Template]#hostResourceName' '2#entry#[Root Template]#hostServer') )", + "( 2.16.840.1.113719.1.1.6.1.7 NAME 'directoryMap' SUP Resource STRUCTURAL MUST hostServer MAY path X-NDS_NAME 'Directory Map' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.19 NAME 'Profile' SUP Top STRUCTURAL MUST ( cn $ loginScript ) MAY ( description $ l $ ou $ o $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.22 NAME 'Server' SUP Top ABSTRACT MUST cn MAY ( description $ hostDevice $ l $ ou $ o $ privateKey $ publicKey $ Resource $ seeAlso $ status $ User $ Version $ networkAddress $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ fullName $ securityEquals $ securityFlags $ Timezone $ ndapClassPasswordMgmt $ ndapClassLoginMgmt ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Public]#networkAddress' '16#subtree#[Self]#[Entry Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.10 NAME 'ncpServer' SUP Server STRUCTURAL MAY ( operator $ supportedServices $ messagingServer $ dsRevision $ permanentConfigParms $ ndsPredicateStatsDN $ languageId $ indexDefinition $ CachedAttrsOnExtRefs $ NCPKeyMaterialName $ NDSRightsToMonitor $ ldapServerDN $ httpServerDN $ emboxConfig $ sASServiceDN $ cACertificate $ cAECCertificate $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKICertificateChain $ nDSPKIParentCADN $ nDSPKISDKeyID $ nDSPKISDKeyStruct $ snmpGroupDN $ wANMANWANPolicy $ wANMANLANAreaMembership $ wANMANCost $ wANMANDefaultCost $ encryptionPolicyDN $ eDirCloneSource $ eDirCloneLock $ xdasDSConfiguration $ xdasConfiguration $ xdasVersion $ NAuditLoggingServer $ NAuditInstrumentation $ cefConfiguration $ cefVersion ) X-NDS_NAME 'NCP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#messagingServer' )", + "( 2.16.840.1.113719.1.1.6.1.18 NAME 'printServer' SUP Server STRUCTURAL MAY ( operator $ printer $ sAPName ) X-NDS_NAME 'Print Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.31 NAME 'CommExec' SUP Server STRUCTURAL MAY networkAddressRestriction X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.2 NAME 'binderyObject' SUP Top STRUCTURAL MUST ( binderyObjectRestriction $ binderyType $ cn ) X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Bindery Object' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.15 NAME 'Partition' AUXILIARY MAY ( Convergence $ partitionCreationTime $ Replica $ inheritedACL $ lowConvergenceSyncInterval $ receivedUpTo $ synchronizedUpTo $ authorityRevocation $ certificateRevocation $ cAPrivateKey $ cAPublicKey $ ndsCrossCertificatePair $ lowConvergenceResetTime $ highConvergenceSyncInterval $ partitionControl $ replicaUpTo $ partitionStatus $ transitiveVector $ purgeVector $ synchronizationTolerance $ obituaryNotify $ localReceivedUpTo $ federationControl $ syncPanePoint $ syncWindowVector $ EBAPartitionConfiguration $ authoritative $ allowAliasToAncestor $ sASSecurityDN $ masvLabel $ ndapPartitionPasswordMgmt $ ndapPartitionLoginMgmt $ prSyncPolicyDN $ dsEncryptedReplicationConfig ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.0 NAME 'aFPServer' SUP Server STRUCTURAL MAY ( serialNumber $ supportedConnections ) X-NDS_NAME 'AFP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.27 NAME 'messagingServer' SUP Server STRUCTURAL MAY ( messagingDatabaseLocation $ messageRoutingGroup $ Postmaster $ supportedServices $ messagingServerType $ supportedGateway ) X-NDS_NAME 'Messaging Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#status' '2#entry#[Public]#messagingServerType' '2#entry#[Public]#messagingDatabaseLocation') )", + "( 2.16.840.1.113719.1.1.6.1.28 NAME 'messageRoutingGroup' SUP groupOfNames STRUCTURAL X-NDS_NAME 'Message Routing Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.29 NAME 'externalEntity' SUP Top STRUCTURAL MUST cn MAY ( description $ seeAlso $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ externalName $ mailboxLocation $ mailboxID ) X-NDS_NAMING ( 'cn' 'ou' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'External Entity' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#externalName' )", + "( 2.16.840.1.113719.1.1.6.1.30 NAME 'List' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ eMailAddress $ mailboxLocation $ mailboxID $ owner $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member' )", + "( 2.16.840.1.113719.1.1.6.1.32 NAME 'treeRoot' SUP Top STRUCTURAL MUST T MAY ( EBATreeConfiguration $ sssActiveServerList ) X-NDS_NAMING 'T' X-NDS_NAME 'Tree Root' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP ( Top $ ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST dc MAY ( searchGuide $ o $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ associatedName $ description $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'dc' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' AUXILIARY MUST dc X-NDS_NAMING 'dc' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.33 NAME 'ndsLoginProperties' SUP Top ABSTRACT MAY ( groupMembership $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ Language $ lockedByIntruder $ serverHolds $ lastLoginTime $ higherPrivileges $ securityFlags $ profileMembership $ Timezone $ loginActivationTime $ UTF8LoginScript $ loginScriptCharset $ sASNDSPasswordWindow $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAllowableSubjectNames $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPCounter $ sasOTPDigits $ sasOTPReSync $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordKey $ nspmPassword $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ nsimHint $ nsimPasswordReminder $ userPassword ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.141.6.1 NAME 'federationBoundary' AUXILIARY MUST federationBoundaryType MAY ( federationControl $ federationDNSName $ federationSearchPath ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.34 NAME 'ndsContainerLoginProperties' SUP Top ABSTRACT MAY ( loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPDigits $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordPolicyDN ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.6.3 NAME 'ndsPredicateStats' SUP Top STRUCTURAL MUST ( cn $ ndsPredicateState $ ndsPredicateFlush ) MAY ( ndsPredicate $ ndsPredicateTimeout $ ndsPredicateUseValues ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.400.1 NAME 'edirSchemaVersion' SUP Top ABSTRACT MAY edirSchemaFlagVersion X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.47 NAME 'immediateSuperiorReference' AUXILIARY MAY ref X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.1 NAME 'ldapServer' SUP Top STRUCTURAL MUST cn MAY ( ldapHostServer $ ldapGroupDN $ ldapTraceLevel $ ldapServerBindLimit $ ldapServerIdleTimeout $ lDAPUDPPort $ lDAPSearchSizeLimit $ lDAPSearchTimeLimit $ lDAPLogLevel $ lDAPLogFilename $ lDAPBackupLogFilename $ lDAPLogSizeLimit $ Version $ searchSizeLimit $ searchTimeLimit $ ldapEnableTCP $ ldapTCPPort $ ldapEnableSSL $ ldapSSLPort $ ldapKeyMaterialName $ filteredReplicaUsage $ extensionInfo $ nonStdClientSchemaCompatMode $ sslEnableMutualAuthentication $ ldapEnablePSearch $ ldapMaximumPSearchOperations $ ldapIgnorePSearchLimitsForEvents $ ldapTLSTrustedRootContainer $ ldapEnableMonitorEvents $ ldapMaximumMonitorEventsLoad $ ldapTLSRequired $ ldapTLSVerifyClientCertificate $ ldapConfigVersion $ ldapDerefAlias $ ldapNonStdAllUserAttrsMode $ ldapBindRestrictions $ ldapDefaultReferralBehavior $ ldapReferral $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ ldapLBURPNumWriterThreads $ ldapInterfaces $ ldapChainSecureRequired $ ldapStdCompliance $ ldapDerefAliasOnAuth $ ldapGeneralizedTime $ ldapPermissiveModify $ ldapSSLConfig ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Server' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.2 NAME 'ldapGroup' SUP Top STRUCTURAL MUST cn MAY ( ldapReferral $ ldapServerList $ ldapAllowClearTextPassword $ ldapAnonymousIdentity $ lDAPSuffix $ ldapAttributeMap $ ldapClassMap $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ transitionGroupDN $ ldapAttributeList $ ldapClassList $ ldapConfigVersion $ Version $ ldapDefaultReferralBehavior $ ldapTransitionBackLink $ ldapSSLConfig $ referralIncludeFilter $ referralExcludeFilter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Group' X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.22 NAME 'pkiCA' AUXILIARY MAY ( cACertificate $ certificateRevocationList $ authorityRevocationList $ crossCertificatePair $ attributeCertificate $ publicKey $ privateKey $ networkAddress $ loginTime $ lastLoginTime $ cAECCertificate $ crossCertificatePairEC ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.21 NAME 'pkiUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.11 NAME 'applicationProcess' SUP Top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.12 NAME 'applicationEntity' SUP Top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.13 NAME 'dSA' SUP applicationEntity STRUCTURAL MAY knowledgeInformation X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.16 NAME 'certificationAuthority' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.18 NAME 'userSecurityInformation' AUXILIARY MAY supportedAlgorithms X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.20 NAME 'dmd' SUP ndsLoginProperties AUXILIARY MUST dmdName MAY ( searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ description $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY ( crossCertificatePair $ deltaRevocationList ) X-NDS_NAME 'certificationAuthorityVer2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.3.6.1 NAME 'httpServer' SUP Top STRUCTURAL MUST cn MAY ( httpHostServerDN $ httpThreadsPerCPU $ httpIOBufferSize $ httpRequestTimeout $ httpKeepAliveRequestTimeout $ httpSessionTimeout $ httpKeyMaterialObject $ httpTraceLevel $ httpAuthRequiresTLS $ httpDefaultClearPort $ httpDefaultTLSPort $ httpBindRestrictions ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.64.6.1.1 NAME 'Template' SUP Top STRUCTURAL MUST cn MAY ( trusteesOfNewObject $ newObjectSDSRights $ newObjectSFSRights $ setupScript $ runSetupScript $ membersOfTemplate $ volumeSpaceRestrictions $ setPasswordAfterCreate $ homeDirectoryRights $ accountBalance $ allowUnlimitedCredit $ description $ eMailAddress $ facsimileTelephoneNumber $ groupMembership $ higherPrivileges $ ndsHomeDirectory $ l $ Language $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginMaximumSimultaneous $ loginScript $ mailboxID $ mailboxLocation $ member $ messageServer $ minimumAccountBalance $ networkAddressRestriction $ newObjectSSelfRights $ ou $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ Profile $ st $ street $ securityEquals $ securityFlags $ seeAlso $ telephoneNumber $ title $ assistant $ assistantPhone $ city $ company $ co $ manager $ managerWorkforceID $ mailstop $ siteLocation $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ departmentNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.1 NAME 'homeInfo' AUXILIARY MAY ( homeCity $ homeEmailAddress $ homeFax $ homePhone $ homeState $ homePostalAddress $ homeZipCode $ personalMobile $ spouse $ children ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.2 NAME 'contingentWorker' AUXILIARY MAY ( vendorName $ vendorAddress $ vendorPhoneNumber ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.45 NAME 'dynamicGroup' SUP ( groupOfNames $ ndsLoginProperties ) STRUCTURAL MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.46 NAME 'dynamicGroupAux' SUP ( groupOfNames $ ndsLoginProperties ) AUXILIARY MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.6.1.1 NAME 'sASSecurity' SUP Top STRUCTURAL MUST cn MAY ( nDSPKITreeCADN $ masvPolicyDN $ sASLoginPolicyDN $ sASLoginMethodContainerDN $ sasPostLoginMethodContainerDN $ nspmPolicyAgentContainerDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Organization' 'domain' ) X-NDS_NAME 'SAS:Security' )", + "( 2.16.840.1.113719.1.39.6.1.2 NAME 'sASService' SUP Resource STRUCTURAL MAY ( hostServer $ privateKey $ publicKey $ allowUnlimitedCredit $ fullName $ lastLoginTime $ lockedByIntruder $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginTime $ networkAddress $ networkAddressRestriction $ notify $ operator $ owner $ path $ securityEquals $ securityFlags $ status $ Version $ nDSPKIKeyMaterialDN $ ndspkiKMOExport ) X-NDS_NAMING 'cn' X-NDS_NAME 'SAS:Service' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.1 NAME 'nDSPKICertificateAuthority' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKICertificateChainEC $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ nDSPKIPublicKeyEC $ nDSPKIPrivateKeyEC $ nDSPKIPublicKeyCertificateEC $ crossCertificatePairEC $ nDSPKISuiteBMode $ cACertificate $ cAECCertificate $ ndspkiCRLContainerDN $ ndspkiIssuedCertContainerDN $ ndspkiCRLConfigurationDNList $ ndspkiCRLECConfigurationDNList $ ndspkiSecurityRightsLevel $ ndspkiDefaultRSAKeySize $ ndspkiDefaultECCurve $ ndspkiDefaultCertificateLife ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:Certificate Authority' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.2 NAME 'nDSPKIKeyMaterial' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIKeyFile $ nDSPKIPrivateKey $ nDSPKIPublicKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKISubjectName $ nDSPKIGivenName $ ndspkiAdditionalRoots $ nDSPKINotBefore $ nDSPKINotAfter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'NDSPKI:Key Material' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.3 NAME 'nDSPKITrustedRoot' SUP Top STRUCTURAL MUST cn MAY ndspkiTrustedRootList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NAME 'NDSPKI:Trusted Root' )", + "( 2.16.840.1.113719.1.48.6.1.4 NAME 'nDSPKITrustedRootObject' SUP Top STRUCTURAL MUST ( cn $ nDSPKITrustedRootCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKITrustedRoot' X-NDS_NAME 'NDSPKI:Trusted Root Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.101 NAME 'nDSPKISDKeyAccessPartition' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:SD Key Access Partition' )", + "( 2.16.840.1.113719.1.48.6.1.102 NAME 'nDSPKISDKeyList' SUP Top STRUCTURAL MUST cn MAY ( nDSPKISDKeyServerDN $ nDSPKISDKeyStruct $ nDSPKISDKeyCert ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKISDKeyAccessPartition' X-NDS_NAME 'NDSPKI:SD Key List' )", + "( 2.16.840.1.113719.1.31.6.2.1 NAME 'mASVSecurityPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ masvDomainPolicy $ masvPolicyUpdate $ masvClearanceNames $ masvLabelNames $ masvLabelSecrecyLevelNames $ masvLabelSecrecyCategoryNames $ masvLabelIntegrityLevelNames $ masvLabelIntegrityCategoryNames $ masvNDSAttributeLabels ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'MASV:Security Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.1 NAME 'sASLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'SAS:Login Method Container' )", + "( 2.16.840.1.113719.1.39.42.2.0.4 NAME 'sASLoginPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ privateKey $ publicKey $ sASAllowNDSPasswordWindow $ sASPolicyCredentials $ sASPolicyMethods $ sASPolicyObjectVersion $ sASPolicyServiceSubtypes $ sASPolicyServices $ sASPolicyUsers $ sASLoginSequence $ sASLoginPolicyUpdate $ sasNMASProductOptions $ sasPolicyMethods $ sasPolicyServices $ sasPolicyUsers $ sasAllowNDSPasswordWindow $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAuditConfiguration $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPLookAheadWindow $ sasOTPDigits $ sasUpdateLoginTimeInterval $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'SAS:Login Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.7 NAME 'sASNMASBaseLoginMethod' SUP Top ABSTRACT MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasCertificateSearchContainers $ sasNMASMethodConfigData $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASLoginMethodContainer' X-NDS_NAME 'SAS:NMAS Base Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.8 NAME 'sASNMASLoginMethod' SUP sASNMASBaseLoginMethod STRUCTURAL X-NDS_NAME 'SAS:NMAS Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.9 NAME 'rADIUSDialAccessSystem' SUP Top STRUCTURAL MUST cn MAY ( publicKey $ privateKey $ rADIUSAgedInterval $ rADIUSClient $ rADIUSCommonNameResolution $ rADIUSConcurrentLimit $ rADIUSDASVersion $ rADIUSEnableCommonNameLogin $ rADIUSEnableDialAccess $ rADIUSInterimAcctingTimeout $ rADIUSLookupContexts $ rADIUSMaxDASHistoryRecord $ rADIUSMaximumHistoryRecord $ rADIUSPasswordPolicy $ rADIUSPrivateKey $ rADIUSProxyContext $ rADIUSProxyDomain $ rADIUSProxyTarget $ rADIUSPublicKey $ sASLoginConfiguration $ sASLoginConfigurationKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Dial Access System' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.10 NAME 'rADIUSProfile' SUP Top STRUCTURAL MUST cn MAY rADIUSAttributeList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Profile' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.11 NAME 'sasPostLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.39.42.2.0.12 NAME 'sasPostLoginMethod' SUP Top STRUCTURAL MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sasPostLoginMethodContainer' )", + "( 2.16.840.1.113719.1.6.6.1 NAME 'snmpGroup' SUP Top STRUCTURAL MUST cn MAY ( Version $ snmpServerList $ snmpTrapDisable $ snmpTrapInterval $ snmpTrapDescription $ snmpTrapConfig ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.2 NAME 'nspmPasswordPolicyContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) )", + "( 2.16.840.1.113719.1.39.43.6.3 NAME 'nspmPolicyAgent' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyAgentNetWare $ nspmPolicyAgentWINNT $ nspmPolicyAgentSolaris $ nspmPolicyAgentLinux $ nspmPolicyAgentAIX $ nspmPolicyAgentHPUX ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nspmPasswordPolicyContainer' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.1 NAME 'nspmPasswordPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyPrecedence $ nspmConfigurationOptions $ nspmChangePasswordMessage $ passwordExpirationInterval $ loginGraceLimit $ nspmMinPasswordLifetime $ passwordUniqueRequired $ nspmPasswordHistoryLimit $ nspmPasswordHistoryExpiration $ passwordAllowChange $ passwordRequired $ passwordMinimumLength $ nspmMaximumLength $ nspmCaseSensitive $ nspmMinUpperCaseCharacters $ nspmMaxUpperCaseCharacters $ nspmMinLowerCaseCharacters $ nspmMaxLowerCaseCharacters $ nspmNumericCharactersAllowed $ nspmNumericAsFirstCharacter $ nspmNumericAsLastCharacter $ nspmMinNumericCharacters $ nspmMaxNumericCharacters $ nspmSpecialCharactersAllowed $ nspmSpecialAsFirstCharacter $ nspmSpecialAsLastCharacter $ nspmMinSpecialCharacters $ nspmMaxSpecialCharacters $ nspmMaxRepeatedCharacters $ nspmMaxConsecutiveCharacters $ nspmMinUniqueCharacters $ nspmDisallowedAttributeValues $ nspmExcludeList $ nspmExtendedCharactersAllowed $ nspmExtendedAsFirstCharacter $ nspmExtendedAsLastCharacter $ nspmMinExtendedCharacters $ nspmMaxExtendedCharacters $ nspmUpperAsFirstCharacter $ nspmUpperAsLastCharacter $ nspmLowerAsFirstCharacter $ nspmLowerAsLastCharacter $ nspmComplexityRules $ nspmAD2K8Syntax $ nspmAD2K8maxViolation $ nspmXCharLimit $ nspmXCharHistoryLimit $ nspmUnicodeAllowed $ nspmNonAlphaCharactersAllowed $ nspmMinNonAlphaCharacters $ nspmMaxNonAlphaCharacters $ pwdInHistory $ nspmAdminsDoNotExpirePassword $ nspmPasswordACL $ nsimChallengeSetDN $ nsimForgottenAction $ nsimForgottenLoginConfig $ nsimAssignments $ nsimChallengeSetGUID $ nsimPwdRuleEnforcement ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'domain' 'Locality' 'Organization' 'organizationalUnit' 'Country' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.4 NAME 'nspmPasswordAux' AUXILIARY MAY ( publicKey $ privateKey $ loginGraceLimit $ loginGraceRemaining $ passwordExpirationTime $ passwordRequired $ nspmPasswordKey $ nspmPassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.12.6.1.0 NAME 'auditFileObject' SUP Top STRUCTURAL MUST ( cn $ auditPolicy $ auditContents ) MAY ( description $ auditPath $ auditLinkList $ auditType $ auditCurrentEncryptionKey $ auditAEncryptionKey $ auditBEncryptionKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'treeRoot' 'domain' ) X-NDS_NAME 'Audit:File Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.38.6.1.4 NAME 'wANMANLANArea' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ o $ ou $ owner $ seeAlso $ wANMANWANPolicy $ wANMANCost $ wANMANDefaultCost ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NAME 'WANMAN:LAN Area' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.37.1 NAME 'rbsCollection' SUP Top STRUCTURAL MUST cn MAY ( owner $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.30.1 NAME 'rbsExternalScope' SUP Top ABSTRACT MUST cn MAY ( rbsURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.31.1 NAME 'rbsModule' SUP Top STRUCTURAL MUST cn MAY ( rbsURL $ rbsPath $ rbsType $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.32.1 NAME 'rbsRole' SUP Top STRUCTURAL MUST cn MAY ( rbsContent $ rbsMember $ rbsTrusteeOf $ rbsGALabel $ rbsParameters $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.33.1 NAME 'rbsTask' SUP Top STRUCTURAL MUST cn MAY ( rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ rbsTaskTemplates $ rbsTaskTemplatesURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.34.1 NAME 'rbsBook' SUP rbsTask STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.35.1 NAME 'rbsScope' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.45.1 NAME 'rbsCollection2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsParameters $ owner $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.38.1 NAME 'rbsExternalScope2' SUP Top ABSTRACT MUST cn MAY ( rbsXMLInfo $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.39.1 NAME 'rbsModule2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsPath $ rbsType $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.40.1 NAME 'rbsRole2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContent $ rbsMember $ rbsTrusteeOf $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.41.1 NAME 'rbsTask2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.42.1 NAME 'rbsBook2' SUP rbsTask2 STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.43.1 NAME 'rbsScope2' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.49 NAME 'prSyncPolicy' SUP Top STRUCTURAL MUST cn MAY prSyncAttributes X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.50 NAME 'encryptionPolicy' SUP Top STRUCTURAL MUST cn MAY ( attrEncryptionDefinition $ attrEncryptionRequiresSecure ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.5 NAME 'ndspkiContainer' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'ndspkiContainer' 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'nDSPKITrustedRoot' ) )", + "( 2.16.840.1.113719.1.48.6.1.6 NAME 'ndspkiCertificate' SUP Top STRUCTURAL MUST ( cn $ userCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'ndspkiContainer' 'nDSPKITrustedRoot' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.7 NAME 'ndspkiCRLConfiguration' SUP Top STRUCTURAL MUST cn MAY ( ndspkiCRLFileName $ ndspkiDirectory $ ndspkiStatus $ ndspkiIssueTime $ ndspkiNextIssueTime $ ndspkiAttemptTime $ ndspkiTimeInterval $ ndspkiCRLMaxProcessingInterval $ ndspkiCRLNumber $ ndspkiDistributionPoints $ ndspkiDistributionPointDN $ ndspkiCADN $ ndspkiCRLProcessData $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ cACertificate $ hostServer $ ndspkiCRLType $ ndspkiCRLExtendValidity ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'ndspkiContainer' )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP Top STRUCTURAL MUST cn MAY ( authorityRevocationList $ authorityRevocationList $ cACertificate $ certificateRevocationList $ certificateRevocationList $ crossCertificatePair $ deltaRevocationList $ deltaRevocationList $ ndspkiCRLConfigurationDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'sASSecurity' 'domain' 'ndspkiCRLConfiguration' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.7.6.1 NAME 'notfTemplateCollection' SUP Top STRUCTURAL MUST cn MAY ( notfSMTPEmailHost $ notfSMTPEmailFrom $ notfSMTPEmailUserName $ sASSecretStore ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.7.6.2 NAME 'notfMergeTemplate' SUP Top STRUCTURAL MUST cn MAY ( notfMergeTemplateData $ notfMergeTemplateSubject ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'notfTemplateCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.44.6.1 NAME 'nsimChallengeSet' SUP Top STRUCTURAL MUST cn MAY ( description $ nsimRequiredQuestions $ nsimRandomQuestions $ nsimNumberRandomQuestions $ nsimMinResponseLength $ nsimMaxResponseLength ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.266.6.1 NAME 'sssServerPolicies' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.266.6.2 NAME 'sssServerPolicyOverride' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sssServerPolicies' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.91 NAME 'nestedGroupAux' AUXILIARY MAY ( groupMember $ excludedMember $ nestedConfig $ groupMembership ) X-NDS_NOT_CONTAINER '1' )" + ] + }, + "schema_entry": "cn=schema", + "type": "SchemaInfo" +} +""" + +edir_9_1_4_dsa_info = """ +{ + "raw": { + "abandonOps": [ + "0" + ], + "addEntryOps": [ + "0" + ], + "altServer": [], + "bindSecurityErrors": [ + "0" + ], + "chainings": [ + "0" + ], + "compareOps": [ + "0" + ], + "directoryTreeName": [ + "TEST_TREE" + ], + "dsaName": [ + "cn=MYSERVER,o=resources" + ], + "errors": [ + "0" + ], + "extendedOps": [ + "0" + ], + "inBytes": [ + "293" + ], + "inOps": [ + "3" + ], + "listOps": [ + "0" + ], + "modifyEntryOps": [ + "0" + ], + "modifyRDNOps": [ + "0" + ], + "namingContexts": [ + "" + ], + "oneLevelSearchOps": [ + "0" + ], + "outBytes": [ + "14" + ], + "readOps": [ + "1" + ], + "referralsReturned": [ + "0" + ], + "removeEntryOps": [ + "0" + ], + "repUpdatesIn": [ + "0" + ], + "repUpdatesOut": [ + "0" + ], + "searchOps": [ + "1" + ], + "securityErrors": [ + "0" + ], + "simpleAuthBinds": [ + "1" + ], + "strongAuthBinds": [ + "0" + ], + "subschemaSubentry": [ + "cn=schema" + ], + "supportedCapabilities": [], + "supportedControl": [ + "2.16.840.1.113719.1.27.101.6", + "2.16.840.1.113719.1.27.101.5", + "1.2.840.113556.1.4.319", + "2.16.840.1.113730.3.4.3", + "2.16.840.1.113730.3.4.2", + "2.16.840.1.113719.1.27.101.57", + "2.16.840.1.113719.1.27.103.7", + "2.16.840.1.113719.1.27.101.40", + "2.16.840.1.113719.1.27.101.41", + "1.2.840.113556.1.4.1413", + "1.2.840.113556.1.4.805", + "2.16.840.1.113730.3.4.18", + "1.2.840.113556.1.4.529" + ], + "supportedExtension": [ + "2.16.840.1.113719.1.148.100.1", + "2.16.840.1.113719.1.148.100.3", + "2.16.840.1.113719.1.148.100.5", + "2.16.840.1.113719.1.148.100.7", + "2.16.840.1.113719.1.148.100.9", + "2.16.840.1.113719.1.148.100.11", + "2.16.840.1.113719.1.148.100.13", + "2.16.840.1.113719.1.148.100.15", + "2.16.840.1.113719.1.148.100.17", + "2.16.840.1.113719.1.39.42.100.1", + "2.16.840.1.113719.1.39.42.100.3", + "2.16.840.1.113719.1.39.42.100.5", + "2.16.840.1.113719.1.39.42.100.7", + "2.16.840.1.113719.1.39.42.100.9", + "2.16.840.1.113719.1.39.42.100.11", + "2.16.840.1.113719.1.39.42.100.13", + "2.16.840.1.113719.1.39.42.100.15", + "2.16.840.1.113719.1.39.42.100.17", + "2.16.840.1.113719.1.39.42.100.19", + "2.16.840.1.113719.1.39.42.100.21", + "2.16.840.1.113719.1.39.42.100.23", + "2.16.840.1.113719.1.39.42.100.25", + "2.16.840.1.113719.1.39.42.100.27", + "2.16.840.1.113719.1.39.42.100.29", + "1.3.6.1.4.1.4203.1.11.1", + "2.16.840.1.113719.1.27.100.1", + "2.16.840.1.113719.1.27.100.3", + "2.16.840.1.113719.1.27.100.5", + "2.16.840.1.113719.1.27.100.7", + "2.16.840.1.113719.1.27.100.11", + "2.16.840.1.113719.1.27.100.13", + "2.16.840.1.113719.1.27.100.15", + "2.16.840.1.113719.1.27.100.17", + "2.16.840.1.113719.1.27.100.19", + "2.16.840.1.113719.1.27.100.21", + "2.16.840.1.113719.1.27.100.23", + "2.16.840.1.113719.1.27.100.25", + "2.16.840.1.113719.1.27.100.27", + "2.16.840.1.113719.1.27.100.29", + "2.16.840.1.113719.1.27.100.31", + "2.16.840.1.113719.1.27.100.33", + "2.16.840.1.113719.1.27.100.35", + "2.16.840.1.113719.1.27.100.37", + "2.16.840.1.113719.1.27.100.39", + "2.16.840.1.113719.1.27.100.41", + "2.16.840.1.113719.1.27.100.96", + "2.16.840.1.113719.1.27.100.98", + "2.16.840.1.113719.1.27.100.101", + "2.16.840.1.113719.1.27.100.103", + "2.16.840.1.113719.1.142.100.1", + "2.16.840.1.113719.1.142.100.4", + "2.16.840.1.113719.1.142.100.6", + "2.16.840.1.113719.1.27.100.9", + "2.16.840.1.113719.1.27.100.43", + "2.16.840.1.113719.1.27.100.45", + "2.16.840.1.113719.1.27.100.47", + "2.16.840.1.113719.1.27.100.49", + "2.16.840.1.113719.1.27.100.51", + "2.16.840.1.113719.1.27.100.53", + "2.16.840.1.113719.1.27.100.55", + "1.3.6.1.4.1.1466.20037", + "2.16.840.1.113719.1.27.100.79", + "2.16.840.1.113719.1.27.100.84", + "2.16.840.1.113719.1.27.103.1", + "2.16.840.1.113719.1.27.103.2" + ], + "supportedFeatures": [ + "1.3.6.1.4.1.4203.1.5.1", + "2.16.840.1.113719.1.27.99.1" + ], + "supportedGroupingTypes": [ + "2.16.840.1.113719.1.27.103.8" + ], + "supportedLDAPVersion": [ + "2", + "3" + ], + "supportedSASLMechanisms": [ + "NMAS_LOGIN" + ], + "unAuthBinds": [ + "0" + ], + "vendorName": [ + "NetIQ Corporation" + ], + "vendorVersion": [ + "LDAP Agent for NetIQ eDirectory 9.1.4 (40105.09)" + ], + "wholeSubtreeSearchOps": [ + "0" + ] + }, + "type": "DsaInfo" +} +""" \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/slapd24.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/slapd24.py new file mode 100644 index 0000000..1c66332 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/protocol/schemas/slapd24.py @@ -0,0 +1,758 @@ +""" +""" + +# Created on 2014.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +slapd_2_4_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 2.5.4.0 NAME 'objectClass' DESC 'RFC4512: object classes of the entity' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.21.9 NAME 'structuralObjectClass' DESC 'RFC4512: structural object class of entry' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.1 NAME 'createTimestamp' DESC 'RFC4512: time which object was created' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.2 NAME 'modifyTimestamp' DESC 'RFC4512: time which object was last modified' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.3 NAME 'creatorsName' DESC 'RFC4512: name of creator' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.4 NAME 'modifiersName' DESC 'RFC4512: name of last modifier' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.9 NAME 'hasSubordinates' DESC 'X.501: entry has children' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.10 NAME 'subschemaSubentry' DESC 'RFC4512: name of controlling subschema entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.1.20 NAME 'entryDN' DESC 'DN of the entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.1.16.4 NAME 'entryUUID' DESC 'UUID of the entry' EQUALITY UUIDMatch ORDERING UUIDOrderingMatch SYNTAX 1.3.6.1.1.16.1 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' DESC 'RFC4512: alternative servers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.5 NAME 'namingContexts' DESC 'RFC4512: naming contexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.13 NAME 'supportedControl' DESC 'RFC4512: supported controls' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.7 NAME 'supportedExtension' DESC 'RFC4512: supported extended operations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.15 NAME 'supportedLDAPVersion' DESC 'RFC4512: supported LDAP versions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.14 NAME 'supportedSASLMechanisms' DESC 'RFC4512: supported SASL mechanisms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation )", + "( 1.3.6.1.4.1.4203.1.3.5 NAME 'supportedFeatures' DESC 'RFC4512: features supported by the server' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", + "( 1.3.6.1.1.4 NAME 'vendorName' DESC 'RFC3045: name of implementation vendor' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", + "( 1.3.6.1.1.5 NAME 'vendorVersion' DESC 'RFC3045: version of implementation' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", + "( 2.5.21.4 NAME 'matchingRules' DESC 'RFC4512: matching rules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.30 USAGE directoryOperation )", + "( 2.5.21.5 NAME 'attributeTypes' DESC 'RFC4512: attribute types' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", + "( 2.5.21.6 NAME 'objectClasses' DESC 'RFC4512: object classes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", + "( 2.5.21.8 NAME 'matchingRuleUse' DESC 'RFC4512: matching rule uses' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.31 USAGE directoryOperation )", + "( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' DESC 'RFC4512: LDAP syntaxes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.54 USAGE directoryOperation )", + "( 2.5.4.1 NAME ( 'aliasedObjectName' 'aliasedEntryName' ) DESC 'RFC4512: name of aliased object' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' DESC 'RFC3296: subordinate referral URL' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE distributedOperation )", + "( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTtl' DESC 'RFC2589: entry time-to-live' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.119.4 NAME 'dynamicSubtrees' DESC 'RFC2589: dynamic subtrees' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE dSAOperation )", + "( 2.5.4.49 NAME 'distinguishedName' DESC 'RFC4519: common supertype of DN attributes' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.4.41 NAME 'name' DESC 'RFC4519: common supertype of name attributes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) DESC 'RFC4519: common name(s) for which the entity is known by' SUP name )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) DESC 'RFC4519: user identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'RFC2307: An integer uniquely identifying a user in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' DESC 'RFC2307: An integer uniquely identifying a group in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.5.4.35 NAME 'userPassword' DESC 'RFC4519/2307: password of user' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' DESC 'RFC2079: Uniform Resource Identifier with optional label' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.4.13 NAME 'description' DESC 'RFC4519: descriptive information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} )", + "( 2.5.4.34 NAME 'seeAlso' DESC 'RFC4519: DN of related object' SUP distinguishedName )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.78 NAME 'olcConfigFile' DESC 'File for slapd configuration directives' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.79 NAME 'olcConfigDir' DESC 'Directory for slapd configuration backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.1 NAME 'olcAccess' DESC 'Access Control List' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.86 NAME 'olcAddContentAcl' DESC 'Check ACLs against content of Add ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.2 NAME 'olcAllows' DESC 'Allowed set of deprecated features' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.3 NAME 'olcArgsFile' DESC 'File for slapd command line options' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.5 NAME 'olcAttributeOptions' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.4 NAME 'olcAttributeTypes' DESC 'OpenLDAP attributeTypes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.6 NAME 'olcAuthIDRewrite' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.7 NAME 'olcAuthzPolicy' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.8 NAME 'olcAuthzRegexp' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.9 NAME 'olcBackend' DESC 'A type of backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORDERED 'SIBLINGS' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.10 NAME 'olcConcurrency' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.11 NAME 'olcConnMaxPending' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.12 NAME 'olcConnMaxPendingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.13 NAME 'olcDatabase' DESC 'The backend type for a database instance' SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.14 NAME 'olcDefaultSearchBase' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.15 NAME 'olcDisallows' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.16 NAME 'olcDitContentRules' DESC 'OpenLDAP DIT content rules' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.20 NAME 'olcExtraAttrs' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.17 NAME 'olcGentleHUP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.17 NAME 'olcHidden' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.18 NAME 'olcIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.19 NAME 'olcInclude' SUP labeledURI )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.20 NAME 'olcIndexSubstrIfMinLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.21 NAME 'olcIndexSubstrIfMaxLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.22 NAME 'olcIndexSubstrAnyLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.23 NAME 'olcIndexSubstrAnyStep' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.84 NAME 'olcIndexIntLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.4 NAME 'olcLastMod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.85 NAME 'olcLdapSyntaxes' DESC 'OpenLDAP ldapSyntax' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.5 NAME 'olcLimits' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.93 NAME 'olcListenerThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.26 NAME 'olcLocalSSF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.27 NAME 'olcLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.28 NAME 'olcLogLevel' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.6 NAME 'olcMaxDerefDepth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.16 NAME 'olcMirrorMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.30 NAME 'olcModuleLoad' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.31 NAME 'olcModulePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.18 NAME 'olcMonitoring' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.32 NAME 'olcObjectClasses' DESC 'OpenLDAP object classes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.33 NAME 'olcObjectIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.34 NAME 'olcOverlay' SUP olcDatabase SINGLE-VALUE X-ORDERED 'SIBLINGS' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.35 NAME 'olcPasswordCryptSaltFormat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.36 NAME 'olcPasswordHash' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.37 NAME 'olcPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.38 NAME 'olcPlugin' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.39 NAME 'olcPluginLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.40 NAME 'olcReadOnly' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.41 NAME 'olcReferral' SUP labeledURI SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.7 NAME 'olcReplica' SUP labeledURI EQUALITY caseIgnoreMatch X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.43 NAME 'olcReplicaArgsFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.44 NAME 'olcReplicaPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.45 NAME 'olcReplicationInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.46 NAME 'olcReplogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.47 NAME 'olcRequires' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.48 NAME 'olcRestrict' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.49 NAME 'olcReverseLookup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.8 NAME 'olcRootDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.51 NAME 'olcRootDSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.9 NAME 'olcRootPW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.89 NAME 'olcSaslAuxprops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.53 NAME 'olcSaslHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.54 NAME 'olcSaslRealm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.56 NAME 'olcSaslSecProps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.58 NAME 'olcSchemaDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.59 NAME 'olcSecurity' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.81 NAME 'olcServerID' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.60 NAME 'olcSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.61 NAME 'olcSockbufMaxIncoming' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.62 NAME 'olcSockbufMaxIncomingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.83 NAME 'olcSortVals' DESC 'Attributes whose values will always be sorted' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.15 NAME 'olcSubordinate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.10 NAME 'olcSuffix' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.19 NAME 'olcSyncUseSubentry' DESC 'Store sync context in a subentry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.11 NAME 'olcSyncrepl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.90 NAME 'olcTCPBuffer' DESC 'Custom TCP buffer size' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.66 NAME 'olcThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.67 NAME 'olcTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.68 NAME 'olcTLSCACertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.69 NAME 'olcTLSCACertificatePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.70 NAME 'olcTLSCertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.71 NAME 'olcTLSCertificateKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.72 NAME 'olcTLSCipherSuite' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.73 NAME 'olcTLSCRLCheck' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.82 NAME 'olcTLSCRLFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.74 NAME 'olcTLSRandFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.75 NAME 'olcTLSVerifyClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.77 NAME 'olcTLSDHParamFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.87 NAME 'olcTLSProtocolMin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.80 NAME 'olcToolThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.12 NAME 'olcUpdateDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.13 NAME 'olcUpdateRef' SUP labeledURI EQUALITY caseIgnoreMatch )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.88 NAME 'olcWriteTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.1 NAME 'olcDbDirectory' DESC 'Directory for database content' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.11 NAME 'olcDbCacheFree' DESC 'Number of extra entries to free when max is reached' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.1 NAME 'olcDbCacheSize' DESC 'Entry cache size in entries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.2 NAME 'olcDbCheckpoint' DESC 'Database checkpoint interval in kbytes and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.16 NAME 'olcDbChecksum' DESC 'Enable database checksum validation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.13 NAME 'olcDbCryptFile' DESC 'Pathname of file containing the DB encryption key' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.14 NAME 'olcDbCryptKey' DESC 'DB encryption key' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.3 NAME 'olcDbConfig' DESC 'BerkeleyDB DB_CONFIG configuration directives' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.4 NAME 'olcDbNoSync' DESC 'Disable synchronous database writes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.15 NAME 'olcDbPageSize' DESC 'Page size of specified DB, in Kbytes' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.5 NAME 'olcDbDirtyRead' DESC 'Allow reads of uncommitted data' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.12 NAME 'olcDbDNcacheSize' DESC 'DN cache size' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.6 NAME 'olcDbIDLcacheSize' DESC 'IDL cache size in IDLs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.2 NAME 'olcDbIndex' DESC 'Attribute index parameters' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.7 NAME 'olcDbLinearIndex' DESC 'Index attributes one at a time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.8 NAME 'olcDbLockDetect' DESC 'Deadlock detection algorithm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.3 NAME 'olcDbMode' DESC 'Unix permissions of database files' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.9 NAME 'olcDbSearchStack' DESC 'Depth of search stack in IDLs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.10 NAME 'olcDbShmKey' DESC 'Key for shared memory region' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.14 NAME 'olcDbURI' DESC 'URI (list) for remote DSA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.1 NAME 'olcDbStartTLS' DESC 'StartTLS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.2 NAME 'olcDbACLAuthcDn' DESC 'Remote ACL administrative identity' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.3 NAME 'olcDbACLPasswd' DESC 'Remote ACL administrative identity credentials' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.4 NAME 'olcDbACLBind' DESC 'Remote ACL administrative identity auth bind configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.5 NAME 'olcDbIDAssertAuthcDn' DESC 'Remote Identity Assertion administrative identity' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.6 NAME 'olcDbIDAssertPasswd' DESC 'Remote Identity Assertion administrative identity credentials' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.7 NAME 'olcDbIDAssertBind' DESC 'Remote Identity Assertion administrative identity auth bind configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.8 NAME 'olcDbIDAssertMode' DESC 'Remote Identity Assertion mode' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.9 NAME 'olcDbIDAssertAuthzFrom' DESC 'Remote Identity Assertion authz rules' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.10 NAME 'olcDbRebindAsUser' DESC 'Rebind as user' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.11 NAME 'olcDbChaseReferrals' DESC 'Chase referrals' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.12 NAME 'olcDbTFSupport' DESC 'Absolute filters support' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.13 NAME 'olcDbProxyWhoAmI' DESC 'Proxy whoAmI exop' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.14 NAME 'olcDbTimeout' DESC 'Per-operation timeouts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.15 NAME 'olcDbIdleTimeout' DESC 'connection idle timeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.16 NAME 'olcDbConnTtl' DESC 'connection ttl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.17 NAME 'olcDbNetworkTimeout' DESC 'connection network timeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.18 NAME 'olcDbProtocolVersion' DESC 'protocol version' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.19 NAME 'olcDbSingleConn' DESC 'cache a single connection per identity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.20 NAME 'olcDbCancel' DESC 'abandon/ignore/exop operations when appropriate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.21 NAME 'olcDbQuarantine' DESC 'Quarantine database if connection fails and retry according to rule' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.22 NAME 'olcDbUseTemporaryConn' DESC 'Use temporary connections if the cached one is busy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.23 NAME 'olcDbConnectionPoolMax' DESC 'Max size of privileged connections pool' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.25 NAME 'olcDbNoRefs' DESC 'Do not return search reference responses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.26 NAME 'olcDbNoUndefFilter' DESC 'Do not propagate undefined search filters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.27 NAME 'olcDbIDAssertPassThru' DESC 'Remote Identity Assertion passthru rules' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.1 NAME 'olcChainingBehavior' DESC 'Chaining behavior control parameters (draft-sermersheim-ldap-chaining)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.2 NAME 'olcChainCacheURI' DESC 'Enables caching of URIs not present in configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.3 NAME 'olcChainMaxReferralDepth' DESC 'max referral depth' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.4 NAME 'olcChainReturnError' DESC 'Errors are returned instead of the original referral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.5.1 NAME 'olcRelay' DESC 'Relay DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.1 NAME 'olcAccessLogDB' DESC 'Suffix of database for log content' SUP distinguishedName SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.2 NAME 'olcAccessLogOps' DESC 'Operation types to log' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.3 NAME 'olcAccessLogPurge' DESC 'Log cleanup parameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.4 NAME 'olcAccessLogSuccess' DESC 'Log successful ops only' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.5 NAME 'olcAccessLogOld' DESC 'Log old values when modifying entries matching the filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.6 NAME 'olcAccessLogOldAttr' DESC 'Log old values of these attributes even if unmodified' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.7 NAME 'olcAccessLogBase' DESC 'Operation types to log under a specific branch' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.15.1 NAME 'olcAuditlogFile' DESC 'Filename for auditlogging' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.19.1 NAME 'olcCollectInfo' DESC 'DN of entry and attribute to distribute' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.13.1 NAME 'olcConstraintAttribute' DESC 'constraint for list of attributes' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.1 NAME 'olcDDSstate' DESC 'RFC2589 Dynamic directory services state' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.2 NAME 'olcDDSmaxTtl' DESC 'RFC2589 Dynamic directory services max TTL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.3 NAME 'olcDDSminTtl' DESC 'RFC2589 Dynamic directory services min TTL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.4 NAME 'olcDDSdefaultTtl' DESC 'RFC2589 Dynamic directory services default TTL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.5 NAME 'olcDDSinterval' DESC 'RFC2589 Dynamic directory services expiration task run interval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.6 NAME 'olcDDStolerance' DESC 'RFC2589 Dynamic directory services additional TTL in expiration scheduling' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.7 NAME 'olcDDSmaxDynamicObjects' DESC 'RFC2589 Dynamic directory services max number of dynamic objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.17.1 NAME 'olcDGAttrPair' DESC 'Member and MemberURL attribute pair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.8.1 NAME 'olcDlAttrSet' DESC 'Dynamic list: , , ' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.2.840.113556.1.2.102 NAME 'memberOf' DESC 'Group that the entry belongs to' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation X-ORIGIN 'iPlanet Delegated Administrator' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.0 NAME 'olcMemberOfDN' DESC 'DN to be used as modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.1 NAME 'olcMemberOfDangling' DESC 'Behavior with respect to dangling members, constrained to ignore, drop, error' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.2 NAME 'olcMemberOfRefInt' DESC 'Take care of referential integrity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.3 NAME 'olcMemberOfGroupOC' DESC 'Group objectClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.4 NAME 'olcMemberOfMemberAD' DESC 'member attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.5 NAME 'olcMemberOfMemberOfAD' DESC 'memberOf attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.7 NAME 'olcMemberOfDanglingError' DESC 'Error code returned in case of dangling back reference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.42.2.27.8.1.16 NAME 'pwdChangedTime' DESC 'The time the password was last changed' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.17 NAME 'pwdAccountLockedTime' DESC 'The time an user account was locked' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.19 NAME 'pwdFailureTime' DESC 'The timestamps of the last consecutive authentication failures' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.20 NAME 'pwdHistory' DESC 'The history of users passwords' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.21 NAME 'pwdGraceUseTime' DESC 'The timestamps of the grace login once the password has expired' EQUALITY generalizedTimeMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.22 NAME 'pwdReset' DESC 'The indication that the password has been reset' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.23 NAME 'pwdPolicySubentry' DESC 'The pwdPolicy subentry in effect for this object' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.1 NAME 'olcPPolicyDefault' DESC 'DN of a pwdPolicy object for uncustomized objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.2 NAME 'olcPPolicyHashCleartext' DESC 'Hash passwords on add or modify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.4 NAME 'olcPPolicyForwardUpdates' DESC 'Allow policy state updates to be forwarded via updateref' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.3 NAME 'olcPPolicyUseLockout' DESC 'Warn clients with AccountLocked' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.1 NAME ( 'olcPcache' 'olcProxyCache' ) DESC 'Proxy Cache basic parameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.2 NAME ( 'olcPcacheAttrset' 'olcProxyAttrset' ) DESC 'A set of attributes to cache' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.3 NAME ( 'olcPcacheTemplate' 'olcProxyCacheTemplate' ) DESC 'Filter template, attrset, cache TTL, optional negative TTL, optional sizelimit TTL, optional TTR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.4 NAME 'olcPcachePosition' DESC 'Response callback position in overlay stack' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.5 NAME ( 'olcPcacheMaxQueries' 'olcProxyCacheQueries' ) DESC 'Maximum number of queries to cache' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.6 NAME ( 'olcPcachePersist' 'olcProxySaveQueries' ) DESC 'Save cached queries for hot restart' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.7 NAME ( 'olcPcacheValidate' 'olcProxyCheckCacheability' ) DESC 'Check whether the results of a query are cacheable, e.g. for schema issues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.8 NAME 'olcPcacheOffline' DESC 'Set cache to offline mode and disable expiration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.9 NAME 'olcPcacheBind' DESC 'Parameters for caching Binds' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.11.1 NAME 'olcRefintAttribute' DESC 'Attributes for referential integrity' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.11.2 NAME 'olcRefintNothing' DESC 'Replacement DN to supply when needed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.11.3 NAME 'olcRefintModifiersName' DESC 'The DN to use as modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.1 NAME 'olcRetcodeParent' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.2 NAME 'olcRetcodeItem' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.3 NAME 'olcRetcodeInDir' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.4 NAME 'olcRetcodeSleep' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.1 NAME 'olcRwmRewrite' DESC 'Rewrites strings' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.2 NAME 'olcRwmTFSupport' DESC 'Absolute filters support' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.3 NAME 'olcRwmMap' DESC 'maps attributes/objectClasses' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.4 NAME 'olcRwmNormalizeMapped' DESC 'Normalize mapped attributes/objectClasses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.5 NAME 'olcRwmDropUnrequested' DESC 'Drop unrequested attributes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.21.1 NAME 'olcSssVlvMax' DESC 'Maximum number of concurrent Sort requests' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.21.2 NAME 'olcSssVlvMaxKeys' DESC 'Maximum number of Keys in a Sort request' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.21.3 NAME 'olcSssVlvMaxPerConn' DESC 'Maximum number of concurrent paged search requests per connection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.1 NAME 'olcSpCheckpoint' DESC 'ContextCSN checkpoint interval in ops and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.2 NAME 'olcSpSessionlog' DESC 'Session log size in ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.3 NAME 'olcSpNoPresent' DESC 'Omit Present phase processing' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.4 NAME 'olcSpReloadHint' DESC 'Observe Reload Hint in Request control' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.1 NAME 'olcTranslucentStrict' DESC 'Reveal attribute deletion constraint violations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.2 NAME 'olcTranslucentNoGlue' DESC 'Disable automatic glue records for ADD and MODRDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.3 NAME 'olcTranslucentLocal' DESC 'Attributes to use in local search filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.4 NAME 'olcTranslucentRemote' DESC 'Attributes to use in remote search filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.5 NAME 'olcTranslucentBindLocal' DESC 'Enable local bind' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.6 NAME 'olcTranslucentPwModLocal' DESC 'Enable local RFC 3062 Password Modify extended operation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.1 NAME 'olcUniqueBase' DESC 'Subtree for uniqueness searches' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.2 NAME 'olcUniqueIgnore' DESC 'Attributes for which uniqueness shall not be enforced' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.3 NAME 'olcUniqueAttribute' DESC 'Attributes for which uniqueness shall be enforced' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.4 NAME 'olcUniqueStrict' DESC 'Enforce uniqueness of null values' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.5 NAME 'olcUniqueURI' DESC 'List of keywords and LDAP URIs for a uniqueness domain' EQUALITY caseExactMatch ORDERING caseExactOrderingMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.5.1 NAME 'olcValSortAttr' DESC 'Sorting rule for attribute under given DN' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: knowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", + "( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name )", + "( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial number of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC4519: two-letter ISO-3166 country code' SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE )", + "( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: locality which this object resides in' SUP name )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RFC2256: state or province which this object resides in' SUP name )", + "( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC2256: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )", + "( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256: organization this object belongs to' SUP name )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC 'RFC2256: organizational unit this object belongs to' SUP name )", + "( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associated with the entity' SUP name )", + "( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search guide, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 )", + "( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: business category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )", + "( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal code' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )", + "( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post Office Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RFC2256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )", + "( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Telephone Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} )", + "( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC2256: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 )", + "( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) DESC 'RFC2256: Facsimile (Fax) Telephone Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 )", + "( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} )", + "( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC2256: international ISDN number' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} )", + "( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: registered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256: destination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC2256: preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE )", + "( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: presentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 SINGLE-VALUE )", + "( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'RFC2256: supported application context' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a group' SUP distinguishedName )", + "( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the object)' SUP distinguishedName )", + "( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupant of role' SUP distinguishedName )", + "( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.509 user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )", + "( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 CA certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )", + "( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC2256: X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )", + "( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC2256: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )", + "( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256: X.509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.10 )", + "( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: first name(s) for which the entity is known by' SUP name )", + "( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of some or all of names, but not the surname(s).' SUP name )", + "( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: name qualifier indicating a generation' SUP name )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256: X.500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", + "( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN qualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: enhanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 )", + "( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: protocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )", + "( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique member of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", + "( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: house identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", + "( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: supported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 )", + "( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: delta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )", + "( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD' SUP name )", + "( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudonym for the object' SUP name )", + "( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbox' ) DESC 'RFC1274: RFC822 Mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )", + "( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' DESC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 'pkcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )", + "( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274: general information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} )", + "( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RFC1274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274: photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} )", + "( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC1274: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274: host computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC1274: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' DESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC 'RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' DESC 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DESC 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' DESC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'RFC1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.39 )", + "( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DESC 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' DESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DESC 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCountryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' DESC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC 'RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )", + "( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOption' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC 'RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC 'RFC1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality' DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQuality' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQuality' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.53 NAME 'personalSignature' DESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 )", + "( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 'RFC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC1274: audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} )", + "( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' DESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC2798: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'RFC2798: identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RFC2798: numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'RFC2798: preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )", + "( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'The GECOS field; the common name' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absolute path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'The path to the login shell' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.6 NAME 'shadowMin' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.7 NAME 'shadowMax' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.12 NAME 'memberUid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Netgroup triple' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' DESC 'Service port number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' DESC 'Service protocol name' SUP name )", + "( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' DESC 'IP protocol number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' DESC 'ONC RPC number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'IPv4 addresses as a dotted decimal omitting leading zeros or IPv6 addresses as defined in RFC2373' SUP name )", + "( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'IP network as a dotted decimal, eg. 192.168, omitting leading zeros' SUP name SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'IP netmask as a dotted decimal, eg. 255.255.255.0, omitting leading zeros' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'MAC address in maximal, colon separated hex notation, eg. 00:00:92:90:ee:e2' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'rpc.bootparamd parameter' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Boot image name' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.26 NAME 'nisMapName' DESC 'Name of a A generic NIS map' SUP name )", + "( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' DESC 'A generic NIS entry' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.28 NAME 'nisPublicKey' DESC 'NIS public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.29 NAME 'nisSecretKey' DESC 'NIS secret key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.30 NAME 'nisDomain' DESC 'NIS domain' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.31 NAME 'automountMapName' DESC 'automount Map Name' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.32 NAME 'automountKey' DESC 'Automount Key value' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.33 NAME 'automountInformation' DESC 'Automount information' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.2 NAME 'suseDefaultBase' DESC 'Base DN where new Objects should be created by default' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.3 NAME 'suseNextUniqueId' DESC 'Next unused unique ID, can be used to generate directory wide uniqe IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.4 NAME 'suseMinUniqueId' DESC 'lower Border for Unique IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.5 NAME 'suseMaxUniqueId' DESC 'upper Border for Unique IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.6 NAME 'suseDefaultTemplate' DESC 'The DN of a template that should be used by default' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.7 NAME 'suseSearchFilter' DESC 'Search filter to localize Objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.11 NAME 'suseDefaultValue' DESC 'an Attribute-Value-Assertions to define defaults for specific Attributes' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.12 NAME 'suseNamingAttribute' DESC 'AttributeType that should be used as the RDN' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.15 NAME 'suseSecondaryGroup' DESC 'seconday group DN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.16 NAME 'suseMinPasswordLength' DESC 'minimum Password length for new users' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.17 NAME 'suseMaxPasswordLength' DESC 'maximum Password length for new users' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.18 NAME 'susePasswordHash' DESC 'Hash method to use for new users' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.19 NAME 'suseSkelDir' DESC '' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.20 NAME 'susePlugin' DESC 'plugin to use upon user/ group creation' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.21 NAME 'suseMapAttribute' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.22 NAME 'suseImapServer' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.23 NAME 'suseImapAdmin' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.24 NAME 'suseImapDefaultQuota' DESC '' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.25 NAME 'suseImapUseSsl' DESC '' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )" + ], + "cn": [ + "Subschema" + ], + "createTimestamp": [ + "20141024204149Z" + ], + "entryDN": [ + "cn=Subschema" + ], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )", + "( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.4203.666.11.10.2.1 DESC 'X.509 AttributeCertificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )", + "( 1.2.36.79672281.1.5.0 DESC 'RDN' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )", + "( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )", + "( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' )", + "( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )", + "( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' )", + "( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' )", + "( 1.3.6.1.1.16.1 DESC 'UUID' )" + ], + "matchingRuleUse": [ + "( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' APPLIES ( altServer $ olcDbConfig $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox $ gecos $ homeDirectory $ loginShell $ memberUid $ memberNisNetgroup $ nisNetgroupTriple $ ipNetmaskNumber $ macAddress $ bootParameter $ bootFile $ nisMapEntry $ nisDomain $ automountMapName $ automountKey $ automountInformation $ suseNamingAttribute $ susePasswordHash $ suseSkelDir ) )", + "( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' APPLIES ( altServer $ olcDbConfig $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox $ gecos $ homeDirectory $ loginShell $ memberUid $ memberNisNetgroup $ nisNetgroupTriple $ ipNetmaskNumber $ macAddress $ bootParameter $ bootFile $ nisMapEntry $ nisDomain $ automountMapName $ automountKey $ automountInformation $ suseNamingAttribute $ susePasswordHash $ suseSkelDir ) )", + "( 2.5.13.38 NAME 'certificateListExactMatch' APPLIES ( authorityRevocationList $ certificateRevocationList $ deltaRevocationList ) )", + "( 2.5.13.34 NAME 'certificateExactMatch' APPLIES ( userCertificate $ cACertificate ) )", + "( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ ldapSyntaxes $ supportedApplicationContext ) )", + "( 2.5.13.29 NAME 'integerFirstComponentMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' APPLIES ( createTimestamp $ modifyTimestamp $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ pwdGraceUseTime ) )", + "( 2.5.13.27 NAME 'generalizedTimeMatch' APPLIES ( createTimestamp $ modifyTimestamp $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ pwdGraceUseTime ) )", + "( 2.5.13.24 NAME 'protocolInformationMatch' APPLIES protocolInformation )", + "( 2.5.13.23 NAME 'uniqueMemberMatch' APPLIES uniqueMember )", + "( 2.5.13.22 NAME 'presentationAddressMatch' APPLIES presentationAddress )", + "( 2.5.13.20 NAME 'telephoneNumberMatch' APPLIES ( telephoneNumber $ homePhone $ mobile $ pager ) )", + "( 2.5.13.18 NAME 'octetStringOrderingMatch' APPLIES ( userPassword $ olcDbCryptKey $ pwdHistory $ nisPublicKey $ nisSecretKey ) )", + "( 2.5.13.17 NAME 'octetStringMatch' APPLIES ( userPassword $ olcDbCryptKey $ pwdHistory $ nisPublicKey $ nisSecretKey ) )", + "( 2.5.13.16 NAME 'bitStringMatch' APPLIES x500UniqueIdentifier )", + "( 2.5.13.15 NAME 'integerOrderingMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 2.5.13.14 NAME 'integerMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 2.5.13.13 NAME 'booleanMatch' APPLIES ( hasSubordinates $ olcAddContentAcl $ olcGentleHUP $ olcHidden $ olcLastMod $ olcMirrorMode $ olcMonitoring $ olcReadOnly $ olcReverseLookup $ olcSyncUseSubentry $ olcDbChecksum $ olcDbNoSync $ olcDbDirtyRead $ olcDbLinearIndex $ olcDbRebindAsUser $ olcDbChaseReferrals $ olcDbProxyWhoAmI $ olcDbSingleConn $ olcDbUseTemporaryConn $ olcDbNoRefs $ olcDbNoUndefFilter $ olcChainCacheURI $ olcChainReturnError $ olcAccessLogSuccess $ olcDDSstate $ olcMemberOfRefInt $ pwdReset $ olcPPolicyHashCleartext $ olcPPolicyForwardUpdates $ olcPPolicyUseLockout $ olcPcachePersist $ olcPcacheValidate $ olcPcacheOffline $ olcRetcodeInDir $ olcRwmNormalizeMapped $ olcRwmDropUnrequested $ olcSpNoPresent $ olcSpReloadHint $ olcTranslucentStrict $ olcTranslucentNoGlue $ olcTranslucentBindLocal $ olcTranslucentPwModLocal $ olcUniqueStrict $ suseImapUseSsl ) )", + "( 2.5.13.11 NAME 'caseIgnoreListMatch' APPLIES ( postalAddress $ registeredAddress $ homePostalAddress ) )", + "( 2.5.13.9 NAME 'numericStringOrderingMatch' APPLIES ( x121Address $ internationaliSDNNumber ) )", + "( 2.5.13.8 NAME 'numericStringMatch' APPLIES ( x121Address $ internationaliSDNNumber ) )", + "( 2.5.13.7 NAME 'caseExactSubstringsMatch' APPLIES ( serialNumber $ destinationIndicator $ dnQualifier ) )", + "( 2.5.13.6 NAME 'caseExactOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.5 NAME 'caseExactMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' APPLIES ( serialNumber $ destinationIndicator $ dnQualifier ) )", + "( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.2 NAME 'caseIgnoreMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.1 NAME 'distinguishedNameMatch' APPLIES ( creatorsName $ modifiersName $ subschemaSubentry $ entryDN $ namingContexts $ aliasedObjectName $ dynamicSubtrees $ distinguishedName $ seeAlso $ olcDefaultSearchBase $ olcRootDN $ olcSchemaDN $ olcSuffix $ olcUpdateDN $ olcDbACLAuthcDn $ olcDbIDAssertAuthcDn $ olcRelay $ olcAccessLogDB $ memberOf $ olcMemberOfDN $ pwdPolicySubentry $ olcPPolicyDefault $ olcRefintNothing $ olcRefintModifiersName $ olcRetcodeParent $ olcUniqueBase $ member $ owner $ roleOccupant $ manager $ documentAuthor $ secretary $ associatedName $ dITRedirect $ suseDefaultBase $ suseDefaultTemplate $ suseSecondaryGroup ) )", + "( 2.5.13.0 NAME 'objectIdentifierMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ supportedApplicationContext ) )" + ], + "matchingRules": [ + "( 1.3.6.1.1.16.3 NAME 'UUIDOrderingMatch' SYNTAX 1.3.6.1.1.16.1 )", + "( 1.3.6.1.1.16.2 NAME 'UUIDMatch' SYNTAX 1.3.6.1.1.16.1 )", + "( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 2.5.13.38 NAME 'certificateListExactMatch' SYNTAX 1.3.6.1.1.15.5 )", + "( 2.5.13.34 NAME 'certificateExactMatch' SYNTAX 1.3.6.1.1.15.1 )", + "( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.13.29 NAME 'integerFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.27 NAME 'generalizedTimeMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.23 NAME 'uniqueMemberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", + "( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.20 NAME 'telephoneNumberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 2.5.13.19 NAME 'octetStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.18 NAME 'octetStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.17 NAME 'octetStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.16 NAME 'bitStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", + "( 2.5.13.15 NAME 'integerOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.14 NAME 'integerMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.13 NAME 'booleanMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 2.5.13.11 NAME 'caseIgnoreListMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.13.10 NAME 'numericStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.9 NAME 'numericStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.8 NAME 'numericStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.7 NAME 'caseExactSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.6 NAME 'caseExactOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.5 NAME 'caseExactMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.2 NAME 'caseIgnoreMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.2.36.79672281.1.13.3 NAME 'rdnMatch' SYNTAX 1.2.36.79672281.1.5.0 )", + "( 2.5.13.1 NAME 'distinguishedNameMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.13.0 NAME 'objectIdentifierMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )" + ], + "modifyTimestamp": [ + "20141024204149Z" + ], + "objectClass": [ + "top", + "subentry", + "subschema", + "extensibleObject" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRACT MUST objectClass )", + "( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' DESC 'RFC4512: extensible object' SUP top AUXILIARY )", + "( 2.5.6.1 NAME 'alias' DESC 'RFC4512: an alias' SUP top STRUCTURAL MUST aliasedObjectName )", + "( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'namedref: named subordinate referral' SUP top STRUCTURAL MUST ref )", + "( 1.3.6.1.4.1.4203.1.4.1 NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) DESC 'OpenLDAP Root DSE object' SUP top STRUCTURAL MAY cn )", + "( 2.5.17.0 NAME 'subentry' DESC 'RFC3672: subentry' SUP top STRUCTURAL MUST ( cn $ subtreeSpecification ) )", + "( 2.5.20.1 NAME 'subschema' DESC 'RFC4512: controlling subschema (sub)entry' AUXILIARY MAY ( dITStructureRules $ nameForms $ dITContentRules $ objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) )", + "( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject' DESC 'RFC2589: Dynamic Object' SUP top AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.0 NAME 'olcConfig' DESC 'OpenLDAP configuration object' SUP top ABSTRACT )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.1 NAME 'olcGlobal' DESC 'OpenLDAP Global configuration options' SUP olcConfig STRUCTURAL MAY ( cn $ olcConfigFile $ olcConfigDir $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcDisallows $ olcGentleHUP $ olcIdleTimeout $ olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcLocalSSF $ olcLogFile $ olcLogLevel $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPluginLogFile $ olcReadOnly $ olcReferral $ olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ olcRootDSE $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcTCPBuffer $ olcThreads $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSCRLFile $ olcToolThreads $ olcWriteTimeout $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.2 NAME 'olcSchemaConfig' DESC 'OpenLDAP schema object' SUP olcConfig STRUCTURAL MAY ( cn $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.3 NAME 'olcBackendConfig' DESC 'OpenLDAP Backend-specific options' SUP olcConfig STRUCTURAL MUST olcBackend )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.4 NAME 'olcDatabaseConfig' DESC 'OpenLDAP Database-specific options' SUP olcConfig STRUCTURAL MUST olcDatabase MAY ( olcHidden $ olcSuffix $ olcSubordinate $ olcAccess $ olcAddContentAcl $ olcLastMod $ olcLimits $ olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncUseSubentry $ olcSyncrepl $ olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ olcMonitoring $ olcExtraAttrs ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.5 NAME 'olcOverlayConfig' DESC 'OpenLDAP Overlay-specific options' SUP olcConfig STRUCTURAL MUST olcOverlay )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.6 NAME 'olcIncludeFile' DESC 'OpenLDAP configuration include file' SUP olcConfig STRUCTURAL MUST olcInclude MAY ( cn $ olcRootDSE ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.7 NAME 'olcFrontendConfig' DESC 'OpenLDAP frontend configuration' AUXILIARY MAY ( olcDefaultSearchBase $ olcPasswordHash $ olcSortVals ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.8 NAME 'olcModuleList' DESC 'OpenLDAP dynamic module info' SUP olcConfig STRUCTURAL MAY ( cn $ olcModulePath $ olcModuleLoad ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.2.1 NAME 'olcLdifConfig' DESC 'LDIF backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.4.1 NAME 'olcMonitorConfig' DESC 'Monitor backend configuration' SUP olcDatabaseConfig STRUCTURAL )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.1.1 NAME 'olcBdbConfig' DESC 'BDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCacheSize $ olcDbCheckpoint $ olcDbConfig $ olcDbCryptFile $ olcDbCryptKey $ olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ olcDbMode $ olcDbSearchStack $ olcDbShmKey $ olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.1.2 NAME 'olcHdbConfig' DESC 'HDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCacheSize $ olcDbCheckpoint $ olcDbConfig $ olcDbCryptFile $ olcDbCryptKey $ olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ olcDbMode $ olcDbSearchStack $ olcDbShmKey $ olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.3.1 NAME 'olcLDAPConfig' DESC 'LDAP backend configuration' SUP olcDatabaseConfig STRUCTURAL MAY ( olcDbURI $ olcDbStartTLS $ olcDbACLAuthcDn $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertAuthcDn $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbIDAssertPassThru $ olcDbRebindAsUser $ olcDbChaseReferrals $ olcDbTFSupport $ olcDbProxyWhoAmI $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbProtocolVersion $ olcDbSingleConn $ olcDbCancel $ olcDbQuarantine $ olcDbUseTemporaryConn $ olcDbConnectionPoolMax $ olcDbNoRefs $ olcDbNoUndefFilter ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.3.1 NAME 'olcChainConfig' DESC 'Chain configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcChainingBehavior $ olcChainCacheURI $ olcChainMaxReferralDepth $ olcChainReturnError ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.3.2 NAME 'olcChainDatabase' DESC 'Chain remote server configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.3.3 NAME 'olcPBindConfig' DESC 'Proxy Bind configuration' SUP olcOverlayConfig STRUCTURAL MUST olcDbURI MAY ( olcDbStartTLS $ olcDbNetworkTimeout $ olcDbQuarantine ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.7.1 NAME 'olcDistProcConfig' DESC 'Distributed procedures configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcChainingBehavior $ olcChainCacheURI ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.7.2 NAME 'olcDistProcDatabase' DESC 'Distributed procedure remote server configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.5.1 NAME 'olcRelayConfig' DESC 'Relay backend configuration' SUP olcDatabaseConfig STRUCTURAL MAY olcRelay )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.4.1 NAME 'olcAccessLogConfig' DESC 'Access log configuration' SUP olcOverlayConfig STRUCTURAL MUST olcAccessLogDB MAY ( olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogSuccess $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.15.1 NAME 'olcAuditlogConfig' DESC 'Auditlog configuration' SUP olcOverlayConfig STRUCTURAL MAY olcAuditlogFile )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.19.1 NAME 'olcCollectConfig' DESC 'Collective Attribute configuration' SUP olcOverlayConfig STRUCTURAL MAY olcCollectInfo )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.13.1 NAME 'olcConstraintConfig' DESC 'Constraint overlay configuration' SUP olcOverlayConfig STRUCTURAL MAY olcConstraintAttribute )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.9.1 NAME 'olcDDSConfig' DESC 'RFC2589 Dynamic directory services configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcDDSstate $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDDSmaxDynamicObjects ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.17.1 NAME 'olcDGConfig' DESC 'Dynamic Group configuration' SUP olcOverlayConfig STRUCTURAL MAY olcDGAttrPair )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.8.1 NAME 'olcDynamicList' DESC 'Dynamic list configuration' SUP olcOverlayConfig STRUCTURAL MAY olcDLattrSet )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.18.1 NAME 'olcMemberOf' DESC 'Member-of configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcMemberOfDN $ olcMemberOfDangling $ olcMemberOfDanglingError $ olcMemberOfRefInt $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.12.1 NAME 'olcPPolicyConfig' DESC 'Password Policy configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcPPolicyDefault $ olcPPolicyHashCleartext $ olcPPolicyUseLockout $ olcPPolicyForwardUpdates ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.2.1 NAME 'olcPcacheConfig' DESC 'ProxyCache configuration' SUP olcOverlayConfig STRUCTURAL MUST ( olcPcache $ olcPcacheAttrset $ olcPcacheTemplate ) MAY ( olcPcachePosition $ olcPcacheMaxQueries $ olcPcachePersist $ olcPcacheValidate $ olcPcacheOffline $ olcPcacheBind ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.2.2 NAME 'olcPcacheDatabase' DESC 'Cache database configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.11.1 NAME 'olcRefintConfig' DESC 'Referential integrity configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcRefintAttribute $ olcRefintNothing $ olcRefintModifiersName ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.20.1 NAME 'olcRetcodeConfig' DESC 'Retcode configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcRetcodeParent $ olcRetcodeItem $ olcRetcodeInDir $ olcRetcodeSleep ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.16.1 NAME 'olcRwmConfig' DESC 'Rewrite/remap configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcRwmNormalizeMapped ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.21.1 NAME 'olcSssVlvConfig' DESC 'SSS VLV configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcSssVlvMax $ olcSssVlvMaxKeys ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.1.1 NAME 'olcSyncProvConfig' DESC 'SyncRepl Provider configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcSpCheckpoint $ olcSpSessionlog $ olcSpNoPresent $ olcSpReloadHint ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.14.1 NAME 'olcTranslucentConfig' DESC 'Translucent configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcTranslucentStrict $ olcTranslucentNoGlue $ olcTranslucentLocal $ olcTranslucentRemote $ olcTranslucentBindLocal $ olcTranslucentPwModLocal ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.14.2 NAME 'olcTranslucentDatabase' DESC 'Translucent target database configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.10.1 NAME 'olcUniqueConfig' DESC 'Attribute value uniqueness configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcUniqueBase $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueStrict $ olcUniqueURI ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.5.1 NAME 'olcValSortConfig' DESC 'Value Sorting configuration' SUP olcOverlayConfig STRUCTURAL MUST olcValSortAttr )", + "( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) )", + "( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) )", + "( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )", + "( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )", + "( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )", + "( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )", + "( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an organizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) )", + "( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )", + "( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an residential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) )", + "( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an application process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) )", + "( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an application entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) )", + "( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory system agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformation )", + "( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC2256: a strong authentication user' SUP top AUXILIARY MUST userCertificate )", + "( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256: a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair )", + "( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a group of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST ( uniqueMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )", + "( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC2256: a user security information' SUP top AUXILIARY MAY supportedAlgorithms )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP certificationAuthority AUXILIARY MAY deltaRevocationList )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST cn MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) )", + "( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST dmdName MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )", + "( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' SUP top AUXILIARY MAY userCertificate )", + "( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate authority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRevocationList $ cACertificate $ crossCertificatePair ) )", + "( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SUP top AUXILIARY MAY deltaRevocationList )", + "( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'RFC2079: object that contains the URI attribute type' SUP top AUXILIARY MAY labeledURI )", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: domain component object' SUP top AUXILIARY MUST dc )", + "( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid object' SUP top AUXILIARY MUST uid )", + "( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPilotPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rfc822Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber $ homePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod $ businessCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ pagerTelephoneNumber $ organizationalStatus $ mailPreferenceOption $ personalSignature ) )", + "( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST userid MAY ( description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ host ) )", + "( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) )", + "( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) )", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber $ localityName $ organizationName $ organizationalUnitName ) )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST domainComponent MAY ( associatedName $ organizationName $ description $ businessCategory $ seeAlso $ searchGuide $ userPassword $ localityName $ stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) )", + "( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP domain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ telephoneNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) )", + "( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domain STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAMERecord ) )", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' DESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST associatedDomain )", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST friendlyCountryName )", + "( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' SUP ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName )", + "( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa STRUCTURAL MAY dSAQuality )", + "( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData' SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMaximumQuality ) )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) )", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Additional attributes for shadow passwords' SUP top AUXILIARY MUST uid MAY ( userPassword $ description $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ) )", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top AUXILIARY MUST gidNumber MAY ( userPassword $ memberUid $ description ) )", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Abstraction an Internet Protocol service. Maps an IP port and protocol (such as tcp or udp) to one or more names; the distinguished value of the cn attribute denotes the services canonical name' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description )", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Abstraction of an IP protocol. Maps a protocol number to one or more names. The distinguished value of the cn attribute denotes the protocols canonical name' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber ) MAY description )", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Abstraction of an Open Network Computing (ONC) [RFC1057] Remote Procedure Call (RPC) binding. This class maps an ONC RPC number to a name. The distinguished value of the cn attribute denotes the RPC services canonical name' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber ) MAY description )", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Abstraction of a host, an IP device. The distinguished value of the cn attribute denotes the hosts canonical name. Device SHOULD be used as a structural class' SUP top AUXILIARY MUST ( cn $ ipHostNumber ) MAY ( userPassword $ l $ description $ manager ) )", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Abstraction of a network. The distinguished value of the cn attribute denotes the networks canonical name' SUP top STRUCTURAL MUST ipNetworkNumber MAY ( cn $ ipNetmaskNumber $ l $ description $ manager ) )", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Abstraction of a netgroup. May refer to other netgroups' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) )", + "( 1.3.6.1.1.1.2.9 NAME 'nisMap' DESC 'A generic abstraction of a NIS map' SUP top STRUCTURAL MUST nisMapName MAY description )", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'An entry in a NIS map' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY description )", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'A device with a MAC address; device SHOULD be used as a structural class' SUP top AUXILIARY MAY macAddress )", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'A device with boot parameters; device SHOULD be used as a structural class' SUP top AUXILIARY MAY ( bootFile $ bootParameter ) )", + "( 1.3.6.1.1.1.2.14 NAME 'nisKeyObject' DESC 'An object with a public and secret key' SUP top AUXILIARY MUST ( cn $ nisPublicKey $ nisSecretKey ) MAY ( uidNumber $ description ) )", + "( 1.3.6.1.1.1.2.15 NAME 'nisDomainObject' DESC 'Associates a NIS domain with a naming context' SUP top AUXILIARY MUST nisDomain )", + "( 1.3.6.1.1.1.2.16 NAME 'automountMap' SUP top STRUCTURAL MUST automountMapName MAY description )", + "( 1.3.6.1.1.1.2.17 NAME 'automount' DESC 'Automount information' SUP top STRUCTURAL MUST ( automountKey $ automountInformation ) MAY description )", + "( 1.3.6.1.4.1.5322.13.1.1 NAME 'namedObject' SUP top STRUCTURAL MAY cn )", + "( 1.3.6.1.4.1.7057.10.1.2.1.2 NAME 'suseModuleConfiguration' DESC 'Contains configuration of Management Modules' SUP top STRUCTURAL MUST cn MAY suseDefaultBase )", + "( 1.3.6.1.4.1.7057.10.1.2.1.3 NAME 'suseUserConfiguration' DESC 'Configuration of user management tools' SUP suseModuleConfiguration STRUCTURAL MAY ( suseMinPasswordLength $ suseMaxPasswordLength $ susePasswordHash $ suseSkelDir $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseDefaultTemplate $ suseSearchFilter $ suseMapAttribute ) )", + "( 1.3.6.1.4.1.7057.10.1.2.1.4 NAME 'suseObjectTemplate' DESC 'Base Class for Object-Templates' SUP top STRUCTURAL MUST cn MAY ( susePlugin $ suseDefaultValue $ suseNamingAttribute ) )", + "( 1.3.6.1.4.1.7057.10.1.2.1.5 NAME 'suseUserTemplate' DESC 'User object template' SUP suseObjectTemplate STRUCTURAL MUST cn MAY suseSecondaryGroup )", + "( 1.3.6.1.4.1.7057.10.1.2.1.6 NAME 'suseGroupTemplate' DESC 'Group object template' SUP suseObjectTemplate STRUCTURAL MUST cn )", + "( 1.3.6.1.4.1.7057.10.1.2.1.7 NAME 'suseGroupConfiguration' DESC 'Configuration of user management tools' SUP suseModuleConfiguration STRUCTURAL MAY ( suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseDefaultTemplate $ suseSearchFilter $ suseMapAttribute ) )", + "( 1.3.6.1.4.1.7057.10.1.2.1.8 NAME 'suseCaConfiguration' DESC 'Configuration of CA management tools' SUP suseModuleConfiguration STRUCTURAL )", + "( 1.3.6.1.4.1.7057.10.1.2.1.9 NAME 'suseDnsConfiguration' DESC 'Configuration of mail server management tools' SUP suseModuleConfiguration STRUCTURAL )", + "( 1.3.6.1.4.1.7057.10.1.2.1.10 NAME 'suseDhcpConfiguration' DESC 'Configuration of DHCP server management tools' SUP suseModuleConfiguration STRUCTURAL )", + "( 1.3.6.1.4.1.7057.10.1.2.1.11 NAME 'suseMailConfiguration' DESC 'Configuration of IMAP user management tools' SUP suseModuleConfiguration STRUCTURAL MUST ( suseImapServer $ suseImapAdmin $ suseImapDefaultQuota $ suseImapUseSsl ) )" + ], + "structuralObjectClass": [ + "subentry" + ], + "subschemaSubentry": [ + "cn=Subschema" + ] + }, + "schema_entry": "cn=Subschema", + "type": "SchemaInfo" +} +""" + +slapd_2_4_dsa_info = """ +{ + "raw": { + "configContext": [ + "cn=config" + ], + "entryDN": [ + "" + ], + "namingContexts": [ + "o=services", + "o=test" + ], + "objectClass": [ + "top", + "OpenLDAProotDSE" + ], + "structuralObjectClass": [ + "OpenLDAProotDSE" + ], + "subschemaSubentry": [ + "cn=Subschema" + ], + "supportedControl": [ + "1.3.6.1.4.1.4203.1.9.1.1", + "2.16.840.1.113730.3.4.18", + "2.16.840.1.113730.3.4.2", + "1.3.6.1.4.1.4203.1.10.1", + "1.2.840.113556.1.4.319", + "1.2.826.0.1.3344810.2.3", + "1.3.6.1.1.13.2", + "1.3.6.1.1.13.1", + "1.3.6.1.1.12" + ], + "supportedExtension": [ + "1.3.6.1.4.1.1466.20037", + "1.3.6.1.4.1.4203.1.11.1", + "1.3.6.1.4.1.4203.1.11.3", + "1.3.6.1.1.8" + ], + "supportedFeatures": [ + "1.3.6.1.1.14", + "1.3.6.1.4.1.4203.1.5.1", + "1.3.6.1.4.1.4203.1.5.2", + "1.3.6.1.4.1.4203.1.5.3", + "1.3.6.1.4.1.4203.1.5.4", + "1.3.6.1.4.1.4203.1.5.5" + ], + "supportedLDAPVersion": [ + "3" + ], + "supportedSASLMechanisms": [ + "GSSAPI", + "DIGEST-MD5" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fb024aef157b68d0ca4c9f91bc34ea99865dd1e GIT binary patch literal 141 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CUsn1hxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!#}jq$sf@HN8?lK0Y%qvm`!Vub}c4hfQvNN@-52 L9mvdLAZ7pn@w@AtlTb1?A# z{SPVsvqtn^dg%#3e~704g)SuuiHxorYUi)Lm8)1B`o~%VHrO})4xY2VJg6l-eGHnEjAd?2Ml4GQv6*@TgcOnr9Dc! zl=dv$q0}cJ$NZQK7%--Ll&%1|VZE_b6Vfl0JwEYAcpe{SdIY^J03*;bBXX$9qMYl= z=%L|7Y}2Eqf_jt{qj+>63yEE&!j6$Slt-hus(>%AVmQ(=-=9Qhn;7&M7E<=J2?M|n zzguV@q3OS(GelECCqyTLUcg-e2nLZurez7B;aCD_fC)<;nGU^ZXsF+;Lic6{$TTzX ztY#+Qqo)H>Uz1r`&@Y;=45WXb{;<%ucv3|`r3Kdnn|tW z0~uv$-D^&O&)3}qC-23{)38^SWghA5SSp6H_T)2oyAFGR|I4}5M#E*>Y>;r6r*Xvr zP{_n&W${l^SFz>054Oy#+N!eZW>#o}gKzGoa(=Y^)$J|bac9vl9c9aU$*%Q`Np+-F zaK;vzzJ`v(s^~3#!70@fmz}^lzIK5tPL^mUg16)0H>>gyn*JQ!saL>I0!EoSq;}Xk z(-sB#9+~!HU|jZ^)3vF$q&vh*M0|j?r`Q>H8*2_=z*w0mw`oFM#`n}Jy4ugQg`-HM zYV(AbZ3?>j+@^*p__}0zbkYoc+T;WA0vrCq^y$Q5>UrZWu9c|0lq=w* z5G;iBX^PwcSi$XDDOjExR^^kA$RO4wSSh4)Q@4-)D`C5nt z#>IiGy{6cPKG$HlKCT3HcVEQ^Go-{YC`yylX=i#(r9lIgr^{RvKJPIKG}cbacfQN~BL5 z`vylJCZ817sci%qhxQ$NpS)}DlXlVGBH@ziQ?A^I5V+{qNCr)z{eBhS9k+KLJU-rR zGU{kH*JiXQN9-=~UM|O8-CfeP|Jyj9OM5-5SMD3!|Mupl8LJ-TwO(hD8n>*Q)b2Ch zQM;0_bgvj)UB{NEXqu5Hn6U-p`Y>zX@kHSCegL_%{J%5y`8rUX-HUsmEhphHDV3bauM$~t_-G4v=+8}->j{GRSrgeD)HdF&Y!@k1ckebJ-Q%>Q XxqN!BwGdtd=d!aZR=L^VmG=JtNr&=B literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/asynchronous.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/asynchronous.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..153684f1753ce7de28a7566a17612766d300556b GIT binary patch literal 9411 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 Sw76{4keI(JDS4CI!v6wJH0oyn literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/base.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/base.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4770872c0f73c451e602595e99fc8cb3da13ff51 GIT binary patch literal 30387 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/ldifProducer.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/ldifProducer.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6eee8b23b9cd3b5db32052d39168a2d55bb04689 GIT binary patch literal 5368 zcmai2TW{RP6+Yy0ZxnZRvwTS$he^{Ui^g)3IBkl$K@`bqg(fQ_QqzP8Kv3jJrp(J` z$aNyY28t>`fdc&*eJD_%KOm3oU+4>gJ`{cOU&vFxGs9i2WT{R!Lqz0ZG$=ADF(@_3Gs)n2gOUcN7I~JQTa+}(Yf^;& z79}l8+vK&ehIyNk4y9f4x_aKB#HMtPyg5o8@*GNgd2XlF2A8TKDJ@y6PNk2kh9?@O6Wa4e0a7zI-J`?>UsQi>oQSk)Y} zeIkk?I1p90Cbl*z`+>~MJj|2rQROg?|H<0t{?>4JU{;IyNXVd!^UN=EKZ)Y~YCeb} zMfnd!5D9+X^4>U3B0tQtQsznFCvj0eGxXt{kAgzr^g$^OjzU&v@|k+tlnq?a<3dDknY$reQwq0yC|vd*^T1aw+@|iWMbTUChDbyy z-f}<5@r+Wv5yT7`Rk;Q5=?Rh4gt*#VF4T;XWs8RvX?K zloKuL$HU@NecX884IT$^66_^nYP=}V-YDHnfHQzaf&}K2j|F@IPib|S)ZUr#s1guz zF!G154Sd(}EhL7L=+K}iL{AJl(P;=1U*Vhy1$8EXaK-00sci8EA9ywu0Wf1f?sTcN z=|t0ju3mMh?9pML?;GIT88n8wn}d0|fTvd--;cAn^!>^zjHx_d-F*Yj5tr!(D)0;kA)Z{Gv#_xp5YMQ?o0} z>fsi1JN}F;)~o1XAj84mih2CX#papW6LLo94`0t%h^?Y5BwtZh0d2x60JgFUuG)ke z<#zC>@*7(^qYU)_EGme19g8d9_JS@tZo5F)7;|{Zc3kHQ7Qn-BC+KC&p~_ zc9k)zF4t0#q4q1qtL9!l&LVk(Ex}-~?6^=dlcDmkQ!2X<<)r9eW+ud#ELE8n*{`vw za4={naICy}si|f+o-q|?y>*uK9)>9%P9U_lo2l%h@*7m=T&HmWdWwTh#(>hQseGdG z@Fpb60T2Jf^$t|dN3}{jd=QQ9p2GKK=$_egMjJ-B(#8T2F-VP}0^23P>q-%d_%Xcn z1wUGq0^|7Bg>aj)4nvmCpEkZst4IDFgf1DdTxl|Bo?28kIJ-Xuj4XO$F;nN1#T&BUTDxg;Oz-E8T1ruNJbVt>XO`NnmL-_=+I%e-p8yB+V4 z({XLp1$VknvL(H4-5YFec=l-8s}8FU_Y&N24*K#1Fjj3YIx+6eVI~;>vde>w!COLH ztmi4(2V~!mj)p-hWS>{LN_zcBgn1-T8CBn;gRfoBICqXqV4tNQ$ZOazXsZn5IrZ86 z@(7*sJ1mb2QDsl=$C2l#s#o9e7A7l`)1S{`D3w|CC4>~L6j@7%$OYqu0KW0KsD4wv3p-SeQ9hEK_O#Phn7XbO&@QVa zq!aF95QgJ)oS;viG)PyN%{t8EO!h$5o8e!p(m=JD!<-o8}a6apMV)9lPxM{53t(srUxD=9ef@B;IwArf8z6=hy zFRfbowf>yx06=yUi=Zr2Xgp~UqUX%&qPXCZ62xqE!AexFarcoRo7vF-VdbI`0h z6S}fL3zD%=KiyRQwGzMc?2Su3SJ9QAg4zYdYnG8)Ju zHrzC4whYHSzSvYV?cyT8EM_Q-cv-Z4KSk^#LHQ_u{#WB5saM**ALXI%tG6!sIvyq8 z;NdMER(ZI?12=+_-!tR~JbcIlgGg@jz-OH~zsee%FytZzmRa1y;B;E1(_3mgZKvb3 zoW}gJ({~#9Yda0aIk*NdARC);uDf3|FVqXHY6!gfFqdLgd=rWh{}NFsgL?M3jFVy& z_4ly~1aD!|RjkVW@a}tWzkRNEQ2oSNu6N$Q`!iiWxCG3su~Z>T)ml^*zcH%@L!I^_ fg{#gzZRZa-Nf#WGt?LUY@{Y;ltHxD~3yuE*DnRJC literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockAsync.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockAsync.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a9a05ec04b17d874cdfd6c66cedba127e0de73 GIT binary patch literal 5082 zcma)AOK%*<5w70%o6CpzkYsrzSwYsesK9X&$5IqiBpt|*Nr9xJU?5{M+!<0!&12Ow zYm>zC66tCnhXg@>Kw!kbzzA~5Ip-M3Tyt`cIT{F%uexV;S0o)|$t_k@SM{U1>+5PR zG@G@*{lRr-zf1H_n)npKzlU$MDu^5+6I76sBTtZ@BQr;Sp3FS?1u_dHoIE)N@`~h_ z$Si5ONM4!z3Yiti@GX&7CBH^yjr=;9b*(Lv*C4-1W>d=*@>=9ikvTwy2UfOa2_0bL3wj^Mcma$eSmBfy@Oh*U4KXe~HW`EjP%!Nd6@KNcI@sSLDyV~j)Lw;kxQ;et}VMyEa^rAFSeX8aGCFiLF8I- zXgR%ZoV@n3ksHMF=!_M5Us&6;Ha2&xt(E)R>(=@&R@Wc$WVbtoB=3d$Ngc#;1AEtV zous(FwY9mGR32_^?rg4ZKIr6<#RqFE54Y0McY3}X4&rqwLz&ES%VyujLV95U6HFEZ zUfAsg&bc#jT+fZqE(JbwwsWq_VmI{rwmjG8q8~cFy(7yB&K)dmJsmd;w&WhhZs53Q zN9_wbD#fVjvcqylJ;^9c!rltS|0&>)SFLQYZfMNSu|tavaLa;oIi$f?r{ zBwv{|+nq)-&Bx%SZ9o33X5h2)q!$@cdNz!%ba6-w+wfs-aJY@gm7losP2a+`WNk#Gw(pQLMXQS8QVH&NyV~yK`*u}S%!$i zRES(}&z$lcyKi;FAaJ{UbpA;4GTOhneJl3+xB9*Q&0Y}2w&&g4b=<+x+lO!6Vvp~q zGz-ryj*1H6a{owPL=V^{ig@2hw8inoGeKU?<}+H}G;DcpYIzG-ELQcnKqomm$l8O=FHc$-H+dnc9W3sQ73ftdS`<%lm*^sHGmis}K`;+Y zO+5R89;H*7rsyld@oCZFN2*UXvHPbdhEtD@4`z7erzMiBg2h=*4h-`ck)EQHHvbM= zbTCIlHN1GXDjprKvTp6;+p5pe%>FFWnIWE|nPrP=&`+4<<$!(mJMm~(Qr*^hIPvV~ z^eDc-JH%l_PGVa?InszZmRjOy@e=20n1eQlLtWo6n;LPq+-C#i(pZev0MJPxKI*$> zE3=8#8IY5j9mle_J3#iCEopyhjpgIJBOX~DbB?-xKRz2S~v_MNa=4W6v4J*hZ5Bs{9Qu>;h7suDm!s+Q@N3hE1&%3jVZ}iju0jsz$Uc%H( z23k(N30OUyrNIY+LAanmc%Lt2I9NFf-ctIa(tkq1btRUR_&LQorIF$IRdAj5i-gzN zAN*T^dqp|?onj5o0OnH;K-|>fFUp~&9I7HlPnbEd?vz7)OvE~9z=@N%)qyy1zi)%D>!Cma}Z2gwCr6wK*c#vN&;Tx1Ob0JCgm z5)W09*FciCw0n5SxQAU=O+S)#ZhINmC0Ay$1JbD|sFts@;teKmGP%iQnaM3C9JJH0 zxHN%JxJSM5GvYU}j@}2+_*eqsEh^k=fXk00tvio0mR^J1ytvKS_{N7=t13me)7pLc zTgTpbzpF}A49=D32qyml0o5mGlCF|&raWUIYHeL8sge}+Xn@jBJw>4B)Pa{OD&?1q zZknR7Sptf2-S;KMs9{lCB6CkDt}u^^2d3InWv(t<@q~dNm!IGY;9vs|)f6gA=1^a9 zK?trg%G^B3zjEOOEwBmY)3z4&P&)yjw>#C1y-8J;**t>WBtHQ>icet zt5;Qe`lzV`_7?Yac|_FZ+t8*uum6O$i1UcVl(>>> zf6GF#!YMYup|z5RWj!0%UfNQ&@GpTb9##D0k#943m&siw0?tp@67fHqn6V;kjpGp44RE@DBWcZ zT{^+d>LBiU(K7zupei?=@GbV>YR&|_!easz)CMvPn62?Zj9?nkCPq*3OCefwY|9{~ zFl~CQ%aBZg+ss(6k!vl`5I50x3TX=DChSMJ##pB!d0yy~${oFlcTodTWPp?wFXM6A P25Pi{AWX+Ukly((*;@Qf literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockBase.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockBase.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71448f86fe98612a7270824f32de5edd9886e914 GIT binary patch literal 23403 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 TT#yg>#rqkYUy7#_BM1L4X}0o< literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockSync.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/mockSync.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..123788509ac0a52bf5a07e330e0f8789049807dd GIT binary patch literal 4643 zcmai1OK%*<5w70%dzTbnE6K`8vJ%jUsQ3jWmTXuSnLvR|3M35~0~v$i&WKuS9;=>S znh7xUs;>U3XSv;O z{O~v5|MoJ`ziH-E2LCahkF3hER#$ZnXiRSKFEw#aT7xkf>o!VcLTBiAYDQrIKAXXFM2a}>^# zJ#XYD1s5n>AbY{cEeaMXTq1kP$ZZOiDO@3Yg~C4Bebd^Z;39>W$i8IcE(Mnh{pSX#?qok|+ z{iD@l+PVASfpd3vcl-V)pY3k!q!(G;&9~3b9F9;u{V5j?<_>sF8_+DDx*xugSPHPXhw|2MgZ9N!Z11BHe?T_&! zAAtBcEjS9G1wJ!2jtQ6|rwfh=jtou-^JVfXQZ2#KCJ?(>nG zjqqB&nu&8=3~k}j&iw_h!l%b2IxWy?kxs#sX&;U7n8*nWOR;7AkaFrNh69lM1bW@vS(mkt)+kEi-pep@ZrSKWVQs#GKYSmrg*7bjQqp z&>;Cz9DdD{Ah-JKUmVhDgH)4FfJ%Z+!Qcm#GWDNTNq*0=YLRM_>d=!SnMT#sPMC2R zac9~9tGb~_YK~39gqmj_`HM-g4lGSP|DGOYOS(YGOMwWTw&?IPJ-1%i{j&>0^26}K z0?+)cLUKc}xX5P#(>zA3+jQFD-${!OmguC-?c(`{cyxG=+t$Cht!++L_D_+mtUj}{ z%y}&JLuT0>u+P5}`Fe#mjtH~y&*_m`rjsg5*eMSVf^xj`eQ~hIdhZWb^d2Lq*l7%E zQeX9TJijTZ$(lYZWNT`%C8Nm!Qx{ny)AQPzYg6BYx3JX#*VSAXTu*aF>c61!pY$<9 z>fyZYtj=xPZG(>6{_`;ov)#$XWP@=sEvciCpEg{jOWCf;V zl}U|_mUtuN63Z)07D4QWJ4Q9v0ZPk3{FN`$I;yi8YR4+>2sO@=J=X6@cZlNe9}ax& zb|Q;xW&vciD=+bo>c~9`V%JL>Su~uXm$q_VXHZp|1WRiOi;{7Wr1d-~iH=8F)|FZQ z3Ks3oWJh&4XJz)??s9*^HxiQ`c0HEEeI1HaI2!p4d4t#28^wu2q;Z)s;eHpb$wLql z^P(lXcveJP+!T#MOUyyK0m}b%(E+U#n4ia(IgElVilQN!qFY#o)WCBM&yu)ZIKKK? zfjB$&q)_ngObW&OKUXLK`6z(El4)hw;(EzYfU}$zhYW9k?*?z8KMGbT=~A-KCZOOH zD0)Y?mv#G>6kXS1MT>tYWx#2s=wx;=eP;JRdLcEf@KRSFECf(~W+8ykOyOTzp`jJ( zLKzT4Wjdo^zzj$keWMjxTHynsUo?GB6 zhUHGkU!qNWA=jAW%cX(SSMk}PYfYo8{0$F!o5?#&7`xT5Gy>bM=P& z5IuHl5KDgzr3S^^lrFQm{NAkJAX0j*V)7f1e%Y`)ll#CLXN}3C-n22x8J$J#X)`B| z&ZD_$Tb?~Sq2{OUCR^4clU6gfvoz9)HPf737`Qg;TZ27gYm#R=_i!rV`b^=zz&c#G z?fO^^gJccwsQNx&t_RE9t?vjN*Yg6N*6x^H`-orR5(bybN)Inam+{Pgmmn>PYsLQo Du@{oC literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/restartable.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/restartable.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9dae10285b35890af1daddbee091f9ee41af74d GIT binary patch literal 7687 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/reusable.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/reusable.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b04baa6918cb5c43feb0500c7e50b9b69731a333 GIT binary patch literal 17176 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 AnE(I) literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/safeRestartable.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/safeRestartable.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05ed573e4dee3f7920172b0d5f7f810209559604 GIT binary patch literal 603 zcmZ{hzfQw25XR3*`bVV|NDO5F#G0WE0wflMiWt~BP^K(a8oLmbronb4in^6oVc>yS zvNG`sOngoYbO1~D#g22oyYJF&wHj|PQl5H5@3gjXrXE5cLIhC=Wh5L*8I2tZ9b#9) zCE?LCZak6>EnEumra}Y1TCm0kL#EG)?Q5w`q)aqS<-n-O$lFS5h^keO?4+oCkT5cajV~)3h@b zaymPCJPK^a@k;f|d0?Sy2Du literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/safeSync.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/safeSync.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e620c884ed43b7355265d56bde23b06ad500bee9 GIT binary patch literal 568 zcmZ9IyH3ME5JhL#&O;#)DUbjO=v^d6K!p&BL_wFvRBl$ry8$D=@H!Gk>B6s2@If?g zsrUsd?m7VlR+_ty(VV%nyMsaR{Z*+Qo9Kf!7Vb1b=wpZ^@}Z0*r+qbrA5-F z7i4TwoR${(cxjR6v}@M;WTU2u;E$Y z+4ay1X6g^gRGVdX3vq?ehmex!fzg6!!DtDe@QsTAmVn~Z8^$6NlHfR`JZ=j%ARGFiTSvmQj|zQPDx!*ST9JxtmA%C`xr1#PR4>s(E$xbmE$d z)3xgL$gY7J=i|I8S^yj&v<)FPWY7Em2OIymnqq8NOoK!TQTK#MGC7aUxi7@yJcw7B zhS@mVkS^$j>0v%Zn=k6K=5C-JA!HVUV{6!I{-Vik)SE#I1F5?gtG1U0(%5eA4Xtnc Cfqg{) literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/sync.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/__pycache__/sync.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0db5257b5daca0b233cb978e61417134197e754 GIT binary patch literal 7501 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 D8q^Tj literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asyncStream.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asyncStream.py new file mode 100644 index 0000000..631331c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asyncStream.py @@ -0,0 +1,119 @@ +""" +""" + +# Created on 2016.07.10 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from queue import Queue +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Queue + +from io import StringIO +from os import linesep + +from ..protocol.rfc2849 import decode_persistent_search_control +from ..strategy.asynchronous import AsyncStrategy +from ..core.exceptions import LDAPLDIFError +from ..utils.conv import prepare_for_stream +from ..protocol.rfc2849 import persistent_search_response_to_ldif, add_ldif_header + + +# noinspection PyProtectedMember +class AsyncStreamStrategy(AsyncStrategy): + """ + This strategy is asynchronous. It streams responses in a generator as they appear in the self._responses container + """ + def __init__(self, ldap_connection): + AsyncStrategy.__init__(self, ldap_connection) + self.can_stream = True + self.line_separator = linesep + self.all_base64 = False + self.stream = None + self.order = dict() + self._header_added = False + self.persistent_search_message_id = None + self.streaming = False + self.callback = None + if ldap_connection.pool_size: + self.events = Queue(ldap_connection.pool_size) + else: + self.events = Queue() + + del self._requests # remove _requests dict from Async Strategy + + def _start_listen(self): + AsyncStrategy._start_listen(self) + if self.streaming: + if not self.stream or (isinstance(self.stream, StringIO) and self.stream.closed): + self.set_stream(StringIO()) + + def _stop_listen(self): + AsyncStrategy._stop_listen(self) + if self.streaming: + self.stream.close() + + def accumulate_stream(self, message_id, change): + if message_id == self.persistent_search_message_id: + with self.async_lock: + self._responses[message_id] = [] + if self.streaming: + if not self._header_added and self.stream.tell() == 0: + header = add_ldif_header(['-'])[0] + self.stream.write(prepare_for_stream(header + self.line_separator + self.line_separator)) + ldif_lines = persistent_search_response_to_ldif(change) + if self.stream and ldif_lines and not self.connection.closed: + fragment = self.line_separator.join(ldif_lines) + if not self._header_added and self.stream.tell() == 0: + self._header_added = True + header = add_ldif_header(['-'])[0] + self.stream.write(prepare_for_stream(header + self.line_separator + self.line_separator)) + self.stream.write(prepare_for_stream(fragment + self.line_separator + self.line_separator)) + else: # strategy is not streaming, events are added to a queue + notification = decode_persistent_search_control(change) + if notification: + change.update(notification) + del change['controls']['2.16.840.1.113730.3.4.7'] + if not self.callback: + self.events.put(change) + else: + self.callback(change) + + def get_stream(self): + if self.streaming: + return self.stream + return None + + def set_stream(self, value): + error = False + try: + if not value.writable(): + error = True + except (ValueError, AttributeError): + error = True + + if error: + raise LDAPLDIFError('stream must be writable') + + self.stream = value + self.streaming = True diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asynchronous.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asynchronous.py new file mode 100644 index 0000000..613db2a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/asynchronous.py @@ -0,0 +1,292 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from threading import Thread, Lock, Event +import socket + +from .. import get_config_parameter, DIGEST_MD5 +from ..core.exceptions import LDAPSSLConfigurationError, LDAPStartTLSError, LDAPOperationResult, LDAPSignatureVerificationFailedError +from ..strategy.base import BaseStrategy, RESPONSE_COMPLETE +from ..protocol.rfc4511 import LDAPMessage +from ..utils.log import log, log_enabled, format_ldap_message, ERROR, NETWORK, EXTENDED +from ..utils.asn1 import decoder, decode_message_fast +from ..protocol.sasl.digestMd5 import md5_hmac + + +# noinspection PyProtectedMember +class AsyncStrategy(BaseStrategy): + """ + This strategy is asynchronous. You send the request and get the messageId of the request sent + Receiving data from socket is managed in a separated thread in a blocking mode + Requests return an int value to indicate the messageId of the requested Operation + You get the response with get_response, it has a timeout to wait for response to appear + Connection.response will contain the whole LDAP response for the messageId requested in a dict form + Connection.request will contain the result LDAP message in a dict form + Response appear in strategy._responses dictionary + """ + + # noinspection PyProtectedMember + class ReceiverSocketThread(Thread): + """ + The thread that actually manage the receiver socket + """ + + def __init__(self, ldap_connection): + Thread.__init__(self) + self.connection = ldap_connection + self.socket_size = get_config_parameter('SOCKET_SIZE') + + def run(self): + """ + Waits for data on socket, computes the length of the message and waits for enough bytes to decode the message + Message are appended to strategy._responses + """ + unprocessed = b'' + get_more_data = True + listen = True + data = b'' + sasl_total_bytes_recieved = 0 + sasl_received_data = b'' # used to verify the signature, typo GC + sasl_next_packet = b'' + sasl_buffer_length = -1 + # sasl_signature = b'' # not needed here GC + # sasl_sec_num = b'' # used to verify the signature, not needed here GC + + while listen: + if get_more_data: + try: + data = self.connection.socket.recv(self.socket_size) + except (OSError, socket.error, AttributeError): + if self.connection.receive_timeout: # a receive timeout has been detected - keep kistening on the socket + continue + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', str(e), self.connection) + raise # unexpected exception - re-raise + if len(data) > 0: + # If we are using DIGEST-MD5 and LDAP signing is set : verify & remove the signature from the message + if self.connection.sasl_mechanism == DIGEST_MD5 and self.connection._digest_md5_kis and not self.connection.sasl_in_progress: + data = sasl_next_packet + data + + if sasl_received_data == b'' or sasl_next_packet: + # Remove the sizeOf(encoded_message + signature + 0x0001 + secNum) from data. + sasl_buffer_length = int.from_bytes(data[0:4], "big") + data = data[4:] + sasl_next_packet = b'' + sasl_total_bytes_recieved += len(data) + sasl_received_data += data + + if sasl_total_bytes_recieved >= sasl_buffer_length: + # When the LDAP response is splitted accross multiple TCP packets, the SASL buffer length is equal to the MTU of each packet..Which is usually not equal to self.socket_size + # This means that the end of one SASL packet/beginning of one other....could be located in the middle of data + # We are using "sasl_received_data" instead of "data" & "unprocessed" for this reason + + # structure of messages when LDAP signing is enabled : sizeOf(encoded_message + signature + 0x0001 + secNum) + encoded_message + signature + 0x0001 + secNum + sasl_signature = sasl_received_data[sasl_buffer_length - 16:sasl_buffer_length - 6] + sasl_sec_num = sasl_received_data[sasl_buffer_length - 4:sasl_buffer_length] + sasl_next_packet = sasl_received_data[sasl_buffer_length:] # the last "data" variable may contain another sasl packet. We'll process it at the next iteration. + sasl_received_data = sasl_received_data[:sasl_buffer_length - 16] # remove signature + 0x0001 + secNum + the next packet if any, from sasl_received_data + + kis = self.connection._digest_md5_kis # renamed to lowercase GC + calculated_signature = bytes.fromhex(md5_hmac(kis, sasl_sec_num + sasl_received_data)[0:20]) + if sasl_signature != calculated_signature: + raise LDAPSignatureVerificationFailedError("Signature verification failed for the recieved LDAP message number " + str(int.from_bytes(sasl_sec_num, 'big')) + ". Expected signature " + calculated_signature.hex() + " but got " + sasl_signature.hex() + ".") + sasl_total_bytes_recieved = 0 + unprocessed += sasl_received_data + sasl_received_data = b'' + else: + unprocessed += data + data = b'' + else: + listen = False + length = BaseStrategy.compute_ldap_message_size(unprocessed) + if length == -1 or len(unprocessed) < length: + get_more_data = True + elif len(unprocessed) >= length: # add message to message list + if self.connection.usage: + self.connection._usage.update_received_message(length) + if log_enabled(NETWORK): + log(NETWORK, 'received %d bytes via <%s>', length, self.connection) + if self.connection.fast_decoder: + ldap_resp = decode_message_fast(unprocessed[:length]) + dict_response = self.connection.strategy.decode_response_fast(ldap_resp) + else: + ldap_resp = decoder.decode(unprocessed[:length], asn1Spec=LDAPMessage())[0] + dict_response = self.connection.strategy.decode_response(ldap_resp) + message_id = int(ldap_resp['messageID']) + if log_enabled(NETWORK): + log(NETWORK, 'received 1 ldap message via <%s>', self.connection) + if log_enabled(EXTENDED): + log(EXTENDED, 'ldap message received via <%s>:%s', self.connection, format_ldap_message(ldap_resp, '<<')) + if dict_response['type'] == 'extendedResp' and (dict_response['responseName'] == '1.3.6.1.4.1.1466.20037' or hasattr(self.connection, '_awaiting_for_async_start_tls')): + if dict_response['result'] == 0: # StartTls in progress + if self.connection.server.tls: + self.connection.server.tls._start_tls(self.connection) + else: + self.connection.last_error = 'no Tls object defined in Server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSSLConfigurationError(self.connection.last_error) + else: + self.connection.last_error = 'asynchronous StartTls failed' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPStartTLSError(self.connection.last_error) + del self.connection._awaiting_for_async_start_tls + if message_id != 0: # 0 is reserved for 'Unsolicited Notification' from server as per RFC4511 (paragraph 4.4) + with self.connection.strategy.async_lock: + if message_id in self.connection.strategy._responses: + self.connection.strategy._responses[message_id].append(dict_response) + else: + self.connection.strategy._responses[message_id] = [dict_response] + if dict_response['type'] not in ['searchResEntry', 'searchResRef', 'intermediateResponse']: + self.connection.strategy._responses[message_id].append(RESPONSE_COMPLETE) + self.connection.strategy.set_event_for_message(message_id) + + if self.connection.strategy.can_stream: # for AsyncStreamStrategy, used for PersistentSearch + self.connection.strategy.accumulate_stream(message_id, dict_response) + unprocessed = unprocessed[length:] + get_more_data = False if unprocessed else True + listen = True if self.connection.listening or unprocessed else False + else: # Unsolicited Notification + if dict_response['responseName'] == '1.3.6.1.4.1.1466.20036': # Notice of Disconnection as per RFC4511 (paragraph 4.4.1) + listen = False + else: + self.connection.last_error = 'unknown unsolicited notification from server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPStartTLSError(self.connection.last_error) + self.connection.strategy.close() + + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = False + self.no_real_dsa = False + self.pooled = False + self._responses = None + self._requests = None + self.can_stream = False + self.receiver = None + self.async_lock = Lock() + self.event_lock = Lock() + self._events = {} + + def open(self, reset_usage=True, read_server_info=True): + """ + Open connection and start listen on the socket in a different thread + """ + with self.connection.connection_lock: + self._responses = dict() + self._requests = dict() + BaseStrategy.open(self, reset_usage, read_server_info) + + if read_server_info: + try: + self.connection.refresh_server_info() + except LDAPOperationResult: # catch errors from server if raise_exception = True + self.connection.server._dsa_info = None + self.connection.server._schema_info = None + + def close(self): + """ + Close connection and stop socket thread + """ + with self.connection.connection_lock: + BaseStrategy.close(self) + + def _add_event_for_message(self, message_id): + with self.event_lock: + # Should have the check here because the receiver thread may has created it + if message_id not in self._events: + self._events[message_id] = Event() + + def set_event_for_message(self, message_id): + with self.event_lock: + # The receiver thread may receive the response before the sender set the event for the message_id, + # so we have to check if the event exists + if message_id not in self._events: + self._events[message_id] = Event() + self._events[message_id].set() + + def _get_event_for_message(self, message_id): + with self.event_lock: + if message_id not in self._events: + raise RuntimeError('Event for message[{}] should have been created before accessing'.format(message_id)) + return self._events[message_id] + + def post_send_search(self, message_id): + """ + Clears connection.response and returns messageId + """ + self.connection.response = None + self.connection.request = None + self.connection.result = None + self._add_event_for_message(message_id) + return message_id + + def post_send_single_response(self, message_id): + """ + Clears connection.response and returns messageId. + """ + self.connection.response = None + self.connection.request = None + self.connection.result = None + self._add_event_for_message(message_id) + return message_id + + def _start_listen(self): + """ + Start thread in daemon mode + """ + if not self.connection.listening: + self.receiver = AsyncStrategy.ReceiverSocketThread(self.connection) + self.connection.listening = True + self.receiver.daemon = True + self.receiver.start() + + def _get_response(self, message_id, timeout): + """ + Performs the capture of LDAP response for this strategy + The response is only complete after the event been set + """ + event = self._get_event_for_message(message_id) + flag = event.wait(timeout) + if not flag: + # timeout + return None + + # In this stage we could ensure the response is already there + self._events.pop(message_id) + with self.async_lock: + return self._responses.pop(message_id) + + def receiving(self): + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/base.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/base.py new file mode 100644 index 0000000..6b6211e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/base.py @@ -0,0 +1,925 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more dectails. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket +try: # try to discover if unix sockets are available for LDAP over IPC (ldapi:// scheme) + # noinspection PyUnresolvedReferences + from socket import AF_UNIX + unix_socket_available = True +except ImportError: + unix_socket_available = False +from struct import pack +from platform import system +from random import choice + +from .. import SYNC, ANONYMOUS, get_config_parameter, BASE, ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES, DIGEST_MD5 +from ..core.results import DO_NOT_RAISE_EXCEPTIONS, RESULT_REFERRAL +from ..core.exceptions import LDAPOperationResult, LDAPSASLBindInProgressError, LDAPSocketOpenError, LDAPSessionTerminatedByServerError,\ + LDAPUnknownResponseError, LDAPUnknownRequestError, LDAPReferralError, communication_exception_factory, LDAPStartTLSError, \ + LDAPSocketSendError, LDAPExceptionError, LDAPControlError, LDAPResponseTimeoutError, LDAPTransactionError +from ..utils.uri import parse_uri +from ..protocol.rfc4511 import LDAPMessage, ProtocolOp, MessageID, SearchResultEntry +from ..operation.add import add_response_to_dict, add_request_to_dict +from ..operation.modify import modify_request_to_dict, modify_response_to_dict +from ..operation.search import search_result_reference_response_to_dict, search_result_done_response_to_dict,\ + search_result_entry_response_to_dict, search_request_to_dict, search_result_entry_response_to_dict_fast,\ + search_result_reference_response_to_dict_fast, attributes_to_dict, attributes_to_dict_fast +from ..operation.bind import bind_response_to_dict, bind_request_to_dict, sicily_bind_response_to_dict, bind_response_to_dict_fast, \ + sicily_bind_response_to_dict_fast +from ..operation.compare import compare_response_to_dict, compare_request_to_dict +from ..operation.extended import extended_request_to_dict, extended_response_to_dict, intermediate_response_to_dict, extended_response_to_dict_fast, intermediate_response_to_dict_fast +from ..core.server import Server +from ..operation.modifyDn import modify_dn_request_to_dict, modify_dn_response_to_dict +from ..operation.delete import delete_response_to_dict, delete_request_to_dict +from ..protocol.convert import prepare_changes_for_request, build_controls_list +from ..operation.abandon import abandon_request_to_dict +from ..core.tls import Tls +from ..protocol.oid import Oids +from ..protocol.rfc2696 import RealSearchControlValue +from ..protocol.microsoft import DirSyncControlResponseValue +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, NETWORK, EXTENDED, format_ldap_message +from ..utils.asn1 import encode, decoder, ldap_result_to_dict_fast, decode_sequence +from ..utils.conv import to_unicode +from ..protocol.sasl.digestMd5 import md5_h, md5_hmac + +SESSION_TERMINATED_BY_SERVER = 'TERMINATED_BY_SERVER' +TRANSACTION_ERROR = 'TRANSACTION_ERROR' +RESPONSE_COMPLETE = 'RESPONSE_FROM_SERVER_COMPLETE' + + +# noinspection PyProtectedMember +class BaseStrategy(object): + """ + Base class for connection strategy + """ + + def __init__(self, ldap_connection): + self.connection = ldap_connection + self._outstanding = None + self._referrals = [] + self.sync = None # indicates a synchronous connection + self.no_real_dsa = None # indicates a connection to a fake LDAP server + self.pooled = None # Indicates a connection with a connection pool + self.can_stream = None # indicates if a strategy keeps a stream of responses (i.e. LdifProducer can accumulate responses with a single header). Stream must be initialized and closed in _start_listen() and _stop_listen() + self.referral_cache = {} + self.thread_safe = False # Indicates that connection can be used in a multithread application + if log_enabled(BASIC): + log(BASIC, 'instantiated <%s>: <%s>', self.__class__.__name__, self) + + def __str__(self): + s = [ + str(self.connection) if self.connection else 'None', + 'sync' if self.sync else 'async', + 'no real DSA' if self.no_real_dsa else 'real DSA', + 'pooled' if self.pooled else 'not pooled', + 'can stream output' if self.can_stream else 'cannot stream output', + ] + return ' - '.join(s) + + def open(self, reset_usage=True, read_server_info=True): + """ + Open a socket to a server. Choose a server from the server pool if available + """ + if log_enabled(NETWORK): + log(NETWORK, 'opening connection for <%s>', self.connection) + if self.connection.lazy and not self.connection._executing_deferred: + self.connection._deferred_open = True + self.connection.closed = False + if log_enabled(NETWORK): + log(NETWORK, 'deferring open connection for <%s>', self.connection) + else: + if not self.connection.closed and not self.connection._executing_deferred: # try to close connection if still open + self.close() + + self._outstanding = dict() + if self.connection.usage: + if reset_usage or not self.connection._usage.initial_connection_start_time: + self.connection._usage.start() + + if self.connection.server_pool: + new_server = self.connection.server_pool.get_server(self.connection) # get a server from the server_pool if available + if self.connection.server != new_server: + self.connection.server = new_server + if self.connection.usage: + self.connection._usage.servers_from_pool += 1 + + exception_history = [] + if not self.no_real_dsa: # tries to connect to a real server + for candidate_address in self.connection.server.candidate_addresses(): + try: + if log_enabled(BASIC): + log(BASIC, 'try to open candidate address %s', candidate_address[:-2]) + self._open_socket(candidate_address, self.connection.server.ssl, unix_socket=self.connection.server.ipc) + self.connection.server.current_address = candidate_address + self.connection.server.update_availability(candidate_address, True) + break + except Exception as e: + self.connection.server.update_availability(candidate_address, False) + # exception_history.append((datetime.now(), exc_type, exc_value, candidate_address[4])) + exception_history.append((type(e)(str(e)), candidate_address[4])) + if not self.connection.server.current_address and exception_history: + if len(exception_history) == 1: # only one exception, reraise + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', str(exception_history[0][0]) + ' ' + str((exception_history[0][1])), self.connection) + raise exception_history[0][0] + else: + if log_enabled(ERROR): + log(ERROR, 'unable to open socket for <%s>', self.connection) + raise LDAPSocketOpenError('unable to open socket', exception_history) + elif not self.connection.server.current_address: + if log_enabled(ERROR): + log(ERROR, 'invalid server address for <%s>', self.connection) + raise LDAPSocketOpenError('invalid server address') + + self.connection._deferred_open = False + self._start_listen() + if log_enabled(NETWORK): + log(NETWORK, 'connection open for <%s>', self.connection) + + def close(self): + """ + Close connection + """ + if log_enabled(NETWORK): + log(NETWORK, 'closing connection for <%s>', self.connection) + if self.connection.lazy and not self.connection._executing_deferred and (self.connection._deferred_bind or self.connection._deferred_open): + self.connection.listening = False + self.connection.closed = True + if log_enabled(NETWORK): + log(NETWORK, 'deferred connection closed for <%s>', self.connection) + else: + if not self.connection.closed: + self._stop_listen() + if not self. no_real_dsa: + self._close_socket() + if log_enabled(NETWORK): + log(NETWORK, 'connection closed for <%s>', self.connection) + + self.connection.bound = False + self.connection.request = None + self.connection.response = None + self.connection.tls_started = False + self._outstanding = None + self._referrals = [] + + if not self.connection.strategy.no_real_dsa: + self.connection.server.current_address = None + if self.connection.usage: + self.connection._usage.stop() + + def _open_socket(self, address, use_ssl=False, unix_socket=False): + """ + Tries to open and connect a socket to a Server + raise LDAPExceptionError if unable to open or connect socket + """ + try: + self.connection.socket = socket.socket(*address[:3]) + except Exception as e: + self.connection.last_error = 'socket creation error: ' + str(e) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketOpenError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + # Try to bind the socket locally before connecting to the remote address + # We go through our connection's source ports and try to bind our socket to our connection's source address + # with them. + # If no source address or ports were specified, this will have the same success/fail result as if we + # tried to connect to the remote server without binding locally first. + # This is actually a little bit better, as it lets us distinguish the case of "issue binding the socket + # locally" from "remote server is unavailable" with more clarity, though this will only really be an + # issue when no source address/port is specified if the system checking server availability is running + # as a very unprivileged user. + last_bind_exc = None + if unix_socket_available and self.connection.socket.family != socket.AF_UNIX: + socket_bind_succeeded = False + for source_port in self.connection.source_port_list: + try: + self.connection.socket.bind((self.connection.source_address, source_port)) + socket_bind_succeeded = True + break + except Exception as bind_ex: + last_bind_exc = bind_ex + # we'll always end up logging at error level if we cannot bind any ports to the address locally. + # but if some work and some don't you probably don't want the ones that don't at ERROR level + if log_enabled(NETWORK): + log(NETWORK, 'Unable to bind to local address <%s> with source port <%s> due to <%s>', + self.connection.source_address, source_port, bind_ex) + if not socket_bind_succeeded: + self.connection.last_error = 'socket connection error while locally binding: ' + str(last_bind_exc) + if log_enabled(ERROR): + log(ERROR, 'Unable to locally bind to local address <%s> with any of the source ports <%s> for connection <%s due to <%s>', + self.connection.source_address, self.connection.source_port_list, self.connection, last_bind_exc) + raise communication_exception_factory(LDAPSocketOpenError, type(last_bind_exc)(str(last_bind_exc)))(last_bind_exc) + + try: # set socket timeout for opening connection + if self.connection.server.connect_timeout: + self.connection.socket.settimeout(self.connection.server.connect_timeout) + self.connection.socket.connect(address[4]) + except socket.error as e: + self.connection.last_error = 'socket connection error while opening: ' + str(e) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketOpenError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + + # Set connection recv timeout (must be set after connect, + # because socket.settimeout() affects both, connect() as + # well as recv(). Set it before tls.wrap_socket() because + # the recv timeout should take effect during the TLS + # handshake. + if self.connection.receive_timeout is not None: + try: # set receive timeout for the connection socket + self.connection.socket.settimeout(self.connection.receive_timeout) + if system().lower() == 'windows': + self.connection.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, int(1000 * self.connection.receive_timeout)) + else: + self.connection.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, pack('LL', self.connection.receive_timeout, 0)) + except socket.error as e: + self.connection.last_error = 'unable to set receive timeout for socket connection: ' + str(e) + + # if exc: + # if log_enabled(ERROR): + # log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketOpenError, exc)(self.connection.last_error) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + + if use_ssl: + try: + self.connection.server.tls.wrap_socket(self.connection, do_handshake=True) + if self.connection.usage: + self.connection._usage.wrapped_sockets += 1 + except Exception as e: + self.connection.last_error = 'socket ssl wrapping error: ' + str(e) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + if self.connection.usage: + self.connection._usage.open_sockets += 1 + + self.connection.closed = False + + def _close_socket(self): + """ + Try to close a socket + don't raise exception if unable to close socket, assume socket is already closed + """ + + try: + self.connection.socket.shutdown(socket.SHUT_RDWR) + except Exception: + pass + + try: + self.connection.socket.close() + except Exception: + pass + + self.connection.socket = None + self.connection.closed = True + + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + def _stop_listen(self): + self.connection.listening = False + + def send(self, message_type, request, controls=None): + """ + Send an LDAP message + Returns the message_id + """ + self.connection.request = None + if self.connection.listening: + if self.connection.sasl_in_progress and message_type not in ['bindRequest']: # as per RFC4511 (4.2.1) + self.connection.last_error = 'cannot send operation requests while SASL bind is in progress' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSASLBindInProgressError(self.connection.last_error) + message_id = self.connection.server.next_message_id() + ldap_message = LDAPMessage() + ldap_message['messageID'] = MessageID(message_id) + ldap_message['protocolOp'] = ProtocolOp().setComponentByName(message_type, request) + message_controls = build_controls_list(controls) + if message_controls is not None: + ldap_message['controls'] = message_controls + self.connection.request = BaseStrategy.decode_request(message_type, request, controls) + self._outstanding[message_id] = self.connection.request + self.sending(ldap_message) + else: + self.connection.last_error = 'unable to send message, socket is not open' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketOpenError(self.connection.last_error) + + return message_id + + def get_response(self, message_id, timeout=None, get_request=False): + """ + Get response LDAP messages + Responses are returned by the underlying connection strategy + Check if message_id LDAP message is still outstanding and wait for timeout to see if it appears in _get_response + Result is stored in connection.result + Responses without result is stored in connection.response + A tuple (responses, result) is returned + """ + if timeout is None: + timeout = get_config_parameter('RESPONSE_WAITING_TIMEOUT') + response = None + result = None + # request = None + if self._outstanding and message_id in self._outstanding: + responses = self._get_response(message_id, timeout) + + if not responses: + if log_enabled(ERROR): + log(ERROR, 'socket timeout, no response from server for <%s>', self.connection) + raise LDAPResponseTimeoutError('no response from server') + + if responses == SESSION_TERMINATED_BY_SERVER: + try: # try to close the session but don't raise any error if server has already closed the session + self.close() + except (socket.error, LDAPExceptionError): + pass + self.connection.last_error = 'session terminated by server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSessionTerminatedByServerError(self.connection.last_error) + elif responses == TRANSACTION_ERROR: # Novell LDAP Transaction unsolicited notification + self.connection.last_error = 'transaction error' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPTransactionError(self.connection.last_error) + + # if referral in response opens a new connection to resolve referrals if requested + + if responses[-2]['result'] == RESULT_REFERRAL: + if self.connection.usage: + self.connection._usage.referrals_received += 1 + if self.connection.auto_referrals: + ref_response, ref_result = self.do_operation_on_referral(self._outstanding[message_id], responses[-2]['referrals']) + if ref_response is not None: + responses = ref_response + [ref_result] + responses.append(RESPONSE_COMPLETE) + elif ref_result is not None: + responses = [ref_result, RESPONSE_COMPLETE] + + self._referrals = [] + + if responses: + result = responses[-2] + response = responses[:-2] + self.connection.result = None + self.connection.response = None + + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + self._outstanding.pop(message_id) + self.connection.result = result.copy() + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + # checks if any response has a range tag + # self._auto_range_searching is set as a flag to avoid recursive searches + if self.connection.auto_range and not hasattr(self, '_auto_range_searching') and any((True for resp in response if 'raw_attributes' in resp for name in resp['raw_attributes'] if ';range=' in name)): + self._auto_range_searching = result.copy() + temp_response = response[:] # copy + if self.do_search_on_auto_range(self._outstanding[message_id], response): + for resp in temp_response: + if resp['type'] == 'searchResEntry': + keys = [key for key in resp['raw_attributes'] if ';range=' in key] + for key in keys: + del resp['raw_attributes'][key] + del resp['attributes'][key] + response = temp_response + result = self._auto_range_searching + del self._auto_range_searching + + if self.connection.empty_attributes: + for entry in response: + if entry['type'] == 'searchResEntry': + for attribute_type in self._outstanding[message_id]['attributes']: + if attribute_type not in entry['raw_attributes'] and attribute_type not in (ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES): + entry['raw_attributes'][attribute_type] = list() + entry['attributes'][attribute_type] = list() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute set to empty list for missing attribute <%s> in <%s>', attribute_type, self) + if not self.connection.auto_range: + attrs_to_remove = [] + # removes original empty attribute in case a range tag is returned + for attribute_type in entry['attributes']: + if ';range' in attribute_type.lower(): + orig_attr, _, _ = attribute_type.partition(';') + attrs_to_remove.append(orig_attr) + for attribute_type in attrs_to_remove: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute type <%s> removed in response because of same attribute returned as range by the server in <%s>', attribute_type, self) + del entry['raw_attributes'][attribute_type] + del entry['attributes'][attribute_type] + + request = self._outstanding.pop(message_id) + else: + if log_enabled(ERROR): + log(ERROR, 'message id not in outstanding queue for <%s>', self.connection) + raise(LDAPResponseTimeoutError('message id not in outstanding queue')) + + if get_request: + return response, result, request + else: + return response, result + + @staticmethod + def compute_ldap_message_size(data): + """ + Compute LDAP Message size according to BER definite length rules + Returns -1 if too few data to compute message length + """ + if isinstance(data, str): # fix for Python 2, data is string not bytes + data = bytearray(data) # Python 2 bytearray is equivalent to Python 3 bytes + + ret_value = -1 + if len(data) > 2: + if data[1] <= 127: # BER definite length - short form. Highest bit of byte 1 is 0, message length is in the last 7 bits - Value can be up to 127 bytes long + ret_value = data[1] + 2 + else: # BER definite length - long form. Highest bit of byte 1 is 1, last 7 bits counts the number of following octets containing the value length + bytes_length = data[1] - 128 + if len(data) >= bytes_length + 2: + value_length = 0 + cont = bytes_length + for byte in data[2:2 + bytes_length]: + cont -= 1 + value_length += byte * (256 ** cont) + ret_value = value_length + 2 + bytes_length + + return ret_value + + def decode_response(self, ldap_message): + """ + Convert received LDAPMessage to a dict + """ + message_type = ldap_message.getComponentByName('protocolOp').getName() + component = ldap_message['protocolOp'].getComponent() + controls = ldap_message['controls'] if ldap_message['controls'].hasValue() else None + if message_type == 'bindResponse': + if not bytes(component['matchedDN']).startswith(b'NTLM'): # patch for microsoft ntlm authentication + result = bind_response_to_dict(component) + else: + result = sicily_bind_response_to_dict(component) + elif message_type == 'searchResEntry': + result = search_result_entry_response_to_dict(component, self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + elif message_type == 'searchResDone': + result = search_result_done_response_to_dict(component) + elif message_type == 'searchResRef': + result = search_result_reference_response_to_dict(component) + elif message_type == 'modifyResponse': + result = modify_response_to_dict(component) + elif message_type == 'addResponse': + result = add_response_to_dict(component) + elif message_type == 'delResponse': + result = delete_response_to_dict(component) + elif message_type == 'modDNResponse': + result = modify_dn_response_to_dict(component) + elif message_type == 'compareResponse': + result = compare_response_to_dict(component) + elif message_type == 'extendedResp': + result = extended_response_to_dict(component) + elif message_type == 'intermediateResponse': + result = intermediate_response_to_dict(component) + else: + if log_enabled(ERROR): + log(ERROR, 'unknown response <%s> for <%s>', message_type, self.connection) + raise LDAPUnknownResponseError('unknown response') + result['type'] = message_type + if controls: + result['controls'] = dict() + for control in controls: + decoded_control = self.decode_control(control) + result['controls'][decoded_control[0]] = decoded_control[1] + return result + + def decode_response_fast(self, ldap_message): + """ + Convert received LDAPMessage from fast ber decoder to a dict + """ + if ldap_message['protocolOp'] == 1: # bindResponse + if not ldap_message['payload'][1][3].startswith(b'NTLM'): # patch for microsoft ntlm authentication + result = bind_response_to_dict_fast(ldap_message['payload']) + else: + result = sicily_bind_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'bindResponse' + elif ldap_message['protocolOp'] == 4: # searchResEntry' + result = search_result_entry_response_to_dict_fast(ldap_message['payload'], self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + result['type'] = 'searchResEntry' + elif ldap_message['protocolOp'] == 5: # searchResDone + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'searchResDone' + elif ldap_message['protocolOp'] == 19: # searchResRef + result = search_result_reference_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'searchResRef' + elif ldap_message['protocolOp'] == 7: # modifyResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'modifyResponse' + elif ldap_message['protocolOp'] == 9: # addResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'addResponse' + elif ldap_message['protocolOp'] == 11: # delResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'delResponse' + elif ldap_message['protocolOp'] == 13: # modDNResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'modDNResponse' + elif ldap_message['protocolOp'] == 15: # compareResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'compareResponse' + elif ldap_message['protocolOp'] == 24: # extendedResp + result = extended_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'extendedResp' + elif ldap_message['protocolOp'] == 25: # intermediateResponse + result = intermediate_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'intermediateResponse' + else: + if log_enabled(ERROR): + log(ERROR, 'unknown response <%s> for <%s>', ldap_message['protocolOp'], self.connection) + raise LDAPUnknownResponseError('unknown response') + if ldap_message['controls']: + result['controls'] = dict() + for control in ldap_message['controls']: + decoded_control = self.decode_control_fast(control[3]) + result['controls'][decoded_control[0]] = decoded_control[1] + return result + + @staticmethod + def decode_control(control): + """ + decode control, return a 2-element tuple where the first element is the control oid + and the second element is a dictionary with description (from Oids), criticality and decoded control value + """ + control_type = str(control['controlType']) + criticality = bool(control['criticality']) + control_value = bytes(control['controlValue']) + unprocessed = None + if control_type == '1.2.840.113556.1.4.319': # simple paged search as per RFC2696 + control_resp, unprocessed = decoder.decode(control_value, asn1Spec=RealSearchControlValue()) + control_value = dict() + control_value['size'] = int(control_resp['size']) + control_value['cookie'] = bytes(control_resp['cookie']) + elif control_type == '1.2.840.113556.1.4.841': # DirSync AD + control_resp, unprocessed = decoder.decode(control_value, asn1Spec=DirSyncControlResponseValue()) + control_value = dict() + control_value['more_results'] = bool(control_resp['MoreResults']) # more_result if nonzero + control_value['cookie'] = bytes(control_resp['CookieServer']) + elif control_type == '1.3.6.1.1.13.1' or control_type == '1.3.6.1.1.13.2': # Pre-Read control, Post-Read Control as per RFC 4527 + control_resp, unprocessed = decoder.decode(control_value, asn1Spec=SearchResultEntry()) + control_value = dict() + control_value['result'] = attributes_to_dict(control_resp['attributes']) + if unprocessed: + if log_enabled(ERROR): + log(ERROR, 'unprocessed control response in substrate') + raise LDAPControlError('unprocessed control response in substrate') + return control_type, {'description': Oids.get(control_type, ''), 'criticality': criticality, 'value': control_value} + + @staticmethod + def decode_control_fast(control, from_server=True): + """ + decode control, return a 2-element tuple where the first element is the control oid + and the second element is a dictionary with description (from Oids), criticality and decoded control value + """ + control_type = str(to_unicode(control[0][3], from_server=from_server)) + criticality = False + control_value = None + for r in control[1:]: + if r[2] == 4: # controlValue + control_value = r[3] + else: + criticality = False if r[3] == 0 else True # criticality (booleand default to False) + if control_type == '1.2.840.113556.1.4.319': # simple paged search as per RFC2696 + control_resp = decode_sequence(control_value, 0, len(control_value)) + control_value = dict() + control_value['size'] = int(control_resp[0][3][0][3]) + control_value['cookie'] = bytes(control_resp[0][3][1][3]) + elif control_type == '1.2.840.113556.1.4.841': # DirSync AD + control_resp = decode_sequence(control_value, 0, len(control_value)) + control_value = dict() + control_value['more_results'] = True if control_resp[0][3][0][3] else False # more_result if nonzero + control_value['cookie'] = control_resp[0][3][2][3] + elif control_type == '1.3.6.1.1.13.1' or control_type == '1.3.6.1.1.13.2': # Pre-Read control, Post-Read Control as per RFC 4527 + control_resp = decode_sequence(control_value, 0, len(control_value)) + control_value = dict() + control_value['result'] = attributes_to_dict_fast(control_resp[0][3][1][3]) + return control_type, {'description': Oids.get(control_type, ''), 'criticality': criticality, 'value': control_value} + + @staticmethod + def decode_request(message_type, component, controls=None): + # message_type = ldap_message.getComponentByName('protocolOp').getName() + # component = ldap_message['protocolOp'].getComponent() + if message_type == 'bindRequest': + result = bind_request_to_dict(component) + elif message_type == 'unbindRequest': + result = dict() + elif message_type == 'addRequest': + result = add_request_to_dict(component) + elif message_type == 'compareRequest': + result = compare_request_to_dict(component) + elif message_type == 'delRequest': + result = delete_request_to_dict(component) + elif message_type == 'extendedReq': + result = extended_request_to_dict(component) + elif message_type == 'modifyRequest': + result = modify_request_to_dict(component) + elif message_type == 'modDNRequest': + result = modify_dn_request_to_dict(component) + elif message_type == 'searchRequest': + result = search_request_to_dict(component) + elif message_type == 'abandonRequest': + result = abandon_request_to_dict(component) + else: + if log_enabled(ERROR): + log(ERROR, 'unknown request <%s>', message_type) + raise LDAPUnknownRequestError('unknown request') + result['type'] = message_type + result['controls'] = controls + + return result + + def valid_referral_list(self, referrals): + referral_list = [] + for referral in referrals: + candidate_referral = parse_uri(referral) + if candidate_referral: + for ref_host in self.connection.server.allowed_referral_hosts: + if ref_host[0] == candidate_referral['host'] or ref_host[0] == '*': + if candidate_referral['host'] not in self._referrals: + candidate_referral['anonymousBindOnly'] = not ref_host[1] + referral_list.append(candidate_referral) + break + + return referral_list + + def do_next_range_search(self, request, response, attr_name): + done = False + current_response = response + while not done: + attr_type, _, returned_range = attr_name.partition(';range=') + _, _, high_range = returned_range.partition('-') + response['raw_attributes'][attr_type] += current_response['raw_attributes'][attr_name] + response['attributes'][attr_type] += current_response['attributes'][attr_name] + if high_range != '*': + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing next search on auto-range <%s> via <%s>', str(int(high_range) + 1), self.connection) + requested_range = attr_type + ';range=' + str(int(high_range) + 1) + '-*' + result = self.connection.search(search_base=response['dn'], + search_filter='(objectclass=*)', + search_scope=BASE, + dereference_aliases=request['dereferenceAlias'], + attributes=[attr_type + ';range=' + str(int(high_range) + 1) + '-*']) + if self.connection.strategy.thread_safe: + status, result, _response, _ = result + else: + status = result + result = self.connection.result + _response = self.connection.response + + if self.connection.strategy.sync: + if status: + current_response = _response[0] + else: + done = True + else: + current_response, _ = self.get_response(status) + current_response = current_response[0] + + if not done: + if requested_range in current_response['raw_attributes'] and len(current_response['raw_attributes'][requested_range]) == 0: + del current_response['raw_attributes'][requested_range] + del current_response['attributes'][requested_range] + attr_name = list(filter(lambda a: ';range=' in a, current_response['raw_attributes'].keys()))[0] + continue + done = True + + def do_search_on_auto_range(self, request, response): + for resp in [r for r in response if r['type'] == 'searchResEntry']: + for attr_name in list(resp['raw_attributes'].keys()): # generate list to avoid changing of dict size error + if ';range=' in attr_name: + attr_type, _, range_values = attr_name.partition(';range=') + if range_values in ('1-1', '0-0'): # DirSync returns these values for adding and removing members + return False + if attr_type not in resp['raw_attributes'] or resp['raw_attributes'][attr_type] is None: + resp['raw_attributes'][attr_type] = list() + if attr_type not in resp['attributes'] or resp['attributes'][attr_type] is None: + resp['attributes'][attr_type] = list() + self.do_next_range_search(request, resp, attr_name) + return True + + def create_referral_connection(self, referrals): + referral_connection = None + selected_referral = None + cachekey = None + valid_referral_list = self.valid_referral_list(referrals) + if valid_referral_list: + preferred_referral_list = [referral for referral in valid_referral_list if + referral['ssl'] == self.connection.server.ssl] + selected_referral = choice(preferred_referral_list) if preferred_referral_list else choice( + valid_referral_list) + + cachekey = (selected_referral['host'], selected_referral['port'] or self.connection.server.port, selected_referral['ssl']) + if self.connection.use_referral_cache and cachekey in self.referral_cache: + referral_connection = self.referral_cache[cachekey] + else: + referral_server = Server(host=selected_referral['host'], + port=selected_referral['port'] or self.connection.server.port, + use_ssl=selected_referral['ssl'], + get_info=self.connection.server.get_info, + formatter=self.connection.server.custom_formatter, + connect_timeout=self.connection.server.connect_timeout, + mode=self.connection.server.mode, + allowed_referral_hosts=self.connection.server.allowed_referral_hosts, + tls=Tls(local_private_key_file=self.connection.server.tls.private_key_file, + local_certificate_file=self.connection.server.tls.certificate_file, + validate=self.connection.server.tls.validate, + version=self.connection.server.tls.version, + ca_certs_file=self.connection.server.tls.ca_certs_file) if + selected_referral['ssl'] else None) + + from ..core.connection import Connection + + referral_connection = Connection(server=referral_server, + user=self.connection.user if not selected_referral['anonymousBindOnly'] else None, + password=self.connection.password if not selected_referral['anonymousBindOnly'] else None, + version=self.connection.version, + authentication=self.connection.authentication if not selected_referral['anonymousBindOnly'] else ANONYMOUS, + client_strategy=SYNC, + auto_referrals=True, + read_only=self.connection.read_only, + check_names=self.connection.check_names, + raise_exceptions=self.connection.raise_exceptions, + fast_decoder=self.connection.fast_decoder, + receive_timeout=self.connection.receive_timeout, + sasl_mechanism=self.connection.sasl_mechanism, + sasl_credentials=self.connection.sasl_credentials) + + if self.connection.usage: + self.connection._usage.referrals_connections += 1 + + referral_connection.open() + referral_connection.strategy._referrals = self._referrals + if self.connection.tls_started and not referral_server.ssl: # if the original server was in start_tls mode and the referral server is not in ssl then start_tls on the referral connection + if not referral_connection.start_tls(): + error = 'start_tls in referral not successful' + (' - ' + referral_connection.last_error if referral_connection.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPStartTLSError(error) + + if self.connection.bound: + referral_connection.bind() + + if self.connection.usage: + self.connection._usage.referrals_followed += 1 + + return selected_referral, referral_connection, cachekey + + def do_operation_on_referral(self, request, referrals): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'following referral for <%s>', self.connection) + selected_referral, referral_connection, cachekey = self.create_referral_connection(referrals) + if selected_referral: + if request['type'] == 'searchRequest': + referral_connection.search(selected_referral['base'] or request['base'], + selected_referral['filter'] or request['filter'], + selected_referral['scope'] or request['scope'], + request['dereferenceAlias'], + selected_referral['attributes'] or request['attributes'], + request['sizeLimit'], + request['timeLimit'], + request['typesOnly'], + controls=request['controls']) + elif request['type'] == 'addRequest': + referral_connection.add(selected_referral['base'] or request['entry'], + None, + request['attributes'], + controls=request['controls']) + elif request['type'] == 'compareRequest': + referral_connection.compare(selected_referral['base'] or request['entry'], + request['attribute'], + request['value'], + controls=request['controls']) + elif request['type'] == 'delRequest': + referral_connection.delete(selected_referral['base'] or request['entry'], + controls=request['controls']) + elif request['type'] == 'extendedReq': + referral_connection.extended(request['name'], + request['value'], + controls=request['controls'], + no_encode=True + ) + elif request['type'] == 'modifyRequest': + referral_connection.modify(selected_referral['base'] or request['entry'], + prepare_changes_for_request(request['changes']), + controls=request['controls']) + elif request['type'] == 'modDNRequest': + referral_connection.modify_dn(selected_referral['base'] or request['entry'], + request['newRdn'], + request['deleteOldRdn'], + request['newSuperior'], + controls=request['controls']) + else: + self.connection.last_error = 'referral operation not permitted' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPReferralError(self.connection.last_error) + + response = referral_connection.response + result = referral_connection.result + if self.connection.use_referral_cache: + self.referral_cache[cachekey] = referral_connection + else: + referral_connection.unbind() + else: + response = None + result = None + + return response, result + + def sending(self, ldap_message): + if log_enabled(NETWORK): + log(NETWORK, 'sending 1 ldap message for <%s>', self.connection) + try: + encoded_message = encode(ldap_message) + if self.connection.sasl_mechanism == DIGEST_MD5 and self.connection._digest_md5_kic and not self.connection.sasl_in_progress: + # If we are using DIGEST-MD5 and LDAP signing is enabled: add a signature to the message + sec_num = self.connection._digest_md5_sec_num # added underscore GC + kic = self.connection._digest_md5_kic # lowercase GC + + # RFC 2831 : encoded_message = sizeOf(encored_message + signature + 0x0001 + secNum) + encoded_message + signature + 0x0001 + secNum + signature = bytes.fromhex(md5_hmac(kic, int(sec_num).to_bytes(4, 'big') + encoded_message)[0:20]) + encoded_message = int(len(encoded_message) + 4 + 2 + 10).to_bytes(4, 'big') + encoded_message + signature + int(1).to_bytes(2, 'big') + int(sec_num).to_bytes(4, 'big') + self.connection._digest_md5_sec_num += 1 + + self.connection.socket.sendall(encoded_message) + if log_enabled(EXTENDED): + log(EXTENDED, 'ldap message sent via <%s>:%s', self.connection, format_ldap_message(ldap_message, '>>')) + if log_enabled(NETWORK): + log(NETWORK, 'sent %d bytes via <%s>', len(encoded_message), self.connection) + except socket.error as e: + self.connection.last_error = 'socket sending error' + str(e) + encoded_message = None + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketSendError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketSendError, type(e)(str(e)))(self.connection.last_error) + if self.connection.usage: + self.connection._usage.update_transmitted_message(self.connection.request, len(encoded_message)) + + def _start_listen(self): + # overridden on strategy class + raise NotImplementedError + + def _get_response(self, message_id, timeout): + # overridden in strategy class + raise NotImplementedError + + def receiving(self): + # overridden in strategy class + raise NotImplementedError + + def post_send_single_response(self, message_id): + # overridden in strategy class + raise NotImplementedError + + def post_send_search(self, message_id): + # overridden in strategy class + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError + + def unbind_referral_cache(self): + while len(self.referral_cache) > 0: + cachekey, referral_connection = self.referral_cache.popitem() + referral_connection.unbind() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/ldifProducer.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/ldifProducer.py new file mode 100644 index 0000000..a39c4d7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/ldifProducer.py @@ -0,0 +1,152 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from io import StringIO +from os import linesep +import random + +from ..core.exceptions import LDAPLDIFError +from ..utils.conv import prepare_for_stream +from ..protocol.rfc4511 import LDAPMessage, MessageID, ProtocolOp, LDAP_MAX_INT +from ..protocol.rfc2849 import operation_to_ldif, add_ldif_header +from ..protocol.convert import build_controls_list +from .base import BaseStrategy + + +class LdifProducerStrategy(BaseStrategy): + """ + This strategy is used to create the LDIF stream for the Add, Delete, Modify, ModifyDn operations. + You send the request and get the request in the ldif-change representation of the operation. + NO OPERATION IS SENT TO THE LDAP SERVER! + Connection.request will contain the result LDAP message in a dict form + Connection.response will contain the ldif-change format of the requested operation if available + You don't need a real server to connect to for this strategy + """ + + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = True + self.no_real_dsa = True + self.pooled = False + self.can_stream = True + self.line_separator = linesep + self.all_base64 = False + self.stream = None + self.order = dict() + self._header_added = False + random.seed() + + def _open_socket(self, address, use_ssl=False, unix_socket=False): # fake open socket + self.connection.socket = NotImplemented # placeholder for a dummy socket + if self.connection.usage: + self.connection._usage.open_sockets += 1 + + self.connection.closed = False + + def _close_socket(self): + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + self.connection.socket = None + self.connection.closed = True + + def _start_listen(self): + self.connection.listening = True + self.connection.closed = False + self.connection.bound = True + self._header_added = False + if not self.stream or (isinstance(self.stream, StringIO) and self.stream.closed): + self.set_stream(StringIO()) + + def _stop_listen(self): + self.stream.close() + self.connection.listening = False + self.connection.bound = False + self.connection.closed = True + + def receiving(self): + return None + + def send(self, message_type, request, controls=None): + """ + Build the LDAPMessage without sending to server + """ + message_id = random.randint(0, LDAP_MAX_INT) + ldap_message = LDAPMessage() + ldap_message['messageID'] = MessageID(message_id) + ldap_message['protocolOp'] = ProtocolOp().setComponentByName(message_type, request) + message_controls = build_controls_list(controls) + if message_controls is not None: + ldap_message['controls'] = message_controls + + self.connection.request = BaseStrategy.decode_request(message_type, request, controls) + self.connection.request['controls'] = controls + if self._outstanding is None: + self._outstanding = dict() + self._outstanding[message_id] = self.connection.request + return message_id + + def post_send_single_response(self, message_id): + self.connection.response = None + self.connection.result = None + if self._outstanding and message_id in self._outstanding: + request = self._outstanding.pop(message_id) + ldif_lines = operation_to_ldif(self.connection.request['type'], request, self.all_base64, self.order.get(self.connection.request['type'])) + if self.stream and ldif_lines and not self.connection.closed: + self.accumulate_stream(self.line_separator.join(ldif_lines)) + ldif_lines = add_ldif_header(ldif_lines) + self.connection.response = self.line_separator.join(ldif_lines) + return self.connection.response + + return None + + def post_send_search(self, message_id): + raise LDAPLDIFError('LDIF-CONTENT cannot be produced for Search operations') + + def _get_response(self, message_id, timeout): + pass + + def accumulate_stream(self, fragment): + if not self._header_added and self.stream.tell() == 0: + self._header_added = True + header = add_ldif_header(['-'])[0] + self.stream.write(prepare_for_stream(header + self.line_separator + self.line_separator)) + self.stream.write(prepare_for_stream(fragment + self.line_separator + self.line_separator)) + + def get_stream(self): + return self.stream + + def set_stream(self, value): + error = False + try: + if not value.writable(): + error = True + except (ValueError, AttributeError): + error = True + + if error: + raise LDAPLDIFError('stream must be writable') + + self.stream = value diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockAsync.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockAsync.py new file mode 100644 index 0000000..f9965dc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockAsync.py @@ -0,0 +1,200 @@ +""" +""" + +# Created on 2016.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES +from .mockBase import MockBaseStrategy +from .asynchronous import AsyncStrategy +from ..operation.search import search_result_done_response_to_dict, search_result_entry_response_to_dict +from ..core.results import DO_NOT_RAISE_EXCEPTIONS +from ..utils.log import log, log_enabled, ERROR, PROTOCOL +from ..core.exceptions import LDAPResponseTimeoutError, LDAPOperationResult +from ..operation.bind import bind_response_to_dict +from ..operation.delete import delete_response_to_dict +from ..operation.add import add_response_to_dict +from ..operation.compare import compare_response_to_dict +from ..operation.modifyDn import modify_dn_response_to_dict +from ..operation.modify import modify_response_to_dict +from ..operation.search import search_result_done_response_to_dict, search_result_entry_response_to_dict +from ..operation.extended import extended_response_to_dict + +# LDAPResult ::= SEQUENCE { +# resultCode ENUMERATED { +# success (0), +# operationsError (1), +# protocolError (2), +# timeLimitExceeded (3), +# sizeLimitExceeded (4), +# compareFalse (5), +# compareTrue (6), +# authMethodNotSupported (7), +# strongerAuthRequired (8), +# -- 9 reserved -- +# referral (10), +# adminLimitExceeded (11), +# unavailableCriticalExtension (12), +# confidentialityRequired (13), +# saslBindInProgress (14), +# noSuchAttribute (16), +# undefinedAttributeType (17), +# inappropriateMatching (18), +# constraintViolation (19), +# attributeOrValueExists (20), +# invalidAttributeSyntax (21), +# -- 22-31 unused -- +# noSuchObject (32), +# aliasProblem (33), +# invalidDNSyntax (34), +# -- 35 reserved for undefined isLeaf -- +# aliasDereferencingProblem (36), +# -- 37-47 unused -- +# inappropriateAuthentication (48), +# invalidCredentials (49), +# insufficientAccessRights (50), +# busy (51), +# unavailable (52), +# unwillingToPerform (53), +# loopDetect (54), +# -- 55-63 unused -- +# namingViolation (64), +# objectClassViolation (65), +# notAllowedOnNonLeaf (66), +# notAllowedOnRDN (67), +# entryAlreadyExists (68), +# objectClassModsProhibited (69), +# -- 70 reserved for CLDAP -- +# affectsMultipleDSAs (71), +# -- 72-79 unused -- +# other (80), +# ... }, +# matchedDN LDAPDN, +# diagnosticMessage LDAPString, +# referral [3] Referral OPTIONAL } + + +class MockAsyncStrategy(MockBaseStrategy, AsyncStrategy): # class inheritance sequence is important, MockBaseStrategy must be the first one + """ + This strategy create a mock LDAP server, with asynchronous access + It can be useful to test LDAP without accessing a real Server + """ + def __init__(self, ldap_connection): + AsyncStrategy.__init__(self, ldap_connection) + MockBaseStrategy.__init__(self) + #outstanding = dict() # a dictionary with the message id as key and a tuple (result, response) as value + + def post_send_search(self, payload): + message_id, message_type, request, controls = payload + async_response = [] + async_result = dict() + if message_type == 'searchRequest': + responses, result = self.mock_search(request, controls) + result['type'] = 'searchResDone' + for entry in responses: + response = search_result_entry_response_to_dict(entry, self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + response['type'] = 'searchResEntry' + + if self.connection.empty_attributes: + for attribute_type in request['attributes']: + attribute_name = str(attribute_type) + if attribute_name not in response['raw_attributes'] and attribute_name not in (ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES): + response['raw_attributes'][attribute_name] = list() + response['attributes'][attribute_name] = list() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute set to empty list for missing attribute <%s> in <%s>', + attribute_type, self) + if not self.connection.auto_range: + attrs_to_remove = [] + # removes original empty attribute in case a range tag is returned + for attribute_type in response['attributes']: + attribute_name = str(attribute_type) + if ';range' in attribute_name.lower(): + orig_attr, _, _ = attribute_name.partition(';') + attrs_to_remove.append(orig_attr) + for attribute_type in attrs_to_remove: + if log_enabled(PROTOCOL): + log(PROTOCOL, + 'attribute type <%s> removed in response because of same attribute returned as range by the server in <%s>', + attribute_type, self) + del response['raw_attributes'][attribute_type] + del response['attributes'][attribute_type] + + async_response.append(response) + async_result = search_result_done_response_to_dict(result) + async_result['type'] = 'searchResDone' + self._responses[message_id] = (request, async_result, async_response) + return message_id + + def post_send_single_response(self, payload): # payload is a tuple sent by self.send() made of message_type, request, controls + message_id, message_type, request, controls = payload + responses = [] + result = None + if message_type == 'bindRequest': + result = bind_response_to_dict(self.mock_bind(request, controls)) + result['type'] = 'bindResponse' + elif message_type == 'unbindRequest': + self.bound = None + elif message_type == 'abandonRequest': + pass + elif message_type == 'delRequest': + result = delete_response_to_dict(self.mock_delete(request, controls)) + result['type'] = 'delResponse' + elif message_type == 'addRequest': + result = add_response_to_dict(self.mock_add(request, controls)) + result['type'] = 'addResponse' + elif message_type == 'compareRequest': + result = compare_response_to_dict(self.mock_compare(request, controls)) + result['type'] = 'compareResponse' + elif message_type == 'modDNRequest': + result = modify_dn_response_to_dict(self.mock_modify_dn(request, controls)) + result['type'] = 'modDNResponse' + elif message_type == 'modifyRequest': + result = modify_response_to_dict(self.mock_modify(request, controls)) + result['type'] = 'modifyResponse' + elif message_type == 'extendedReq': + result = extended_response_to_dict(self.mock_extended(request, controls)) + result['type'] = 'extendedResp' + responses.append(result) + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + self._responses[message_id] = (request, result, responses) + return message_id + + + def get_response(self, message_id, timeout=None, get_request=False): + if message_id in self._responses: + request, result, response = self._responses.pop(message_id) + else: + raise(LDAPResponseTimeoutError('message id not in outstanding queue')) + + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + if get_request: + return response, result, request + else: + return response, result diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockBase.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockBase.py new file mode 100644 index 0000000..527d9c4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockBase.py @@ -0,0 +1,921 @@ +""" +""" + +# Created on 2016.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import json +import re + +from random import SystemRandom + +from pyasn1.type.univ import OctetString + +from .. import SEQUENCE_TYPES, ALL_ATTRIBUTES +from ..operation.bind import bind_request_to_dict +from ..operation.delete import delete_request_to_dict +from ..operation.add import add_request_to_dict +from ..operation.compare import compare_request_to_dict +from ..operation.modifyDn import modify_dn_request_to_dict +from ..operation.modify import modify_request_to_dict +from ..operation.extended import extended_request_to_dict +from ..operation.search import search_request_to_dict, parse_filter, ROOT, AND, OR, NOT, MATCH_APPROX, \ + MATCH_GREATER_OR_EQUAL, MATCH_LESS_OR_EQUAL, MATCH_EXTENSIBLE, MATCH_PRESENT,\ + MATCH_SUBSTRING, MATCH_EQUAL +from ..utils.conv import json_hook, to_unicode, to_raw +from ..core.exceptions import LDAPDefinitionError, LDAPPasswordIsMandatoryError, LDAPInvalidValueError, LDAPSocketOpenError +from ..core.results import RESULT_SUCCESS, RESULT_OPERATIONS_ERROR, RESULT_UNAVAILABLE_CRITICAL_EXTENSION, \ + RESULT_INVALID_CREDENTIALS, RESULT_NO_SUCH_OBJECT, RESULT_ENTRY_ALREADY_EXISTS, RESULT_COMPARE_TRUE, \ + RESULT_COMPARE_FALSE, RESULT_NO_SUCH_ATTRIBUTE, RESULT_UNWILLING_TO_PERFORM, RESULT_PROTOCOL_ERROR, RESULT_CONSTRAINT_VIOLATION, RESULT_NOT_ALLOWED_ON_RDN +from ..utils.ciDict import CaseInsensitiveDict +from ..utils.dn import to_dn, safe_dn, safe_rdn +from ..protocol.sasl.sasl import validate_simple_password +from ..protocol.formatters.standard import find_attribute_validator, format_attribute_values +from ..protocol.rfc2696 import paged_search_control +from ..utils.log import log, log_enabled, ERROR, BASIC +from ..utils.asn1 import encode +from ..utils.conv import ldap_escape_to_bytes +from ..strategy.base import BaseStrategy # needed for decode_control() method +from ..protocol.rfc4511 import LDAPMessage, ProtocolOp, MessageID +from ..protocol.convert import build_controls_list + + +# LDAPResult ::= SEQUENCE { +# resultCode ENUMERATED { +# success (0), +# operationsError (1), +# protocolError (2), +# timeLimitExceeded (3), +# sizeLimitExceeded (4), +# compareFalse (5), +# compareTrue (6), +# authMethodNotSupported (7), +# strongerAuthRequired (8), +# -- 9 reserved -- +# referral (10), +# adminLimitExceeded (11), +# unavailableCriticalExtension (12), +# confidentialityRequired (13), +# saslBindInProgress (14), +# noSuchAttribute (16), +# undefinedAttributeType (17), +# inappropriateMatching (18), +# constraintViolation (19), +# attributeOrValueExists (20), +# invalidAttributeSyntax (21), +# -- 22-31 unused -- +# noSuchObject (32), +# aliasProblem (33), +# invalidDNSyntax (34), +# -- 35 reserved for undefined isLeaf -- +# aliasDereferencingProblem (36), +# -- 37-47 unused -- +# inappropriateAuthentication (48), +# invalidCredentials (49), +# insufficientAccessRights (50), +# busy (51), +# unavailable (52), +# unwillingToPerform (53), +# loopDetect (54), +# -- 55-63 unused -- +# namingViolation (64), +# objectClassViolation (65), +# notAllowedOnNonLeaf (66), +# notAllowedOnRDN (67), +# entryAlreadyExists (68), +# objectClassModsProhibited (69), +# -- 70 reserved for CLDAP -- +# affectsMultipleDSAs (71), +# -- 72-79 unused -- +# other (80), +# ... }, +# matchedDN LDAPDN, +# diagnosticMessage LDAPString, +# referral [3] Referral OPTIONAL } + +# noinspection PyProtectedMember,PyUnresolvedReferences + +SEARCH_CONTROLS = ['1.2.840.113556.1.4.319' # simple paged search [RFC 2696] + ] +SERVER_ENCODING = 'utf-8' + + +def random_cookie(): + return to_raw(SystemRandom().random())[-6:] + + +class PagedSearchSet(object): + def __init__(self, response, size, criticality): + self.size = size + self.response = response + self.cookie = None + self.sent = 0 + self.done = False + + def next(self, size=None): + if size: + self.size=size + + message = '' + response = self.response[self.sent: self.sent + self.size] + self.sent += self.size + if self.sent > len(self.response): + self.done = True + self.cookie = '' + else: + self.cookie = random_cookie() + + response_control = paged_search_control(False, len(self.response), self.cookie) + result = {'resultCode': RESULT_SUCCESS, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None, + 'controls': [BaseStrategy.decode_control(response_control)] + } + return response, result + + +class MockBaseStrategy(object): + """ + Base class for connection strategy + """ + + def __init__(self): + if not hasattr(self.connection.server, 'dit'): # create entries dict if not already present + self.connection.server.dit = CaseInsensitiveDict() + self.entries = self.connection.server.dit # for simpler reference + self.no_real_dsa = True + self.bound = None + self.custom_validators = None + self.operational_attributes = ['entryDN'] + self.add_entry('cn=schema', [], validate=False) # add default entry for schema + self._paged_sets = [] # list of paged search in progress + if log_enabled(BASIC): + log(BASIC, 'instantiated <%s>: <%s>', self.__class__.__name__, self) + + def _start_listen(self): + self.connection.listening = True + self.connection.closed = False + if self.connection.usage: + self.connection._usage.open_sockets += 1 + + def _stop_listen(self): + self.connection.listening = False + self.connection.closed = True + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + def _prepare_value(self, attribute_type, value, validate=True): + """ + Prepare a value for being stored in the mock DIT + :param value: object to store + :return: raw value to store in the DIT + """ + if validate: # if loading from json dump do not validate values: + validator = find_attribute_validator(self.connection.server.schema, attribute_type, self.custom_validators) + validated = validator(value) + if validated is False: + raise LDAPInvalidValueError('value non valid for attribute \'%s\'' % attribute_type) + elif validated is not True: # a valid LDAP value equivalent to the actual value + value = validated + raw_value = to_raw(value) + if not isinstance(raw_value, bytes): + raise LDAPInvalidValueError('The value "%s" of type %s for "%s" must be bytes or an offline schema needs to be provided when Mock strategy is used.' % ( + value, + type(value), + attribute_type, + )) + return raw_value + + def _update_attribute(self, dn, attribute_type, value): + pass + + def add_entry(self, dn, attributes, validate=True): + with self.connection.server.dit_lock: + escaped_dn = safe_dn(dn) + if escaped_dn not in self.connection.server.dit: + new_entry = CaseInsensitiveDict() + for attribute in attributes: + if attribute in self.operational_attributes: # no restore of operational attributes, should be computed at runtime + continue + if not isinstance(attributes[attribute], SEQUENCE_TYPES): # entry attributes are always lists of bytes values + attributes[attribute] = [attributes[attribute]] + if self.connection.server.schema and self.connection.server.schema.attribute_types[attribute].single_value and len(attributes[attribute]) > 1: # multiple values in single-valued attribute + return False + if attribute.lower() == 'objectclass' and self.connection.server.schema: # builds the objectClass hierarchy only if schema is present + class_set = set() + for object_class in attributes[attribute]: + if self.connection.server.schema.object_classes and object_class not in self.connection.server.schema.object_classes: + return False + # walkups the class hierarchy and buils a set of all classes in it + class_set.add(object_class) + class_set_size = 0 + while class_set_size != len(class_set): + new_classes = set() + class_set_size = len(class_set) + for class_name in class_set: + if self.connection.server.schema.object_classes[class_name].superior: + new_classes.update(self.connection.server.schema.object_classes[class_name].superior) + class_set.update(new_classes) + new_entry['objectClass'] = [to_raw(value) for value in class_set] + else: + new_entry[attribute] = [self._prepare_value(attribute, value, validate) for value in attributes[attribute]] + for rdn in safe_rdn(escaped_dn, decompose=True): # adds rdns to entry attributes + if rdn[0] not in new_entry: # if rdn attribute is missing adds attribute and its value + new_entry[rdn[0]] = [to_raw(rdn[1])] + else: + raw_rdn = to_raw(rdn[1]) + if raw_rdn not in new_entry[rdn[0]]: # add rdn value if rdn attribute is present but value is missing + new_entry[rdn[0]].append(raw_rdn) + new_entry['entryDN'] = [to_raw(escaped_dn)] + self.connection.server.dit[escaped_dn] = new_entry + return True + return False + + def remove_entry(self, dn): + with self.connection.server.dit_lock: + escaped_dn = safe_dn(dn) + if escaped_dn in self.connection.server.dit: + del self.connection.server.dit[escaped_dn] + return True + return False + + def entries_from_json(self, json_entry_file): + target = open(json_entry_file, 'r') + definition = json.load(target, object_hook=json_hook) + if 'entries' not in definition: + self.connection.last_error = 'invalid JSON definition, missing "entries" section' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + if not self.connection.server.dit: + self.connection.server.dit = CaseInsensitiveDict() + for entry in definition['entries']: + if 'raw' not in entry: + self.connection.last_error = 'invalid JSON definition, missing "raw" section' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + if 'dn' not in entry: + self.connection.last_error = 'invalid JSON definition, missing "dn" section' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + self.add_entry(entry['dn'], entry['raw'], validate=False) + target.close() + + def mock_bind(self, request_message, controls): + # BindRequest ::= [APPLICATION 0] SEQUENCE { + # version INTEGER (1 .. 127), + # name LDAPDN, + # authentication AuthenticationChoice } + # + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + # + # request: version, name, authentication + # response: LDAPResult + serverSaslCreds + request = bind_request_to_dict(request_message) + identity = request['name'] + if 'simple' in request['authentication']: + try: + password = validate_simple_password(request['authentication']['simple']) + except LDAPPasswordIsMandatoryError: + password = '' + identity = '' + else: + self.connection.last_error = 'only Simple Bind allowed in Mock strategy' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + # checks userPassword for password. userPassword must be a text string or a list of text strings + if identity in self.connection.server.dit: + if 'userPassword' in self.connection.server.dit[identity]: + # if self.connection.server.dit[identity]['userPassword'] == password or password in self.connection.server.dit[identity]['userPassword']: + if self.equal(identity, 'userPassword', password): + result_code = RESULT_SUCCESS + message = '' + self.bound = identity + else: + result_code = RESULT_INVALID_CREDENTIALS + message = 'invalid credentials' + else: # no user found, returns invalidCredentials + result_code = RESULT_INVALID_CREDENTIALS + message = 'missing userPassword attribute' + elif identity == '': + result_code = RESULT_SUCCESS + message = '' + self.bound = identity + else: + result_code = RESULT_INVALID_CREDENTIALS + message = 'missing object' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None, + 'serverSaslCreds': None + } + + def mock_delete(self, request_message, controls): + # DelRequest ::= [APPLICATION 10] LDAPDN + # + # DelResponse ::= [APPLICATION 11] LDAPResult + # + # request: entry + # response: LDAPResult + request = delete_request_to_dict(request_message) + dn = safe_dn(request['entry']) + if dn in self.connection.server.dit: + del self.connection.server.dit[dn] + result_code = RESULT_SUCCESS + message = '' + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_add(self, request_message, controls): + # AddRequest ::= [APPLICATION 8] SEQUENCE { + # entry LDAPDN, + # attributes AttributeList } + # + # AddResponse ::= [APPLICATION 9] LDAPResult + # + # request: entry, attributes + # response: LDAPResult + request = add_request_to_dict(request_message) + dn = safe_dn(request['entry']) + attributes = request['attributes'] + # converts attributes values to bytes + + if dn not in self.connection.server.dit: + if self.add_entry(dn, attributes): + result_code = RESULT_SUCCESS + message = '' + else: + result_code = RESULT_OPERATIONS_ERROR + message = 'error adding entry' + else: + result_code = RESULT_ENTRY_ALREADY_EXISTS + message = 'entry already exist' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_compare(self, request_message, controls): + # CompareRequest ::= [APPLICATION 14] SEQUENCE { + # entry LDAPDN, + # ava AttributeValueAssertion } + # + # CompareResponse ::= [APPLICATION 15] LDAPResult + # + # request: entry, attribute, value + # response: LDAPResult + request = compare_request_to_dict(request_message) + dn = safe_dn(request['entry']) + attribute = request['attribute'] + value = to_raw(request['value']) + if dn in self.connection.server.dit: + if attribute in self.connection.server.dit[dn]: + if self.equal(dn, attribute, value): + result_code = RESULT_COMPARE_TRUE + message = '' + else: + result_code = RESULT_COMPARE_FALSE + message = '' + else: + result_code = RESULT_NO_SUCH_ATTRIBUTE + message = 'attribute not found' + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_modify_dn(self, request_message, controls): + # ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { + # entry LDAPDN, + # newrdn RelativeLDAPDN, + # deleteoldrdn BOOLEAN, + # newSuperior [0] LDAPDN OPTIONAL } + # + # ModifyDNResponse ::= [APPLICATION 13] LDAPResult + # + # request: entry, newRdn, deleteOldRdn, newSuperior + # response: LDAPResult + request = modify_dn_request_to_dict(request_message) + dn = safe_dn(request['entry']) + new_rdn = request['newRdn'] + delete_old_rdn = request['deleteOldRdn'] + new_superior = safe_dn(request['newSuperior']) if request['newSuperior'] else '' + dn_components = to_dn(dn) + if dn in self.connection.server.dit: + if new_superior and new_rdn: # performs move in the DIT + new_dn = safe_dn(dn_components[0] + ',' + new_superior) + self.connection.server.dit[new_dn] = self.connection.server.dit[dn].copy() + moved_entry = self.connection.server.dit[new_dn] + if delete_old_rdn: + del self.connection.server.dit[dn] + result_code = RESULT_SUCCESS + message = 'entry moved' + moved_entry['entryDN'] = [to_raw(new_dn)] + elif new_rdn and not new_superior: # performs rename + new_dn = safe_dn(new_rdn + ',' + safe_dn(dn_components[1:])) + self.connection.server.dit[new_dn] = self.connection.server.dit[dn].copy() + renamed_entry = self.connection.server.dit[new_dn] + del self.connection.server.dit[dn] + renamed_entry['entryDN'] = [to_raw(new_dn)] + + for rdn in safe_rdn(new_dn, decompose=True): # adds rdns to entry attributes + renamed_entry[rdn[0]] = [to_raw(rdn[1])] + + result_code = RESULT_SUCCESS + message = 'entry rdn renamed' + else: + result_code = RESULT_UNWILLING_TO_PERFORM + message = 'newRdn or newSuperior missing' + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_modify(self, request_message, controls): + # ModifyRequest ::= [APPLICATION 6] SEQUENCE { + # object LDAPDN, + # changes SEQUENCE OF change SEQUENCE { + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... }, + # modification PartialAttribute } } + # + # ModifyResponse ::= [APPLICATION 7] LDAPResult + # + # request: entry, changes + # response: LDAPResult + # + # changes is a dictionary in the form {'attribute': [(operation, [val1, ...]), ...], ...} + # operation is 0 (add), 1 (delete), 2 (replace), 3 (increment) + request = modify_request_to_dict(request_message) + dn = safe_dn(request['entry']) + changes = request['changes'] + result_code = 0 + message = '' + rdns = [rdn[0] for rdn in safe_rdn(dn, decompose=True)] + if dn in self.connection.server.dit: + entry = self.connection.server.dit[dn] + original_entry = entry.copy() # to preserve atomicity of operation + for modification in changes: + operation = modification['operation'] + attribute = modification['attribute']['type'] + elements = modification['attribute']['value'] + if operation == 0: # add + if attribute not in entry and elements: # attribute not present, creates the new attribute and add elements + if self.connection.server.schema and self.connection.server.schema.attribute_types and self.connection.server.schema.attribute_types[attribute].single_value and len(elements) > 1: # multiple values in single-valued attribute + result_code = RESULT_CONSTRAINT_VIOLATION + message = 'attribute is single-valued' + else: + entry[attribute] = [to_raw(element) for element in elements] + else: # attribute present, adds elements to current values + if self.connection.server.schema and self.connection.server.schema.attribute_types and self.connection.server.schema.attribute_types[attribute].single_value: # multiple values in single-valued attribute + result_code = RESULT_CONSTRAINT_VIOLATION + message = 'attribute is single-valued' + else: + entry[attribute].extend([to_raw(element) for element in elements]) + elif operation == 1: # delete + if attribute not in entry: # attribute must exist + result_code = RESULT_NO_SUCH_ATTRIBUTE + message = 'attribute must exists for deleting its values' + elif attribute in rdns: # attribute can't be used in dn + result_code = RESULT_NOT_ALLOWED_ON_RDN + message = 'cannot delete an rdn' + else: + if not elements: # deletes whole attribute if element list is empty + del entry[attribute] + else: + for element in elements: + raw_element = to_raw(element) + if self.equal(dn, attribute, raw_element): # removes single element + entry[attribute].remove(raw_element) + else: + result_code = 1 + message = 'value to delete not found' + if not entry[attribute]: # removes the whole attribute if no elements remained + del entry[attribute] + elif operation == 2: # replace + if attribute not in entry and elements: # attribute not present, creates the new attribute and add elements + if self.connection.server.schema and self.connection.server.schema.attribute_types and self.connection.server.schema.attribute_types[attribute].single_value and len(elements) > 1: # multiple values in single-valued attribute + result_code = RESULT_CONSTRAINT_VIOLATION + message = 'attribute is single-valued' + else: + entry[attribute] = [to_raw(element) for element in elements] + elif not elements and attribute in rdns: # attribute can't be used in dn + result_code = RESULT_NOT_ALLOWED_ON_RDN + message = 'cannot replace an rdn' + elif not elements: # deletes whole attribute if element list is empty + if attribute in entry: + del entry[attribute] + else: # substitutes elements + entry[attribute] = [to_raw(element) for element in elements] + elif operation == 3: # increment + if attribute not in entry: # attribute must exist + result_code = RESULT_NO_SUCH_ATTRIBUTE + message = 'attribute must exists for incrementing its values' + else: + if len(elements) != 1: + result_code = RESULT_PROTOCOL_ERROR + message = 'only one increment value is allowed' + else: + try: + entry[attribute] = [bytes(str(int(value) + int(elements[0])), encoding='utf-8') for value in entry[attribute]] + except: + result_code = RESULT_UNWILLING_TO_PERFORM + message = 'unable to increment value' + + if result_code: # an error has happened, restores the original dn + self.connection.server.dit[dn] = original_entry + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_search(self, request_message, controls): + # SearchRequest ::= [APPLICATION 3] SEQUENCE { + # baseObject LDAPDN, + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + # ... }, + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + # sizeLimit INTEGER (0 .. maxInt), + # timeLimit INTEGER (0 .. maxInt), + # typesOnly BOOLEAN, + # filter Filter, + # attributes AttributeSelection } + # + # SearchResultEntry ::= [APPLICATION 4] SEQUENCE { + # objectName LDAPDN, + # attributes PartialAttributeList } + # + # + # SearchResultReference ::= [APPLICATION 19] SEQUENCE + # SIZE (1..MAX) OF uri URI + # + # SearchResultDone ::= [APPLICATION 5] LDAPResult + # + # request: base, scope, dereferenceAlias, sizeLimit, timeLimit, typesOnly, filter, attributes + # response_entry: object, attributes + # response_done: LDAPResult + request = search_request_to_dict(request_message) + if controls: + decoded_controls = [self.decode_control(control) for control in controls if control] + for decoded_control in decoded_controls: + if decoded_control[1]['criticality'] and decoded_control[0] not in SEARCH_CONTROLS: + message = 'Critical requested control ' + str(decoded_control[0]) + ' not available' + result = {'resultCode': RESULT_UNAVAILABLE_CRITICAL_EXTENSION, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + return [], result + elif decoded_control[0] == '1.2.840.113556.1.4.319': # Simple paged search + if not decoded_control[1]['value']['cookie']: # new paged search + response, result = self._execute_search(request) + if result['resultCode'] == RESULT_SUCCESS: # success + paged_set = PagedSearchSet(response, int(decoded_control[1]['value']['size']), decoded_control[1]['criticality']) + response, result = paged_set.next() + if paged_set.done: # paged search already completed, no need to store the set + del paged_set + else: + self._paged_sets.append(paged_set) + return response, result + else: + return [], result + else: + for paged_set in self._paged_sets: + if paged_set.cookie == decoded_control[1]['value']['cookie']: # existing paged set + response, result = paged_set.next() # returns next bunch of entries as per paged set specifications + if paged_set.done: + self._paged_sets.remove(paged_set) + return response, result + # paged set not found + message = 'Invalid cookie in simple paged search' + result = {'resultCode': RESULT_OPERATIONS_ERROR, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + return [], result + + else: + return self._execute_search(request) + + def _execute_search(self, request): + responses = [] + base = safe_dn(request['base']) + scope = request['scope'] + attributes = request['attributes'] + if '+' in attributes: # operational attributes requested + attributes.extend(self.operational_attributes) + attributes.remove('+') + + attributes = [attr.lower() for attr in request['attributes']] + + filter_root = parse_filter(request['filter'], self.connection.server.schema, auto_escape=True, auto_encode=False, validator=self.connection.server.custom_validator, check_names=self.connection.check_names) + candidates = [] + if scope == 0: # base object + if base in self.connection.server.dit or base.lower() == 'cn=schema': + candidates.append(base) + elif scope == 1: # single level + for entry in self.connection.server.dit: + if entry.lower().endswith(base.lower()) and ',' not in entry[:-len(base) - 1]: # only leafs without commas in the remaining dn + candidates.append(entry) + elif scope == 2: # whole subtree + for entry in self.connection.server.dit: + if entry.lower().endswith(base.lower()): + candidates.append(entry) + + if not candidates: # incorrect base + result_code = RESULT_NO_SUCH_OBJECT + message = 'incorrect base object' + else: + matched = self.evaluate_filter_node(filter_root, candidates) + if self.connection.raise_exceptions and 0 < request['sizeLimit'] < len(matched): + result_code = 4 + message = 'size limit exceeded' + else: + for match in matched: + responses.append({ + 'object': match, + 'attributes': [{'type': attribute, + 'vals': [] if request['typesOnly'] else self.connection.server.dit[match][attribute]} + for attribute in self.connection.server.dit[match] + if attribute.lower() in attributes or ALL_ATTRIBUTES in attributes] + }) + if '+' not in attributes: # remove operational attributes + for op_attr in self.operational_attributes: + if op_attr.lower() in attributes: + # if the op_attr was explicitly requested, then keep it + continue + for i, attr in enumerate(responses[len(responses)-1]['attributes']): + if attr['type'] == op_attr: + del responses[len(responses)-1]['attributes'][i] + result_code = 0 + message = '' + + result = {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + return responses[:request['sizeLimit']] if request['sizeLimit'] > 0 else responses, result + + def mock_extended(self, request_message, controls): + # ExtendedRequest ::= [APPLICATION 23] SEQUENCE { + # requestName [0] LDAPOID, + # requestValue [1] OCTET STRING OPTIONAL } + # + # ExtendedResponse ::= [APPLICATION 24] SEQUENCE { + # COMPONENTS OF LDAPResult, + # responseName [10] LDAPOID OPTIONAL, + # responseValue [11] OCTET STRING OPTIONAL } + # + # IntermediateResponse ::= [APPLICATION 25] SEQUENCE { + # responseName [0] LDAPOID OPTIONAL, + # responseValue [1] OCTET STRING OPTIONAL } + request = extended_request_to_dict(request_message) + + result_code = RESULT_UNWILLING_TO_PERFORM + message = 'not implemented' + response_name = None + response_value = None + if self.connection.server.info: + for extension in self.connection.server.info.supported_extensions: + if request['name'] == extension[0]: # server can answer the extended request + if extension[0] == '2.16.840.1.113719.1.27.100.31': # getBindDNRequest [NOVELL] + result_code = 0 + message = '' + response_name = OctetString('2.16.840.1.113719.1.27.100.32') # getBindDNResponse [NOVELL] + response_value = OctetString(self.bound) + elif extension[0] == '1.3.6.1.4.1.4203.1.11.3': # WhoAmI [RFC4532] + result_code = 0 + message = '' + response_name = OctetString('1.3.6.1.4.1.4203.1.11.3') # WhoAmI [RFC4532] + response_value = OctetString(self.bound) + break + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None, + 'responseName': response_name, + 'responseValue': response_value + } + + def evaluate_filter_node(self, node, candidates): + """After evaluation each 2 sets are added to each MATCH node, one for the matched object and one for unmatched object. + The unmatched object set is needed if a superior node is a NOT that reverts the evaluation. The BOOLEAN nodes mix the sets + returned by the MATCH nodes""" + node.matched = set() + node.unmatched = set() + + if node.elements: + for element in node.elements: + self.evaluate_filter_node(element, candidates) + + if node.tag == ROOT: + return node.elements[0].matched + elif node.tag == AND: + first_element = node.elements[0] + node.matched.update(first_element.matched) + node.unmatched.update(first_element.unmatched) + + for element in node.elements[1:]: + node.matched.intersection_update(element.matched) + node.unmatched.intersection_update(element.unmatched) + elif node.tag == OR: + for element in node.elements: + node.matched.update(element.matched) + node.unmatched.update(element.unmatched) + elif node.tag == NOT: + node.matched = node.elements[0].unmatched + node.unmatched = node.elements[0].matched + elif node.tag == MATCH_GREATER_OR_EQUAL: + attr_name = node.assertion['attr'] + attr_value = node.assertion['value'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + for value in self.connection.server.dit[candidate][attr_name]: + if value.isdigit() and attr_value.isdigit(): # int comparison + if int(value) >= int(attr_value): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + else: + if to_unicode(value, SERVER_ENCODING).lower() >= to_unicode(attr_value, SERVER_ENCODING).lower(): # case insensitive string comparison + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_LESS_OR_EQUAL: + attr_name = node.assertion['attr'] + attr_value = node.assertion['value'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + for value in self.connection.server.dit[candidate][attr_name]: + if value.isdigit() and attr_value.isdigit(): # int comparison + if int(value) <= int(attr_value): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + else: + if to_unicode(value, SERVER_ENCODING).lower() <= to_unicode(attr_value, SERVER_ENCODING).lower(): # case insentive string comparison + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_EXTENSIBLE: + self.connection.last_error = 'Extensible match not allowed in Mock strategy' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + elif node.tag == MATCH_PRESENT: + attr_name = node.assertion['attr'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_SUBSTRING: + attr_name = node.assertion['attr'] + # rebuild the original substring filter + if 'initial' in node.assertion and node.assertion['initial'] is not None: + substring_filter = re.escape(to_unicode(node.assertion['initial'], SERVER_ENCODING)) + else: + substring_filter = '' + + if 'any' in node.assertion and node.assertion['any'] is not None: + for middle in node.assertion['any']: + substring_filter += '.*' + re.escape(to_unicode(middle, SERVER_ENCODING)) + + if 'final' in node.assertion and node.assertion['final'] is not None: + substring_filter += '.*' + re.escape(to_unicode(node.assertion['final'], SERVER_ENCODING)) + + if substring_filter and not node.assertion.get('any', None) and not node.assertion.get('final', None): # only initial, adds .* + substring_filter += '.*' + + regex_filter = re.compile(substring_filter, flags=re.UNICODE | re.IGNORECASE) # unicode AND ignorecase + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + for value in self.connection.server.dit[candidate][attr_name]: + if regex_filter.match(to_unicode(value, SERVER_ENCODING)): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_EQUAL or node.tag == MATCH_APPROX: + attr_name = node.assertion['attr'] + attr_value = node.assertion['value'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate] and self.equal(candidate, attr_name, attr_value): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + + def equal(self, dn, attribute_type, value_to_check): + # value is the value to match + attribute_values = self.connection.server.dit[dn][attribute_type] + if not isinstance(attribute_values, SEQUENCE_TYPES): + attribute_values = [attribute_values] + escaped_value_to_check = ldap_escape_to_bytes(value_to_check) + for attribute_value in attribute_values: + if self._check_equality(escaped_value_to_check, attribute_value): + return True + if self._check_equality(self._prepare_value(attribute_type, value_to_check), attribute_value): + return True + return False + + @staticmethod + def _check_equality(value1, value2): + if value1 == value2: # exact matching + return True + if str(value1).isdigit() and str(value2).isdigit(): + if int(value1) == int(value2): # int comparison + return True + try: + if to_unicode(value1, SERVER_ENCODING).lower() == to_unicode(value2, SERVER_ENCODING).lower(): # case insensitive comparison + return True + except UnicodeError: + pass + + return False + + def send(self, message_type, request, controls=None): + self.connection.request = self.decode_request(message_type, request, controls) + if self.connection.listening: + message_id = self.connection.server.next_message_id() + if self.connection.usage: # ldap message is built for updating metrics only + ldap_message = LDAPMessage() + ldap_message['messageID'] = MessageID(message_id) + ldap_message['protocolOp'] = ProtocolOp().setComponentByName(message_type, request) + message_controls = build_controls_list(controls) + if message_controls is not None: + ldap_message['controls'] = message_controls + asn1_request = BaseStrategy.decode_request(message_type, request, controls) + self.connection._usage.update_transmitted_message(asn1_request, len(encode(ldap_message))) + return message_id, message_type, request, controls + else: + self.connection.last_error = 'unable to send message, connection is not open' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketOpenError(self.connection.last_error) + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockSync.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockSync.py new file mode 100644 index 0000000..efd2c15 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/mockSync.py @@ -0,0 +1,133 @@ +""" +""" + +# Created on 2014.11.17 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..core.results import DO_NOT_RAISE_EXCEPTIONS +from .mockBase import MockBaseStrategy +from .. import ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES +from .sync import SyncStrategy +from ..operation.bind import bind_response_to_dict +from ..operation.delete import delete_response_to_dict +from ..operation.add import add_response_to_dict +from ..operation.compare import compare_response_to_dict +from ..operation.modifyDn import modify_dn_response_to_dict +from ..operation.modify import modify_response_to_dict +from ..operation.search import search_result_done_response_to_dict, search_result_entry_response_to_dict +from ..operation.extended import extended_response_to_dict +from ..core.exceptions import LDAPSocketOpenError, LDAPOperationResult +from ..utils.log import log, log_enabled, ERROR, PROTOCOL + + +class MockSyncStrategy(MockBaseStrategy, SyncStrategy): # class inheritance sequence is important, MockBaseStrategy must be the first one + """ + This strategy create a mock LDAP server, with synchronous access + It can be useful to test LDAP without accessing a real Server + """ + def __init__(self, ldap_connection): + SyncStrategy.__init__(self, ldap_connection) + MockBaseStrategy.__init__(self) + + def post_send_search(self, payload): + message_id, message_type, request, controls = payload + self.connection.response = [] + self.connection.result = dict() + if message_type == 'searchRequest': + responses, result = self.mock_search(request, controls) + for entry in responses: + response = search_result_entry_response_to_dict(entry, self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + response['type'] = 'searchResEntry' + ### + if self.connection.empty_attributes: + for attribute_type in request['attributes']: + attribute_name = str(attribute_type) + if attribute_name not in response['raw_attributes'] and attribute_name not in (ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES): + response['raw_attributes'][attribute_name] = list() + response['attributes'][attribute_name] = list() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute set to empty list for missing attribute <%s> in <%s>', + attribute_type, self) + if not self.connection.auto_range: + attrs_to_remove = [] + # removes original empty attribute in case a range tag is returned + for attribute_type in response['attributes']: + attribute_name = str(attribute_type) + if ';range' in attribute_name.lower(): + orig_attr, _, _ = attribute_name.partition(';') + attrs_to_remove.append(orig_attr) + for attribute_type in attrs_to_remove: + if log_enabled(PROTOCOL): + log(PROTOCOL, + 'attribute type <%s> removed in response because of same attribute returned as range by the server in <%s>', + attribute_type, self) + del response['raw_attributes'][attribute_type] + del response['attributes'][attribute_type] + ### + self.connection.response.append(response) + result = search_result_done_response_to_dict(result) + result['type'] = 'searchResDone' + self.connection.result = result + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + return self.connection.response + + def post_send_single_response(self, payload): # payload is a tuple sent by self.send() made of message_type, request, controls + message_id, message_type, request, controls = payload + responses = [] + result = None + if message_type == 'bindRequest': + result = bind_response_to_dict(self.mock_bind(request, controls)) + result['type'] = 'bindResponse' + elif message_type == 'unbindRequest': + self.bound = None + elif message_type == 'abandonRequest': + pass + elif message_type == 'delRequest': + result = delete_response_to_dict(self.mock_delete(request, controls)) + result['type'] = 'delResponse' + elif message_type == 'addRequest': + result = add_response_to_dict(self.mock_add(request, controls)) + result['type'] = 'addResponse' + elif message_type == 'compareRequest': + result = compare_response_to_dict(self.mock_compare(request, controls)) + result['type'] = 'compareResponse' + elif message_type == 'modDNRequest': + result = modify_dn_response_to_dict(self.mock_modify_dn(request, controls)) + result['type'] = 'modDNResponse' + elif message_type == 'modifyRequest': + result = modify_response_to_dict(self.mock_modify(request, controls)) + result['type'] = 'modifyResponse' + elif message_type == 'extendedReq': + result = extended_response_to_dict(self.mock_extended(request, controls)) + result['type'] = 'extendedResp' + self.connection.result = result + responses.append(result) + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + return responses + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/restartable.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/restartable.py new file mode 100644 index 0000000..55f1706 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/restartable.py @@ -0,0 +1,260 @@ +""" +""" + +# Created on 2014.03.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from time import sleep +import socket + +from .. import get_config_parameter +from .sync import SyncStrategy +from ..core.exceptions import LDAPSocketOpenError, LDAPOperationResult, LDAPMaximumRetriesError, LDAPStartTLSError +from ..utils.log import log, log_enabled, ERROR, BASIC + + +# noinspection PyBroadException,PyProtectedMember +class RestartableStrategy(SyncStrategy): + def __init__(self, ldap_connection): + SyncStrategy.__init__(self, ldap_connection) + self.sync = True + self.no_real_dsa = False + self.pooled = False + self.can_stream = False + self.restartable_sleep_time = get_config_parameter('RESTARTABLE_SLEEPTIME') + self.restartable_tries = get_config_parameter('RESTARTABLE_TRIES') + self._restarting = False + self._last_bind_controls = None + self._current_message_type = None + self._current_request = None + self._current_controls = None + self._restart_tls = None + self.exception_history = [] + + def open(self, reset_usage=False, read_server_info=True): + SyncStrategy.open(self, reset_usage, read_server_info) + + def _open_socket(self, address, use_ssl=False, unix_socket=False): + """ + Try to open and connect a socket to a Server + raise LDAPExceptionError if unable to open or connect socket + if connection is restartable tries for the number of restarting requested or forever + """ + try: + SyncStrategy._open_socket(self, address, use_ssl, unix_socket) # try to open socket using SyncWait + self._reset_exception_history() + return + except Exception as e: # machinery for restartable connection + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + + if not self._restarting: # if not already performing a restart + self._restarting = True + counter = self.restartable_tries + while counter > 0: # includes restartable_tries == True + if log_enabled(BASIC): + log(BASIC, 'try #%d to open Restartable connection <%s>', self.restartable_tries - counter, self.connection) + sleep(self.restartable_sleep_time) + if not self.connection.closed: + try: # resetting connection + self.connection.unbind() + except (socket.error, LDAPSocketOpenError): # don't trace catch socket errors because socket could already be closed + pass + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + try: # reissuing same operation + if self.connection.server_pool: + new_server = self.connection.server_pool.get_server(self.connection) # get a server from the server_pool if available + if self.connection.server != new_server: + self.connection.server = new_server + if self.connection.usage: + self.connection._usage.servers_from_pool += 1 + SyncStrategy._open_socket(self, address, use_ssl, unix_socket) # calls super (not restartable) _open_socket() + if self.connection.usage: + self.connection._usage.restartable_successes += 1 + self.connection.closed = False + self._restarting = False + self._reset_exception_history() + return + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if self.connection.usage: + self.connection._usage.restartable_failures += 1 + if not isinstance(self.restartable_tries, bool): + counter -= 1 + self._restarting = False + self.connection.last_error = 'restartable connection strategy failed while opening socket' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPMaximumRetriesError(self.connection.last_error, self.exception_history, self.restartable_tries) + + def send(self, message_type, request, controls=None): + self._current_message_type = message_type + self._current_request = request + self._current_controls = controls + if not self._restart_tls: # RFCs doesn't define how to stop tls once started + self._restart_tls = self.connection.tls_started + if message_type == 'bindRequest': # stores controls used in bind operation to be used again when restarting the connection + self._last_bind_controls = controls + + try: + message_id = SyncStrategy.send(self, message_type, request, controls) # tries to send using SyncWait + self._reset_exception_history() + return message_id + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if not self._restarting: # machinery for restartable connection + self._restarting = True + counter = self.restartable_tries + while counter > 0: + if log_enabled(BASIC): + log(BASIC, 'try #%d to send in Restartable connection <%s>', self.restartable_tries - counter, self.connection) + sleep(self.restartable_sleep_time) + if not self.connection.closed: + try: # resetting connection + self.connection.unbind() + except (socket.error, LDAPSocketOpenError): # don't trace socket errors because socket could already be closed + pass + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + failure = False + try: # reopening connection + self.connection.open(reset_usage=False, read_server_info=False) + if self._restart_tls: # restart tls if start_tls was previously used + if not self.connection.start_tls(read_server_info=False): + error = 'restart tls in restartable not successful' + (' - ' + self.connection.last_error if self.connection.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.connection.unbind() + raise LDAPStartTLSError(error) + if message_type != 'bindRequest': + self.connection.bind(read_server_info=False, controls=self._last_bind_controls) # binds with previously used controls unless the request is already a bindRequest + if not self.connection.server.schema and not self.connection.server.info: + self.connection.refresh_server_info() + else: + self.connection._fire_deferred(read_info=False) # in case of lazy connection, not open by the refresh_server_info + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + failure = True + + if not failure: + try: # reissuing same operation + ret_value = self.connection.send(message_type, request, controls) + if self.connection.usage: + self.connection._usage.restartable_successes += 1 + self._restarting = False + self._reset_exception_history() + return ret_value # successful send + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + failure = True + + if failure and self.connection.usage: + self.connection._usage.restartable_failures += 1 + + if not isinstance(self.restartable_tries, bool): + counter -= 1 + + self._restarting = False + + self.connection.last_error = 'restartable connection failed to send' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPMaximumRetriesError(self.connection.last_error, self.exception_history, self.restartable_tries) + + def post_send_single_response(self, message_id): + try: + ret_value = SyncStrategy.post_send_single_response(self, message_id) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + + # if an LDAPExceptionError is raised then resend the request + try: + ret_value = SyncStrategy.post_send_single_response(self, self.send(self._current_message_type, self._current_request, self._current_controls)) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if not isinstance(e, LDAPOperationResult): + self.connection.last_error = 'restartable connection strategy failed in post_send_single_response' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise + + def post_send_search(self, message_id): + try: + ret_value = SyncStrategy.post_send_search(self, message_id) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + + # if an LDAPExceptionError is raised then resend the request + try: + ret_value = SyncStrategy.post_send_search(self, self.connection.send(self._current_message_type, self._current_request, self._current_controls)) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if not isinstance(e, LDAPOperationResult): + self.connection.last_error = e.args + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise e + + def _add_exception_to_history(self, exc): + if not isinstance(self.restartable_tries, bool): # doesn't accumulate when restarting forever + if not isinstance(exc, LDAPMaximumRetriesError): # doesn't add the LDAPMaximumRetriesError exception + self.exception_history.append(exc) + + def _reset_exception_history(self): + if self.exception_history: + self.exception_history = [] + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/reusable.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/reusable.py new file mode 100644 index 0000000..01bd9d3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/reusable.py @@ -0,0 +1,495 @@ +""" +""" + +# Created on 2014.03.23 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime +from os import linesep +from threading import Thread, Lock +from time import sleep + +from .. import RESTARTABLE, get_config_parameter, AUTO_BIND_DEFAULT, AUTO_BIND_NONE, AUTO_BIND_NO_TLS, AUTO_BIND_TLS_AFTER_BIND, AUTO_BIND_TLS_BEFORE_BIND +from .base import BaseStrategy +from ..core.usage import ConnectionUsage +from ..core.exceptions import LDAPConnectionPoolNameIsMandatoryError, LDAPConnectionPoolNotStartedError, LDAPOperationResult, LDAPExceptionError, LDAPResponseTimeoutError +from ..utils.log import log, log_enabled, ERROR, BASIC +from ..protocol.rfc4511 import LDAP_MAX_INT + +TERMINATE_REUSABLE = 'TERMINATE_REUSABLE_CONNECTION' + +BOGUS_BIND = -1 +BOGUS_UNBIND = -2 +BOGUS_EXTENDED = -3 +BOGUS_ABANDON = -4 + +try: + from queue import Queue, Empty +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Queue, Empty + + +# noinspection PyProtectedMember +class ReusableStrategy(BaseStrategy): + """ + A pool of reusable SyncWaitRestartable connections with lazy behaviour and limited lifetime. + The connection using this strategy presents itself as a normal connection, but internally the strategy has a pool of + connections that can be used as needed. Each connection lives in its own thread and has a busy/available status. + The strategy performs the requested operation on the first available connection. + The pool of connections is instantiated at strategy initialization. + Strategy has two customizable properties, the total number of connections in the pool and the lifetime of each connection. + When lifetime is expired the connection is closed and will be open again when needed. + """ + pools = dict() + + def receiving(self): + raise NotImplementedError + + def _start_listen(self): + raise NotImplementedError + + def _get_response(self, message_id, timeout): + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError + + # noinspection PyProtectedMember + class ConnectionPool(object): + """ + Container for the Connection Threads + """ + def __new__(cls, connection): + if connection.pool_name in ReusableStrategy.pools: # returns existing connection pool + pool = ReusableStrategy.pools[connection.pool_name] + if not pool.started: # if pool is not started remove it from the pools singleton and create a new onw + del ReusableStrategy.pools[connection.pool_name] + return object.__new__(cls) + if connection.pool_keepalive and pool.keepalive != connection.pool_keepalive: # change lifetime + pool.keepalive = connection.pool_keepalive + if connection.pool_lifetime and pool.lifetime != connection.pool_lifetime: # change keepalive + pool.lifetime = connection.pool_lifetime + if connection.pool_size and pool.pool_size != connection.pool_size: # if pool size has changed terminate and recreate the connections + pool.terminate_pool() + pool.pool_size = connection.pool_size + return pool + else: + return object.__new__(cls) + + def __init__(self, connection): + if not hasattr(self, 'workers'): + self.name = connection.pool_name + self.master_connection = connection + self.workers = [] + self.pool_size = connection.pool_size or get_config_parameter('REUSABLE_THREADED_POOL_SIZE') + self.lifetime = connection.pool_lifetime or get_config_parameter('REUSABLE_THREADED_LIFETIME') + self.keepalive = connection.pool_keepalive + self.request_queue = Queue() + self.open_pool = False + self.bind_pool = False + self.tls_pool = False + self._incoming = dict() + self.counter = 0 + self.terminated_usage = ConnectionUsage() if connection._usage else None + self.terminated = False + self.pool_lock = Lock() + ReusableStrategy.pools[self.name] = self + self.started = False + if log_enabled(BASIC): + log(BASIC, 'instantiated ConnectionPool: <%r>', self) + + def __str__(self): + s = 'POOL: ' + str(self.name) + ' - status: ' + ('started' if self.started else 'terminated') + s += ' - responses in queue: ' + str(len(self._incoming)) + s += ' - pool size: ' + str(self.pool_size) + s += ' - lifetime: ' + str(self.lifetime) + s += ' - keepalive: ' + str(self.keepalive) + s += ' - open: ' + str(self.open_pool) + s += ' - bind: ' + str(self.bind_pool) + s += ' - tls: ' + str(self.tls_pool) + linesep + s += 'MASTER CONN: ' + str(self.master_connection) + linesep + s += 'WORKERS:' + if self.workers: + for i, worker in enumerate(self.workers): + s += linesep + str(i).rjust(5) + ': ' + str(worker) + else: + s += linesep + ' no active workers in pool' + + return s + + def __repr__(self): + return self.__str__() + + def get_info_from_server(self): + for worker in self.workers: + with worker.worker_lock: + if not worker.connection.server.schema or not worker.connection.server.info: + worker.get_info_from_server = True + else: + worker.get_info_from_server = False + + def rebind_pool(self): + for worker in self.workers: + with worker.worker_lock: + worker.connection.rebind(self.master_connection.user, + self.master_connection.password, + self.master_connection.authentication, + self.master_connection.sasl_mechanism, + self.master_connection.sasl_credentials) + + def start_pool(self): + if not self.started: + self.create_pool() + for worker in self.workers: + with worker.worker_lock: + worker.thread.start() + self.started = True + self.terminated = False + if log_enabled(BASIC): + log(BASIC, 'worker started for pool <%s>', self) + return True + return False + + def create_pool(self): + if log_enabled(BASIC): + log(BASIC, 'created pool <%s>', self) + self.workers = [ReusableStrategy.PooledConnectionWorker(self.master_connection, self.request_queue) for _ in range(self.pool_size)] + + def terminate_pool(self): + if not self.terminated: + if log_enabled(BASIC): + log(BASIC, 'terminating pool <%s>', self) + self.started = False + self.request_queue.join() # waits for all queue pending operations + for _ in range(len([worker for worker in self.workers if worker.thread.is_alive()])): # put a TERMINATE signal on the queue for each active thread + self.request_queue.put((TERMINATE_REUSABLE, None, None, None)) + self.request_queue.join() # waits for all queue terminate operations + self.terminated = True + if log_enabled(BASIC): + log(BASIC, 'pool terminated for <%s>', self) + + class PooledConnectionThread(Thread): + """ + The thread that holds the Reusable connection and receive operation request via the queue + Result are sent back in the pool._incoming list when ready + """ + def __init__(self, worker, master_connection): + Thread.__init__(self) + self.daemon = True + self.worker = worker + self.master_connection = master_connection + if log_enabled(BASIC): + log(BASIC, 'instantiated PooledConnectionThread: <%r>', self) + + # noinspection PyProtectedMember + def run(self): + self.worker.running = True + terminate = False + pool = self.master_connection.strategy.pool + while not terminate: + try: + counter, message_type, request, controls = pool.request_queue.get(block=True, timeout=self.master_connection.strategy.pool.keepalive) + except Empty: # issue an Abandon(0) operation to keep the connection live - Abandon(0) is a harmless operation + if not self.worker.connection.closed: + self.worker.connection.abandon(0) + continue + + with self.worker.worker_lock: + self.worker.busy = True + if counter == TERMINATE_REUSABLE: + terminate = True + if self.worker.connection.bound: + try: + self.worker.connection.unbind() + if log_enabled(BASIC): + log(BASIC, 'thread terminated') + except LDAPExceptionError: + pass + else: + if (datetime.now() - self.worker.creation_time).seconds >= self.master_connection.strategy.pool.lifetime: # destroy and create a new connection + try: + self.worker.connection.unbind() + except LDAPExceptionError: + pass + self.worker.new_connection() + if log_enabled(BASIC): + log(BASIC, 'thread respawn') + if message_type not in ['bindRequest', 'unbindRequest']: + try: + if pool.open_pool and self.worker.connection.closed: + self.worker.connection.open(read_server_info=False) + if pool.tls_pool and not self.worker.connection.tls_started: + self.worker.connection.start_tls(read_server_info=False) + if pool.bind_pool and not self.worker.connection.bound: + self.worker.connection.bind(read_server_info=False) + elif pool.open_pool and not self.worker.connection.closed: # connection already open, issues a start_tls + if pool.tls_pool and not self.worker.connection.tls_started: + self.worker.connection.start_tls(read_server_info=False) + if self.worker.get_info_from_server and counter: + self.worker.connection.refresh_server_info() + self.worker.get_info_from_server = False + response = None + result = None + if message_type == 'searchRequest': + response = self.worker.connection.post_send_search(self.worker.connection.send(message_type, request, controls)) + else: + response = self.worker.connection.post_send_single_response(self.worker.connection.send(message_type, request, controls)) + result = self.worker.connection.result + with pool.pool_lock: + pool._incoming[counter] = (response, result, BaseStrategy.decode_request(message_type, request, controls)) + except LDAPOperationResult as e: # raise_exceptions has raised an exception. It must be redirected to the original connection thread + with pool.pool_lock: + pool._incoming[counter] = (e, None, None) + # pool._incoming[counter] = (type(e)(str(e)), None, None) + # except LDAPOperationResult as e: # raise_exceptions has raised an exception. It must be redirected to the original connection thread + # exc = e + # with pool.pool_lock: + # if exc: + # pool._incoming[counter] = (exc, None, None) + # else: + # pool._incoming[counter] = (response, result, BaseStrategy.decode_request(message_type, request, controls)) + + self.worker.busy = False + pool.request_queue.task_done() + self.worker.task_counter += 1 + if log_enabled(BASIC): + log(BASIC, 'thread terminated') + if self.master_connection.usage: + pool.terminated_usage += self.worker.connection.usage + self.worker.running = False + + class PooledConnectionWorker(object): + """ + Container for the restartable connection. it includes a thread and a lock to execute the connection in the pool + """ + def __init__(self, connection, request_queue): + self.master_connection = connection + self.request_queue = request_queue + self.running = False + self.busy = False + self.get_info_from_server = False + self.connection = None + self.creation_time = None + self.task_counter = 0 + self.new_connection() + self.thread = ReusableStrategy.PooledConnectionThread(self, self.master_connection) + self.worker_lock = Lock() + if log_enabled(BASIC): + log(BASIC, 'instantiated PooledConnectionWorker: <%s>', self) + + def __str__(self): + s = 'CONN: ' + str(self.connection) + linesep + ' THREAD: ' + s += 'running' if self.running else 'halted' + s += ' - ' + ('busy' if self.busy else 'available') + s += ' - ' + ('created at: ' + self.creation_time.isoformat()) + s += ' - time to live: ' + str(self.master_connection.strategy.pool.lifetime - (datetime.now() - self.creation_time).seconds) + s += ' - requests served: ' + str(self.task_counter) + + return s + + def new_connection(self): + from ..core.connection import Connection + # noinspection PyProtectedMember + self.creation_time = datetime.now() + self.connection = Connection(server=self.master_connection.server_pool if self.master_connection.server_pool else self.master_connection.server, + user=self.master_connection.user, + password=self.master_connection.password, + auto_bind=AUTO_BIND_NONE, # do not perform auto_bind because it reads again the schema + version=self.master_connection.version, + authentication=self.master_connection.authentication, + client_strategy=RESTARTABLE, + auto_referrals=self.master_connection.auto_referrals, + auto_range=self.master_connection.auto_range, + sasl_mechanism=self.master_connection.sasl_mechanism, + sasl_credentials=self.master_connection.sasl_credentials, + check_names=self.master_connection.check_names, + collect_usage=self.master_connection._usage, + read_only=self.master_connection.read_only, + raise_exceptions=self.master_connection.raise_exceptions, + lazy=False, + fast_decoder=self.master_connection.fast_decoder, + receive_timeout=self.master_connection.receive_timeout, + return_empty_attributes=self.master_connection.empty_attributes) + + # simulates auto_bind, always with read_server_info=False + if self.master_connection.auto_bind and self.master_connection.auto_bind not in [AUTO_BIND_NONE, AUTO_BIND_DEFAULT]: + if log_enabled(BASIC): + log(BASIC, 'performing automatic bind for <%s>', self.connection) + self.connection.open(read_server_info=False) + if self.master_connection.auto_bind == AUTO_BIND_NO_TLS: + self.connection.bind(read_server_info=False) + elif self.master_connection.auto_bind == AUTO_BIND_TLS_BEFORE_BIND: + self.connection.start_tls(read_server_info=False) + self.connection.bind(read_server_info=False) + elif self.master_connection.auto_bind == AUTO_BIND_TLS_AFTER_BIND: + self.connection.bind(read_server_info=False) + self.connection.start_tls(read_server_info=False) + + if self.master_connection.server_pool: + self.connection.server_pool = self.master_connection.server_pool + self.connection.server_pool.initialize(self.connection) + + # ReusableStrategy methods + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = False + self.no_real_dsa = False + self.pooled = True + self.can_stream = False + if hasattr(ldap_connection, 'pool_name') and ldap_connection.pool_name: + self.pool = ReusableStrategy.ConnectionPool(ldap_connection) + else: + if log_enabled(ERROR): + log(ERROR, 'reusable connection must have a pool_name') + raise LDAPConnectionPoolNameIsMandatoryError('reusable connection must have a pool_name') + + def open(self, reset_usage=True, read_server_info=True): + # read_server_info not used + self.pool.open_pool = True + self.pool.start_pool() + self.connection.closed = False + if self.connection.usage: + if reset_usage or not self.connection._usage.initial_connection_start_time: + self.connection._usage.start() + + def terminate(self): + self.pool.terminate_pool() + self.pool.open_pool = False + self.connection.bound = False + self.connection.closed = True + self.pool.bind_pool = False + self.pool.tls_pool = False + + def _close_socket(self): + """ + Doesn't really close the socket + """ + self.connection.closed = True + + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + def send(self, message_type, request, controls=None): + if self.pool.started: + if message_type == 'bindRequest': + self.pool.bind_pool = True + counter = BOGUS_BIND + elif message_type == 'unbindRequest': + self.pool.bind_pool = False + counter = BOGUS_UNBIND + elif message_type == 'abandonRequest': + counter = BOGUS_ABANDON + elif message_type == 'extendedReq' and self.connection.starting_tls: + self.pool.tls_pool = True + counter = BOGUS_EXTENDED + else: + with self.pool.pool_lock: + self.pool.counter += 1 + if self.pool.counter > LDAP_MAX_INT: + self.pool.counter = 1 + counter = self.pool.counter + self.pool.request_queue.put((counter, message_type, request, controls)) + return counter + if log_enabled(ERROR): + log(ERROR, 'reusable connection pool not started') + raise LDAPConnectionPoolNotStartedError('reusable connection pool not started') + + def validate_bind(self, controls): + # in case of a new connection or different credentials + if (self.connection.user != self.pool.master_connection.user or + self.connection.password != self.pool.master_connection.password or + self.connection.authentication != self.pool.master_connection.authentication or + self.connection.sasl_mechanism != self.pool.master_connection.sasl_mechanism or + self.connection.sasl_credentials != self.pool.master_connection.sasl_credentials): + self.pool.master_connection.user = self.connection.user + self.pool.master_connection.password = self.connection.password + self.pool.master_connection.authentication = self.connection.authentication + self.pool.master_connection.sasl_mechanism = self.connection.sasl_mechanism + self.pool.master_connection.sasl_credentials = self.connection.sasl_credentials + self.pool.rebind_pool() + temp_connection = self.pool.workers[0].connection + old_lazy = temp_connection.lazy + temp_connection.lazy = False + if not self.connection.server.schema or not self.connection.server.info: + result = self.pool.workers[0].connection.bind(controls=controls) + else: + result = self.pool.workers[0].connection.bind(controls=controls, read_server_info=False) + + temp_connection.unbind() + temp_connection.lazy = old_lazy + if result: + self.pool.bind_pool = True # bind pool if bind is validated + return result + + def get_response(self, counter, timeout=None, get_request=False): + sleeptime = get_config_parameter('RESPONSE_SLEEPTIME') + request=None + if timeout is None: + timeout = get_config_parameter('RESPONSE_WAITING_TIMEOUT') + if counter == BOGUS_BIND: # send a bogus bindResponse + response = list() + result = {'description': 'success', 'referrals': None, 'type': 'bindResponse', 'result': 0, 'dn': '', 'message': '', 'saslCreds': None} + elif counter == BOGUS_UNBIND: # bogus unbind response + response = None + result = None + elif counter == BOGUS_ABANDON: # abandon cannot be executed because of multiple connections + response = list() + result = {'result': 0, 'referrals': None, 'responseName': '1.3.6.1.4.1.1466.20037', 'type': 'extendedResp', 'description': 'success', 'responseValue': 'None', 'dn': '', 'message': ''} + elif counter == BOGUS_EXTENDED: # bogus startTls extended response + response = list() + result = {'result': 0, 'referrals': None, 'responseName': '1.3.6.1.4.1.1466.20037', 'type': 'extendedResp', 'description': 'success', 'responseValue': 'None', 'dn': '', 'message': ''} + self.connection.starting_tls = False + else: + response = None + result = None + while timeout >= 0: # waiting for completed message to appear in _incoming + try: + with self.connection.strategy.pool.pool_lock: + response, result, request = self.connection.strategy.pool._incoming.pop(counter) + except KeyError: + sleep(sleeptime) + timeout -= sleeptime + continue + break + + if timeout <= 0: + if log_enabled(ERROR): + log(ERROR, 'no response from worker threads in Reusable connection') + raise LDAPResponseTimeoutError('no response from worker threads in Reusable connection') + + if isinstance(response, LDAPOperationResult): + raise response # an exception has been raised with raise_exceptions + + if get_request: + return response, result, request + + return response, result + + def post_send_single_response(self, counter): + return counter + + def post_send_search(self, counter): + return counter diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeRestartable.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeRestartable.py new file mode 100644 index 0000000..3c65176 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeRestartable.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2020.07.12 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .restartable import RestartableStrategy + + +class SafeRestartableStrategy(RestartableStrategy): + def __init__(self, ldap_connection): + RestartableStrategy.__init__(self, ldap_connection) + self.thread_safe = True diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeSync.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeSync.py new file mode 100644 index 0000000..dcd2b92 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/safeSync.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2020.07.12 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .sync import SyncStrategy + + +class SafeSyncStrategy(SyncStrategy): + def __init__(self, ldap_connection): + SyncStrategy.__init__(self, ldap_connection) + self.thread_safe = True diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/sync.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/sync.py new file mode 100644 index 0000000..49224c6 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/strategy/sync.py @@ -0,0 +1,251 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket + +from .. import SEQUENCE_TYPES, get_config_parameter, DIGEST_MD5 +from ..core.exceptions import LDAPSocketReceiveError, communication_exception_factory, LDAPExceptionError, LDAPExtensionError, LDAPOperationResult, LDAPSignatureVerificationFailedError +from ..strategy.base import BaseStrategy, SESSION_TERMINATED_BY_SERVER, RESPONSE_COMPLETE, TRANSACTION_ERROR +from ..protocol.rfc4511 import LDAPMessage +from ..utils.log import log, log_enabled, ERROR, NETWORK, EXTENDED, format_ldap_message +from ..utils.asn1 import decoder, decode_message_fast +from ..protocol.sasl.digestMd5 import md5_hmac + +LDAP_MESSAGE_TEMPLATE = LDAPMessage() + + +# noinspection PyProtectedMember +class SyncStrategy(BaseStrategy): + """ + This strategy is synchronous. You send the request and get the response + Requests return a boolean value to indicate the result of the requested Operation + Connection.response will contain the whole LDAP response for the messageId requested in a dict form + Connection.request will contain the result LDAP message in a dict form + """ + + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = True + self.no_real_dsa = False + self.pooled = False + self.can_stream = False + self.socket_size = get_config_parameter('SOCKET_SIZE') + + def open(self, reset_usage=True, read_server_info=True): + BaseStrategy.open(self, reset_usage, read_server_info) + if read_server_info and not self.connection._deferred_open: + try: + self.connection.refresh_server_info() + except LDAPOperationResult: # catch errors from server if raise_exception = True + self.connection.server._dsa_info = None + self.connection.server._schema_info = None + + def _start_listen(self): + if not self.connection.listening and not self.connection.closed: + self.connection.listening = True + + def receiving(self): + """ + Receives data over the socket + Checks if the socket is closed + """ + messages = [] + receiving = True + unprocessed = b'' + data = b'' + get_more_data = True + # exc = None # not needed here GC + sasl_total_bytes_recieved = 0 + sasl_received_data = b'' # used to verify the signature + sasl_next_packet = b'' + # sasl_signature = b'' # not needed here? GC + # sasl_sec_num = b'' # used to verify the signature # not needed here, reformatted to lowercase GC + sasl_buffer_length = -1 # added, not initialized? GC + while receiving: + if get_more_data: + try: + data = self.connection.socket.recv(self.socket_size) + except (OSError, socket.error, AttributeError) as e: + self.connection.last_error = 'error receiving data: ' + str(e) + try: # try to close the connection before raising exception + self.close() + except (socket.error, LDAPExceptionError): + pass + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketReceiveError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketReceiveError, type(e)(str(e)))(self.connection.last_error) + + # If we are using DIGEST-MD5 and LDAP signing is set : verify & remove the signature from the message + if self.connection.sasl_mechanism == DIGEST_MD5 and self.connection._digest_md5_kis and not self.connection.sasl_in_progress: + data = sasl_next_packet + data + + if sasl_received_data == b'' or sasl_next_packet: + # Remove the sizeOf(encoded_message + signature + 0x0001 + secNum) from data. + sasl_buffer_length = int.from_bytes(data[0:4], "big") + data = data[4:] + sasl_next_packet = b'' + sasl_total_bytes_recieved += len(data) + sasl_received_data += data + + if sasl_total_bytes_recieved >= sasl_buffer_length: + # When the LDAP response is splitted accross multiple TCP packets, the SASL buffer length is equal to the MTU of each packet..Which is usually not equal to self.socket_size + # This means that the end of one SASL packet/beginning of one other....could be located in the middle of data + # We are using "sasl_received_data" instead of "data" & "unprocessed" for this reason + + # structure of messages when LDAP signing is enabled : sizeOf(encoded_message + signature + 0x0001 + secNum) + encoded_message + signature + 0x0001 + secNum + sasl_signature = sasl_received_data[sasl_buffer_length - 16:sasl_buffer_length - 6] + sasl_sec_num = sasl_received_data[sasl_buffer_length - 4:sasl_buffer_length] + sasl_next_packet = sasl_received_data[sasl_buffer_length:] # the last "data" variable may contain another sasl packet. We'll process it at the next iteration. + sasl_received_data = sasl_received_data[:sasl_buffer_length - 16] # remove signature + 0x0001 + secNum + the next packet if any, from sasl_received_data + + kis = self.connection._digest_md5_kis # renamed to lowercase GC + calculated_signature = bytes.fromhex(md5_hmac(kis, sasl_sec_num + sasl_received_data)[0:20]) + if sasl_signature != calculated_signature: + raise LDAPSignatureVerificationFailedError("Signature verification failed for the recieved LDAP message number " + str(int.from_bytes(sasl_sec_num, 'big')) + ". Expected signature " + calculated_signature.hex() + " but got " + sasl_signature.hex() + ".") + sasl_total_bytes_recieved = 0 + unprocessed += sasl_received_data + sasl_received_data = b'' + else: + unprocessed += data + if len(data) > 0: + length = BaseStrategy.compute_ldap_message_size(unprocessed) + if length == -1: # too few data to decode message length + get_more_data = True + continue + if len(unprocessed) < length: + get_more_data = True + else: + if log_enabled(NETWORK): + log(NETWORK, 'received %d bytes via <%s>', len(unprocessed[:length]), self.connection) + messages.append(unprocessed[:length]) + unprocessed = unprocessed[length:] + get_more_data = False + if len(unprocessed) == 0: + receiving = False + else: + receiving = False + + if log_enabled(NETWORK): + log(NETWORK, 'received %d ldap messages via <%s>', len(messages), self.connection) + return messages + + def post_send_single_response(self, message_id): + """ + Executed after an Operation Request (except Search) + Returns the result message or None + """ + responses, result = self.get_response(message_id) + self.connection.result = result + if result['type'] == 'intermediateResponse': # checks that all responses are intermediates (there should be only one) + for response in responses: + if response['type'] != 'intermediateResponse': + self.connection.last_error = 'multiple messages received error' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + + responses.append(result) + return responses + + def post_send_search(self, message_id): + """ + Executed after a search request + Returns the result message and store in connection.response the objects found + """ + responses, result = self.get_response(message_id) + self.connection.result = result + if isinstance(responses, SEQUENCE_TYPES): + self.connection.response = responses[:] # copy search result entries + return responses + + self.connection.last_error = 'error receiving response' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + + def _get_response(self, message_id, timeout): + """ + Performs the capture of LDAP response for SyncStrategy + """ + ldap_responses = [] + response_complete = False + while not response_complete: + responses = self.receiving() + if responses: + for response in responses: + if len(response) > 0: + if self.connection.usage: + self.connection._usage.update_received_message(len(response)) + if self.connection.fast_decoder: + ldap_resp = decode_message_fast(response) + dict_response = self.decode_response_fast(ldap_resp) + else: + ldap_resp, _ = decoder.decode(response, asn1Spec=LDAP_MESSAGE_TEMPLATE) # unprocessed unused because receiving() waits for the whole message + dict_response = self.decode_response(ldap_resp) + if log_enabled(EXTENDED): + log(EXTENDED, 'ldap message received via <%s>:%s', self.connection, format_ldap_message(ldap_resp, '<<')) + if int(ldap_resp['messageID']) == message_id: + ldap_responses.append(dict_response) + if dict_response['type'] not in ['searchResEntry', 'searchResRef', 'intermediateResponse']: + response_complete = True + elif int(ldap_resp['messageID']) == 0: # 0 is reserved for 'Unsolicited Notification' from server as per RFC4511 (paragraph 4.4) + if dict_response['responseName'] == '1.3.6.1.4.1.1466.20036': # Notice of Disconnection as per RFC4511 (paragraph 4.4.1) + return SESSION_TERMINATED_BY_SERVER + elif dict_response['responseName'] == '2.16.840.1.113719.1.27.103.4': # Novell LDAP transaction error unsolicited notification + return TRANSACTION_ERROR + else: + self.connection.last_error = 'unknown unsolicited notification from server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + elif int(ldap_resp['messageID']) != message_id and dict_response['type'] == 'extendedResp': + self.connection.last_error = 'multiple extended responses to a single extended request' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPExtensionError(self.connection.last_error) + # pass # ignore message with invalid messageId when receiving multiple extendedResp. This is not allowed by RFC4511 but some LDAP server do it + else: + self.connection.last_error = 'invalid messageId received' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + # response = unprocessed + # if response: # if this statement is removed unprocessed data will be processed as another message + # self.connection.last_error = 'unprocessed substrate error' + # if log_enabled(ERROR): + # log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise LDAPSocketReceiveError(self.connection.last_error) + else: + return SESSION_TERMINATED_BY_SERVER + ldap_responses.append(RESPONSE_COMPLETE) + + return ldap_responses + + def set_stream(self, value): + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d7840cda57fa57dc4774b7045d191dec85da47a GIT binary patch literal 138 zcmWgV<>k7%G&Pk02p)q77+?f49Dul(1xTbYFa&Ed`mJOr0tq9CU*`HHxdr+KnFYF; zdBr7(IXSvXDXFEECKX2dIVp(+#!#}fBr~U2KR!M)FS8^*Uaz3?7Kcr4eoARhsvXF{ IVjyM!0CHI%?*IS* literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/asn1.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/asn1.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5df64af928c0597879cbf53f4ab1a669d320ded9 GIT binary patch literal 6875 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ciDict.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ciDict.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac57c54f321fd83aa6dcd0929e8e888f98300017 GIT binary patch literal 6384 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 RBhFJ;ebI3nb&-}XPv8Im literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/conv.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/conv.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25862ddd164c0b28c4a0a7f42b4f89f8b495be29 GIT binary patch literal 6940 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ntlm.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ntlm.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa998628971a22b8c0816a0e1762a59c749119c9 GIT binary patch literal 12647 zcmcIq>u+3HQm@-DyY2S-nU~`@Gf8?faWXFR!NxU~BoJDv2y zIrnxFdnfyv;ms~9K(p+NU04AEJ}e*j1meR=`~@IDT#)#Hgb3e&ZzCb`t2*~~x7(i4 z3TfT$>T~MUc~+gOI(5#}z(C*M|DjUf&lCL{b^OgB{U*NN!x)iEWCL2{#;9shEk<^X zYH_mTWHB~Q)dba&WGAVXB0FWU399x`t(WXxlTT7LO|>-HX_HS;wU6vRX&32!viqZS zhU|=_d#E}BA338{&o+I}V*(b?8O!jl+9wGaAa*vXIiriylpC)&P>@(yZ zCp$~-EZHxRdxGq<())`tl5;#Yd!E!GQin+$A$640F;X+6j+2@tb%N9!sgtChBlSF~ zQ>0FlIzuW;>IG6~Nxeww9I1KQ!r0DBYoC#pFGw#JWsWaNzc0%eUXk&E(PioA4e96#smr9^ zAa#YdARwP77Yl;bI7J^~f^U+G)i^^Rf@uqM-Nkaez!^Ywl|Dd)MRHSA$es_&m*P1N~4~&g8nV#-)ne&y;M`kCj3fG<&o%V>Qdcp z)Q}tp$+lLTN^9k+db#0N>RY?XroVaa(lf|7fo5#8p=%}IDY*`};Q6K6w%3cYeDUT= zp>T_yS;#z#GdRwGcgeG33=T1vVlc^IoWU4_5eCByh8PSm$S~+=sAjKfbAi;op zebxtXt;~J$ALF^^BEDW9up)>8V9e zWArpmeuCZyJ+hXhg#bm2j|)Cd>kq#}2|p=2>OBut zQXgeDG7=EvfaoERkt$){%0LRQH3~I)IqY^cnpEywGWcscD3RM@k-qf(zz#Pwe3T= zG&4J!2$HVaXl~g9wbK2DcC@OhlBbZZ)Z5u0xzVgt-9I6H7L`7J>AYXtKEGYrK3Azj zl&aNp8?I{Zy!_eEbU*+XG}4zz_=+ET)K z16~A0Fln?_H$#7bGLIDnS)*1ama)e1Ic!bG2Efu;OJ77unTw-8mclpj^*#nr(4OEJ zAXp--`w(etbo?iX(^$YHuOX+A5Uy|<8!gRhn$tkS-ex4-%NiV3kntcGVk^jLSk4i) zf}95N7+XP3XGnn_Ms$+1U#V|7geUW!Rfv5w@y!&fmFtgcDGV=)P=u1UaeF$t`$Nx*wC2`sQl z%ti?;v%$I3@un$0XqA@J5a2W$#_fo(smx z!bPXtsBc!boXu)!%d^MTlkJA~mFsxeQBc6n1GN(j*VR_Tuap=sbV0i5DebVm5Benu zD_^SA?a6w>sn(#Nz3oQbQx5A@=g|dwFzjrj+9*Fzu07S6cT}YAJ^Mshpw+`>MJwmR z#Y@gc#dqK`=p8W$Yy_S-)yk$4FToxSYj~BdI(!Nqa2uye)d)A_p-D7@K{aa|O53BD z0`v!F+9qn@IvPvEB&jW3@ptS2t+uPB9miF^D*JZ3$p|5f3I7I*1#7lr_qrv&w53b6 zptmAu;EqHCZf?WmVM+axhIb^ZX&(;@%lAt4x~gLCb@r5;X8m5tyN8v7O2eQlP_TO{ z25D!zcY(IgK1S1?Fs>p2t$H70g6_7c0LuW6=s}8LhfM+N zW{a-8spr|q7MKWrlAB=D2cJnaTQYx5Jc{COrc!@|-RI6SJF;>8GCBzQuH9U??iBCb z$`$l^AhI!yGdBeZChA_PA>NK57r6XiLFw^nfEO$Qf8kJU_i)DqyT}io=M_{xXr4W! zpJ%rZlQh!_=PV`?bAFvCDs#?aj(cZkW{f$$g2we4gO17R0wdTN?r@35MAhuo=l=nc zJ@d=Nc4xZg*JT2JrgI#MIJoeRFtIhwB@8qeSa`=dn41Sqc$6o+cPIYW0rNf9HQ&88 zTGM5*<+F>3?$0B^?z|l4SY~nfJHpv5IomzC%;}}~Ugkp>93L>5rTPmj28sLd7U2TL z=*nsg?$EG>71G2?AyE!l(k;VsuKkfYG;d&lF& z(XJ=T!rJZR%YMp(`2x@LQ~C0S;ma#~`SMm5UxrrxAB@rO@)Y@aaxh=?9WFX(V~#Z8 zFzw+>ikD$8U#4QaM>_;{UzHYTc=b5CA#(bsNEog10eHr#=%9(S9*%#A0Qf!R_mZEc ztzK3`mfy$m1BkB=7aK6cC;ittQQXWx2bS~Vb3;W(v_K7!k0_x<`Xgx#uD7UdZmK>U zp^{7ywqD4lcF*?BhJP!SvTk^dO@DT!a4vsy<<{)Q`HS-x<}b7;aD-eA=-C;}v3M;z zs(%g%&DJd#6D_fpd;4~-P;`n5Yu9tdU__Al-1XJs@bA91X!6__X&+ltwHMbH>cG2I?FE6ex<$}{)_}sh2Tz)CH

s+!t!dqkXyXH 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 InauG20S+z7K>z>% literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ordDict.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/ordDict.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3230b81241e91301e2b6efaca053e94853904ab1 GIT binary patch literal 3883 zcmcIn&vRQz5$<{KNtR^UmgPjY6Yrv`C6Koedlweir9^7CHcP0Y@D?bLMU~WBMKg9} zJ^k>!r>rfK12_eosN&3-1Ah>gxpK?ogekd!X3!>*q7fF{y zN9QW(vgifUYoymnZ_sO)i#Zk2n=(`)T_wFG`YM?+ovcx7O_X(Nt&6fjtqoBs)T)TG zNv%y$s?@5AvPG>eQEpJ{25J1>ls#{fu94mry+&r6^bYA=(zn=>3mAj1w@L5G1oXc} z`fbr~@yurU4Y&Ha)y5jl$aMgZe0<1Nw9nC!BZ!pfrECbqdI8zHlnQk7{u&PZgQD|Q zdP#KRk$ODXqagLES0ejMQc7`uKo>;nw*y6A@Yft~`qHDnpc4UUhW_CjHevEjb2c)a z)aZIUt@npXT7SRZw#VbX8KlW~>&L^ien*FS=f`H?ijU4m<}+)D)@?=$-b9fZXt(}J zn%eHOaXOun>%^vQU4A^$?bL+63lb9_xd7WIF6e!wlYfw1hY?@@@F4Av4o2P4z3w1M z+i`sFnKt9|56-@K5bO5n`%^hiyK!&W$6JxAs+#iEs#;SU zYI0-2$o<*mIrbjr2WX$7B|nBZ#&@6<5xoLhlDZ6=qGO+agsv`PgJDIfM<+h(h((5{ zIt&B5f<2az>9=sW7I%8{>-M)ztCZePS zL8=U=OX^!{vc2f|!tNb5fIn;vLm}Z~ff8XKvI0V3uuoZ_q@bSo9M)If6cqRdTpIYp z5C96D)rGx*t;AJ$IrB}MIP*Pt-S?x znu;!n+es=3X}8h69M2VGEobr1Fg9h&JnAj4ZhBQ_%dJH~rgP^JomCs>W%3&0Peezc zNV%N;Nc3l-2kez%4T;K95qtv{(7%+PFNHesm67rVDM8_h%mMFW2=t1Aw5jYMq=jS9 zbL3N#H=T6}Z2sZgK#mhLBBygwhX9)c@29mXnPV+twR`N*Ur`r%YF@$7d`gif?=C{ciKfRL6Gi)tc-U#j$$coZWne?0Nx2+? z7j28nuQSB$Rg9tz0+xU{&IaTm2mo#V2ZLpku9!WCXAO%o;~*~->Xi`^Bd$Lc&o;cM z(XPdZ!+&`FHO}k!47s|`b~t4pJgpGl-a;0*wi~AvdW?c#BP54G5`HI6T!9Ip{VX<8 z{Z8qO3YJ1wII_b&M`*<66(Gnf;53&3!v}s9g zs2vrkyC|yy{!XfkNuF&wM~8D|o-a%ynXx^O%9nx4UVru@3@@GRVB`Rq{Chr}_d!i9 z9mm7rZTlX^m;w4jJ&w`kaM7KP+wrs#m}@`wk0!ZP^1Be2^>Q z;ik<|dmN{hc|fidmzQ^2A~0r|#W@4Okz?5qCGEA8Pvp?q*DF zgT-YgiYAD2)b`MleTcGGE|&A<6=^FQrE;n47xCIy`0>iQvhS;EzFd-s1Wgd7hy$uXg=-INr9vdM+U`1y$;P|29cV&& zD(}FtCk{MC4?F{xl{j(Y6}XfcCsBjA)`};yGxq#`<6HH5?Z;OkY#HDe%&ijg&vBc( zND_cHQU*y0J|mBe2Z`_a5+r2^8kNxw53;`CU6JNO^UgrUR%XiZPNw;XD3wV>-#qK^ zJk!?jNF_X#2DzE2$zz7zXwkoqdk44KL}CHPNEw`#K;L&fdUg?^q*n#qqM!ohQ((a~ zrY_&rpcRI}h1M8jUlQVb=P$7U$QA0R&fOTc!mT-Z;eum;q;U&XWrZ&_dO`H5hl1PGjl%_*I zcLC8Or0oh_6XENm~wm>Ru6!a=<7aOBu5-foVERV_OZwB#Xn)#pI-O?r37Q^SSV>pCyA-Y*UF1WmoZ* GYJUNawucn} literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/repr.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/repr.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f279a74daf646da92ad24ed86a8a1313afce274b GIT binary patch literal 786 zcmZ8f!EVz)5Pf6Ej^j2Eg^D7X1gG*N zAVA`Sxa^fve}NOTPFq#1v~N9c_szWV?sm5u|NbH6_YnAlYh#1IpYYTl83Zt6BnS@$ zVc}usfrJmyLg8c4!mI_V2hEWHMSw+!SqPFLj@y_;kP-A4g4qZMRLL;a1nqQ=a-Kg8@D<63#s6yD**$&j_EH^k96PL{M)~Z#n+B1rxZ&`0(W5 z{Wr8s*jS%B>!y97olJS_upFV@xu)_OA<=QvB)JSH2j#u1JYWCI)BFZ->;BmG=4p1K zi&P&eSrus}Z77vmDn01fIM;cpOBYOwNW;h*G6hSR%S~fZI^W_X@b0bXZx?q z-0{z(!;wp+e5VaX!|+cGKBUD;{(|Z=|95X_7S*uItKFtnQS8ozT-6Ux9}EkTR(lt? zGI^nguGamkwtcfq)>m;=d54qf+YF$awCQb`pXg^ezIQa4=K8J%XbGWoJ>QZ?qU!L3H}Xt5NlLOyoSN4tvQcF*gv Og&uV%q?nCt`2PS@$FzX} literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/tls_backport.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/tls_backport.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36ee5c6f1e15980a7b8a015fdb8d11a7c02730a4 GIT binary patch literal 2845 zcmb7GTXP&o6+S()H?3Be#1*S-T)0Va@Cs>FwnK0wTx=vIr6R11WFjIgrbaWp(yZp@ z?p~tZl3sA2iU(fEZ%9%6399%F6fgb415f@36i`pYC(MK1*|R z&3}9)#QnF3{zX^5S@a*FsXu|lMEjtOVvkZr`{?)-S19!;^J(9wtU~)0%Br+qB{sb2 zSgVxQD67+cow5e)H;C=!>r@dlbkZdGM`Db99M>qW(-+WPC()!AP}ZOr{~3y#^aV`K zQjCAg@<7pNIip`<6T9s>!QDgVgq0LGXMKrsI{rkZgh5k^g+Srn7RbOv=?HS2|47)x%f}hVPx;UrXb# zd@!K{ouq0_rz$uMqm#0bx>F9F(c5-Y*54L$9^^uMjHpW=)CbNdt<8S z`M21f)jdZs{`1tIw~Vl`6fe+{U0EP#JD;Jm8R{>(L$%?tIQsKXCf6on-jhYfpA7YJ zk@E+g_c{+aE-_zD_rJHom56i# zJ?~pRmtx0SmmjRH>7qzgClR{WDdf@GvCh&p*^8{`I}^#(vE$$5~jVauZxnBiHN55b(q5&Td*$$4~{PJE-g%Wd#~z(>_z{kn7T z-BIN!9to-;g$DWzCWbh^eYFO|+>-#UR%%%uPj#QkrU7d@iJ^ zg=H!7*fepHQY*V@<4Iv^LPcRIOdZT=7@-ptS(&85RQg4do95QX-R+&t^~bxLrs_Oz zH;otPrZIKd%w^$eaN(G#l%ZCpRwg16$~02Z(-{!N%t(=iNgiV}Ggr8KGCVRqWG+)) z&RLJRp?3!O=*Q+gmk$tmz!++bKV>i8b znY;^$$XXYV@eH+Pc^Y~4h^2l*SDYDMyx976XA$JcMiFozt^pTC^jf02u4C4w- zGTe7bc+VmQvdLlua`KtQfL)|FkYSu-?D;*~!-V=fogPfJS81$$<6w&b5Y~cCuh%Tp zoP{r6weZ)kvG67BJ^wxJX@HQ+R|^n;mqj*)7wio$M88J5P8#_O9>>=6==#|8{6l(0 z7@qvt2{)}{5WuT);|hDr0at5saMtDaTsXj~{$HuwxlGDWg-m)wu8%{_mu+?|^Sj8C zSVTo^VWE%+1s*Ccg&xQpQ-{L~AlTjgWVeV;gzg*(T?!$sg1hZD5)TL=6x0g7JdN7r z4tF4N|KYud9N2P!7#I2^9wx;@DPT9XNffW}!-3{oPk0!|QYbZ9&I{}*ibSc$d%SAo z(zn;&PM*MxFj0^JI`zUN9Z1pP+c{SQC{t?1ZMZkc9e!PI%ek&NtXkOXTr7;V$Vxrr zg~ZxbY*`tfz{NYxb0GjgA;*bv<&Mk>*-=#FTAb=JrU_t#kbHe}=V`G032am#9+|_ijKS$KDzb4dGAPvv7;ZtS3sLAN|~T6fd^A_cB`-MjrS6f!gJuEz0^S- zw`WZA(=Z*3%NgS%avWetRCa{oNaPMm{JHY;d7K09RuIQ_A=%%#D8{ zhNk)(s}vK1!`EOaSzR-(^68+4b1%W=!?1sAS_!F+Qfc7w;35i~vhhPPyOr5`$(3|+6*|Xf la8ZJdU2ve>_`$eh`;kRdSLxN3TI`nRvzu&=U9T*B|G$4w#xMW? literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/uri.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/__pycache__/uri.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b130fb512f0e7a997667052d45cd6a5cb01c3f55 GIT binary patch literal 1477 zcmZWo&u?2r5T1EI?H4Tsh{%?8Z)lSb0bD=9_P3zVUlk>-FT1pE&>ZGQeMO z;mnc$HC;6%!vHz}hl{`vm zaPMxrWx}1-i`LEnZ8n_>-H`5my6Q1eG{9ScBLs~wAs=Divl7TT@?b)~2aSCi&bOf- zd^n@q^ z95zQ-2J?D@bZI zjqa*7NKoL@e^)FZTL5x$4?L{N6FO~pMs9J>U=0OXHoH*^Ua=bl~PWt(D! zozC(;Y@ZVs9r3LrE<)oxYl-Ah;U#F$mh5_dL4CS3Lh^6i&=$Pnz~4|;rlIZp<1_H8 z1OG-{Jp<=wp#0}l*O`W8H_E(cH7s8orEziK6_@p;%UYp#;s5$RaFe$;K74bKq;wwe zLBV*s^Wg5&^!e_iw5L*4@`2bBoTVa9cOTwQZ+>?D^HlPzcOdeYGkDO`qR5piQgS&G zT3d8IW4%(XyE=nce8kheLZ(V(n-*}{C-{}LAHW;`cC%>$8#ke&Jvl)N^m~dwduV(j zo#1T~yegD7L0L#GNIeJugk$@WoZu%W>1i!Rf2_HZ0mV$H21UtBIn1xjYfMS z(_9|Al!PB>o+~^4h9|3p%Y@8EVge=xS~^Ck%1mfeEqm10N;R=iOuVF+FLE*&&t+t} z_8XP4El@H3Sc=X(neLz%mDE1h%7nItGLdo%q0xBRi6kHO1QqQuCb?1uyFY_mqbesi zntD_=OHpo$T. + +from pyasn1 import __version__ as pyasn1_version +from pyasn1.codec.ber import decoder # for usage in other modules +from pyasn1.codec.ber.encoder import Encoder # for monkeypatching of boolean value +from ..core.results import RESULT_CODES +from ..utils.conv import to_unicode +from ..protocol.convert import referrals_to_list + +CLASSES = {(False, False): 0, # Universal + (False, True): 1, # Application + (True, False): 2, # Context + (True, True): 3} # Private + + +# Monkeypatching of pyasn1 for encoding Boolean with the value 0xFF for TRUE +# THIS IS NOT PART OF THE FAST BER DECODER +if pyasn1_version == 'xxx0.2.3': + from pyasn1.codec.ber.encoder import tagMap, BooleanEncoder, encode + from pyasn1.type.univ import Boolean + from pyasn1.compat.octets import ints2octs + class BooleanCEREncoder(BooleanEncoder): + _true = ints2octs((255,)) + + tagMap[Boolean.tagSet] = BooleanCEREncoder() +else: + from pyasn1.codec.ber.encoder import tagMap, typeMap, AbstractItemEncoder + from pyasn1.type.univ import Boolean + from copy import deepcopy + + class LDAPBooleanEncoder(AbstractItemEncoder): + supportIndefLenMode = False + if pyasn1_version <= '0.2.3': + from pyasn1.compat.octets import ints2octs + _true = ints2octs((255,)) + _false = ints2octs((0,)) + def encodeValue(self, encodeFun, value, defMode, maxChunkSize): + return value and self._true or self._false, 0 + elif pyasn1_version <= '0.3.1': + def encodeValue(self, encodeFun, value, defMode, maxChunkSize): + return value and (255,) or (0,), False, False + elif pyasn1_version <= '0.3.4': + def encodeValue(self, encodeFun, value, defMode, maxChunkSize, ifNotEmpty=False): + return value and (255,) or (0,), False, False + elif pyasn1_version <= '0.3.7': + def encodeValue(self, value, encodeFun, **options): + return value and (255,) or (0,), False, False + else: + def encodeValue(self, value, asn1Spec, encodeFun, **options): + return value and (255,) or (0,), False, False + + customTagMap = deepcopy(tagMap) + customTypeMap = deepcopy(typeMap) + customTagMap[Boolean.tagSet] = LDAPBooleanEncoder() + customTypeMap[Boolean.typeId] = LDAPBooleanEncoder() + + encode = Encoder(customTagMap, customTypeMap) +# end of monkey patching + +# a fast BER decoder for LDAP responses only +def compute_ber_size(data): + """ + Compute size according to BER definite length rules + Returns size of value and value offset + """ + + if data[1] <= 127: # BER definite length - short form. Highest bit of byte 1 is 0, message length is in the last 7 bits - Value can be up to 127 bytes long + return data[1], 2 + else: # BER definite length - long form. Highest bit of byte 1 is 1, last 7 bits counts the number of following octets containing the value length + bytes_length = data[1] - 128 + value_length = 0 + cont = bytes_length + for byte in data[2: 2 + bytes_length]: + cont -= 1 + value_length += byte * (256 ** cont) + return value_length, bytes_length + 2 + + +def decode_message_fast(message): + ber_len, ber_value_offset = compute_ber_size(get_bytes(message[:10])) # get start of sequence, at maximum 3 bytes for length + decoded = decode_sequence(message, ber_value_offset, ber_len + ber_value_offset, LDAP_MESSAGE_CONTEXT) + return { + 'messageID': decoded[0][3], + 'protocolOp': decoded[1][2], + 'payload': decoded[1][3], + 'controls': decoded[2][3] if len(decoded) == 3 else None + } + + +def decode_sequence(message, start, stop, context_decoders=None): + decoded = [] + while start < stop: + octet = get_byte(message[start]) + ber_class = CLASSES[(bool(octet & 0b10000000), bool(octet & 0b01000000))] + ber_constructed = bool(octet & 0b00100000) + ber_type = octet & 0b00011111 + ber_decoder = DECODERS[(ber_class, octet & 0b00011111)] if ber_class < 2 else None + ber_len, ber_value_offset = compute_ber_size(get_bytes(message[start: start + 10])) + start += ber_value_offset + if ber_decoder: + value = ber_decoder(message, start, start + ber_len, context_decoders) # call value decode function + else: + # try: + value = context_decoders[ber_type](message, start, start + ber_len) # call value decode function for context class + # except KeyError: + # if ber_type == 3: # Referral in result + # value = decode_sequence(message, start, start + ber_len) + # else: + # raise # re-raise, should never happen + decoded.append((ber_class, ber_constructed, ber_type, value)) + start += ber_len + + return decoded + + +def decode_integer(message, start, stop, context_decoders=None): + first = message[start] + value = -1 if get_byte(first) & 0x80 else 0 + for octet in message[start: stop]: + value = value << 8 | get_byte(octet) + + return value + + +def decode_octet_string(message, start, stop, context_decoders=None): + return message[start: stop] + + +def decode_boolean(message, start, stop, context_decoders=None): + return False if message[start: stop] == 0 else True + + +def decode_bind_response(message, start, stop, context_decoders=None): + return decode_sequence(message, start, stop, BIND_RESPONSE_CONTEXT) + + +def decode_extended_response(message, start, stop, context_decoders=None): + return decode_sequence(message, start, stop, EXTENDED_RESPONSE_CONTEXT) + + +def decode_intermediate_response(message, start, stop, context_decoders=None): + return decode_sequence(message, start, stop, INTERMEDIATE_RESPONSE_CONTEXT) + + +def decode_controls(message, start, stop, context_decoders=None): + return decode_sequence(message, start, stop, CONTROLS_CONTEXT) + + +def ldap_result_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['dn'] = to_unicode(response[1][3], from_server=True) # matchedDN + response_dict['message'] = to_unicode(response[2][3], from_server=True) # diagnosticMessage + if len(response) == 4: + response_dict['referrals'] = referrals_to_list([to_unicode(referral[3], from_server=True) for referral in response[3][3]]) # referrals + else: + response_dict['referrals'] = None + + return response_dict + + +###### + +if str is not bytes: # Python 3 + def get_byte(x): + return x + + def get_bytes(x): + return x +else: # Python 2 + def get_byte(x): + return ord(x) + + def get_bytes(x): + return bytearray(x) + +DECODERS = { + # Universal + (0, 1): decode_boolean, # Boolean + (0, 2): decode_integer, # Integer + (0, 4): decode_octet_string, # Octet String + (0, 10): decode_integer, # Enumerated + (0, 16): decode_sequence, # Sequence + (0, 17): decode_sequence, # Set + # Application + (1, 1): decode_bind_response, # Bind response + (1, 4): decode_sequence, # Search result entry + (1, 5): decode_sequence, # Search result done + (1, 7): decode_sequence, # Modify response + (1, 9): decode_sequence, # Add response + (1, 11): decode_sequence, # Delete response + (1, 13): decode_sequence, # ModifyDN response + (1, 15): decode_sequence, # Compare response + (1, 19): decode_sequence, # Search result reference + (1, 24): decode_extended_response, # Extended response + (1, 25): decode_intermediate_response, # intermediate response + (2, 3): decode_octet_string # +} + +BIND_RESPONSE_CONTEXT = { + 7: decode_octet_string # SaslCredentials +} + +EXTENDED_RESPONSE_CONTEXT = { + 10: decode_octet_string, # ResponseName + 11: decode_octet_string # Response Value +} + +INTERMEDIATE_RESPONSE_CONTEXT = { + 0: decode_octet_string, # IntermediateResponseName + 1: decode_octet_string # IntermediateResponseValue +} + +LDAP_MESSAGE_CONTEXT = { + 0: decode_controls, # Controls + 3: decode_sequence # Referral +} + +CONTROLS_CONTEXT = { + 0: decode_sequence # Control +} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ciDict.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ciDict.py new file mode 100644 index 0000000..c51d7ff --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ciDict.py @@ -0,0 +1,199 @@ +""" +""" + +# Created on 2014.08.23 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from collections.abc import MutableMapping, Mapping +except ImportError: + from collections import MutableMapping, Mapping + +from .. import SEQUENCE_TYPES + + +class CaseInsensitiveDict(MutableMapping): + def __init__(self, other=None, **kwargs): + self._store = dict() # store use the original key + self._case_insensitive_keymap = dict() # is a mapping ci_key -> key + if other or kwargs: + if other is None: + other = dict() + self.update(other, **kwargs) + + def __contains__(self, item): + try: + self.__getitem__(item) + return True + except KeyError: + return False + + @staticmethod + def _ci_key(key): + return key.strip().lower() if hasattr(key, 'lower') else key + + def __delitem__(self, key): + ci_key = self._ci_key(key) + del self._store[self._case_insensitive_keymap[ci_key]] + del self._case_insensitive_keymap[ci_key] + + def __setitem__(self, key, item): + ci_key = self._ci_key(key) + if ci_key in self._case_insensitive_keymap: # updates existing value + self._store[self._case_insensitive_keymap[ci_key]] = item + else: # new key + self._store[key] = item + self._case_insensitive_keymap[ci_key] = key + + def __getitem__(self, key): + return self._store[self._case_insensitive_keymap[self._ci_key(key)]] + + def __iter__(self): + return self._store.__iter__() + + def __len__(self): # if len is 0 then the cidict appears as False in IF statement + return len(self._store) + + def __repr__(self): + return repr(self._store) + + def __str__(self): + return str(self._store) + + def keys(self): + return self._store.keys() + + def values(self): + return self._store.values() + + def items(self): + return self._store.items() + + def __eq__(self, other): + if not isinstance(other, (Mapping, dict)): + return NotImplemented + + if isinstance(other, CaseInsensitiveDict): + if len(self.items()) != len(other.items()): + return False + else: + for key, value in self.items(): + if not (key in other and other[key] == value): + return False + return True + + return self == CaseInsensitiveDict(other) + + def copy(self): + return CaseInsensitiveDict(self._store) + + +class CaseInsensitiveWithAliasDict(CaseInsensitiveDict): + def __init__(self, other=None, **kwargs): + self._aliases = dict() + self._alias_keymap = dict() # is a mapping key -> [alias1, alias2, ...] + CaseInsensitiveDict.__init__(self, other, **kwargs) + + def aliases(self): + return self._aliases.keys() + + def __setitem__(self, key, value): + if isinstance(key, SEQUENCE_TYPES): + ci_key = self._ci_key(key[0]) + if ci_key not in self._aliases: + CaseInsensitiveDict.__setitem__(self, key[0], value) + self.set_alias(ci_key, key[1:]) + else: + raise KeyError('\'' + str(key[0] + ' already used as alias')) + else: + ci_key = self._ci_key(key) + if ci_key not in self._aliases: + CaseInsensitiveDict.__setitem__(self, key, value) + else: + self[self._aliases[ci_key]] = value + + def __delitem__(self, key): + ci_key = self._ci_key(key) + try: + CaseInsensitiveDict.__delitem__(self, ci_key) + if ci_key in self._alias_keymap: + for alias in self._alias_keymap[ci_key][:]: # removes aliases, uses a copy of _alias_keymap because iterator gets confused when aliases are removed from _alias_keymap + self.remove_alias(alias) + return + except KeyError: # try to remove alias + if ci_key in self._aliases: + self.remove_alias(ci_key) + + def set_alias(self, key, alias, ignore_duplicates=False): + if not isinstance(alias, SEQUENCE_TYPES): + alias = [alias] + for alias_to_add in alias: + ci_key = self._ci_key(key) + if ci_key in self._case_insensitive_keymap: + ci_alias = self._ci_key(alias_to_add) + if ci_alias not in self._case_insensitive_keymap: # checks if alias is used a key + if ci_alias not in self._aliases: # checks if alias is used as another alias + self._aliases[ci_alias] = ci_key + if ci_key in self._alias_keymap: # extends alias keymap + self._alias_keymap[ci_key].append(self._ci_key(ci_alias)) + else: + self._alias_keymap[ci_key] = list() + self._alias_keymap[ci_key].append(self._ci_key(ci_alias)) + else: + if ci_key in self._alias_keymap and ci_alias in self._alias_keymap[ci_key]: # passes if alias is already defined to the same key + pass + elif not ignore_duplicates: + raise KeyError('\'' + str(alias_to_add) + '\' already used as alias') + else: + if ci_key == self._ci_key(self._case_insensitive_keymap[ci_alias]): # passes if alias is already defined to the same key + pass + elif not ignore_duplicates: + raise KeyError('\'' + str(alias_to_add) + '\' already used as key') + else: + for keymap in self._alias_keymap: + if ci_key in self._alias_keymap[keymap]: # kye is already aliased + self.set_alias(keymap, alias + [ci_key], ignore_duplicates=ignore_duplicates) + break + else: + raise KeyError('\'' + str(ci_key) + '\' is not an existing alias or key') + + def remove_alias(self, alias): + if not isinstance(alias, SEQUENCE_TYPES): + alias = [alias] + for alias_to_remove in alias: + ci_alias = self._ci_key(alias_to_remove) + self._alias_keymap[self._aliases[ci_alias]].remove(ci_alias) + if not self._alias_keymap[self._aliases[ci_alias]]: # remove keymap if empty + del self._alias_keymap[self._aliases[ci_alias]] + del self._aliases[ci_alias] + + def __getitem__(self, key): + try: + return CaseInsensitiveDict.__getitem__(self, key) + except KeyError: + return CaseInsensitiveDict.__getitem__(self, self._aliases[self._ci_key(key)]) + + def copy(self): + new = CaseInsensitiveWithAliasDict(self._store) + new._aliases = self._aliases.copy() + new._alias_keymap = self._alias_keymap + return new diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/config.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/config.py new file mode 100644 index 0000000..8a356b7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/config.py @@ -0,0 +1,299 @@ +""" +""" + +# Created on 2016.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from sys import stdin, getdefaultencoding + +from .. import ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES, SEQUENCE_TYPES +from ..core.exceptions import LDAPConfigurationParameterError + +# checks +_CLASSES_EXCLUDED_FROM_CHECK = ['subschema'] +_ATTRIBUTES_EXCLUDED_FROM_CHECK = [ALL_ATTRIBUTES, + ALL_OPERATIONAL_ATTRIBUTES, + NO_ATTRIBUTES, + 'ldapSyntaxes', + 'matchingRules', + 'matchingRuleUse', + 'dITContentRules', + 'dITStructureRules', + 'nameForms', + 'altServer', + 'namingContexts', + 'supportedControl', + 'supportedExtension', + 'supportedFeatures', + 'supportedCapabilities', + 'supportedLdapVersion', + 'supportedSASLMechanisms', + 'vendorName', + 'vendorVersion', + 'subschemaSubentry', + 'ACL'] +_UTF8_ENCODED_SYNTAXES = ['1.2.840.113556.1.4.904', # DN String [MICROSOFT] + '1.2.840.113556.1.4.1362', # String (Case) [MICROSOFT] + '1.3.6.1.4.1.1466.115.121.1.12', # DN String [RFC4517] + '1.3.6.1.4.1.1466.115.121.1.15', # Directory String [RFC4517] + '1.3.6.1.4.1.1466.115.121.1.41', # Postal Address) [RFC4517] + '1.3.6.1.4.1.1466.115.121.1.58', # Substring Assertion [RFC4517] + '2.16.840.1.113719.1.1.5.1.6', # Case Ignore List [NOVELL] + '2.16.840.1.113719.1.1.5.1.14', # Tagged String [NOVELL] + '2.16.840.1.113719.1.1.5.1.15', # Tagged Name and String [NOVELL] + '2.16.840.1.113719.1.1.5.1.23', # Tagged Name [NOVELL] + '2.16.840.1.113719.1.1.5.1.25'] # Typed Name [NOVELL] + +_UTF8_ENCODED_TYPES = [] + +_ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF = ['msds-memberOfTransitive', 'msds-memberTransitive', 'entryDN'] +_IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF = ['instanceType', 'nTSecurityDescriptor', 'objectCategory'] + +_CASE_INSENSITIVE_ATTRIBUTE_NAMES = True +_CASE_INSENSITIVE_SCHEMA_NAMES = True + +# abstraction layer +_ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX = 'OA_' + +# communication +_POOLING_LOOP_TIMEOUT = 10 # number of seconds to wait before restarting a cycle to find an active server in the pool +_RESPONSE_SLEEPTIME = 0.05 # seconds to wait while waiting for a response in asynchronous strategies +_RESPONSE_WAITING_TIMEOUT = 20 # waiting timeout for receiving a response in asynchronous strategies +_SOCKET_SIZE = 4096 # socket byte size +_CHECK_AVAILABILITY_TIMEOUT = 2.5 # default timeout for socket connect when checking availability +_RESET_AVAILABILITY_TIMEOUT = 5 # default timeout for resetting the availability status when checking candidate addresses +_RESTARTABLE_SLEEPTIME = 2 # time to wait in a restartable strategy before retrying the request +_RESTARTABLE_TRIES = 30 # number of times to retry in a restartable strategy before giving up. Set to True for unlimited retries +_REUSABLE_THREADED_POOL_SIZE = 5 +_REUSABLE_THREADED_LIFETIME = 3600 # 1 hour +_DEFAULT_THREADED_POOL_NAME = 'REUSABLE_DEFAULT_POOL' +_ADDRESS_INFO_REFRESH_TIME = 300 # seconds to wait before refreshing address info from dns +_ADDITIONAL_SERVER_ENCODINGS = ['latin-1', 'koi8-r'] # some broken LDAP implementation may have different encoding than those expected by RFCs +_ADDITIONAL_CLIENT_ENCODINGS = ['utf-8'] +_IGNORE_MALFORMED_SCHEMA = False # some flaky LDAP servers returns malformed schema. If True no expection is raised and schema is thrown away +_DEFAULT_SERVER_ENCODING = 'utf-8' # should always be utf-8 +_LDIF_LINE_LENGTH = 78 # as stated in RFC 2849 + +if stdin and hasattr(stdin, 'encoding') and stdin.encoding: + _DEFAULT_CLIENT_ENCODING = stdin.encoding +elif getdefaultencoding(): + _DEFAULT_CLIENT_ENCODING = getdefaultencoding() +else: + _DEFAULT_CLIENT_ENCODING = 'utf-8' + +PARAMETERS = ['CASE_INSENSITIVE_ATTRIBUTE_NAMES', + 'CASE_INSENSITIVE_SCHEMA_NAMES', + 'ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX', + 'POOLING_LOOP_TIMEOUT', + 'RESPONSE_SLEEPTIME', + 'RESPONSE_WAITING_TIMEOUT', + 'SOCKET_SIZE', + 'CHECK_AVAILABILITY_TIMEOUT', + 'RESTARTABLE_SLEEPTIME', + 'RESTARTABLE_TRIES', + 'REUSABLE_THREADED_POOL_SIZE', + 'REUSABLE_THREADED_LIFETIME', + 'DEFAULT_THREADED_POOL_NAME', + 'ADDRESS_INFO_REFRESH_TIME', + 'RESET_AVAILABILITY_TIMEOUT', + 'DEFAULT_CLIENT_ENCODING', + 'DEFAULT_SERVER_ENCODING', + 'CLASSES_EXCLUDED_FROM_CHECK', + 'ATTRIBUTES_EXCLUDED_FROM_CHECK', + 'UTF8_ENCODED_SYNTAXES', + 'UTF8_ENCODED_TYPES', + 'ADDITIONAL_SERVER_ENCODINGS', + 'ADDITIONAL_CLIENT_ENCODINGS', + 'IGNORE_MALFORMED_SCHEMA', + 'ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF', + 'IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF', + 'LDIF_LINE_LENGTH' + ] + + +def get_config_parameter(parameter): + if parameter == 'CASE_INSENSITIVE_ATTRIBUTE_NAMES': # Boolean + return _CASE_INSENSITIVE_ATTRIBUTE_NAMES + elif parameter == 'CASE_INSENSITIVE_SCHEMA_NAMES': # Boolean + return _CASE_INSENSITIVE_SCHEMA_NAMES + elif parameter == 'ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX': # String + return _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX + elif parameter == 'POOLING_LOOP_TIMEOUT': # Integer + return _POOLING_LOOP_TIMEOUT + elif parameter == 'RESPONSE_SLEEPTIME': # Integer + return _RESPONSE_SLEEPTIME + elif parameter == 'RESPONSE_WAITING_TIMEOUT': # Integer + return _RESPONSE_WAITING_TIMEOUT + elif parameter == 'SOCKET_SIZE': # Integer + return _SOCKET_SIZE + elif parameter == 'CHECK_AVAILABILITY_TIMEOUT': # Integer + return _CHECK_AVAILABILITY_TIMEOUT + elif parameter == 'RESTARTABLE_SLEEPTIME': # Integer + return _RESTARTABLE_SLEEPTIME + elif parameter == 'RESTARTABLE_TRIES': # Integer + return _RESTARTABLE_TRIES + elif parameter == 'REUSABLE_THREADED_POOL_SIZE': # Integer + return _REUSABLE_THREADED_POOL_SIZE + elif parameter == 'REUSABLE_THREADED_LIFETIME': # Integer + return _REUSABLE_THREADED_LIFETIME + elif parameter == 'DEFAULT_THREADED_POOL_NAME': # String + return _DEFAULT_THREADED_POOL_NAME + elif parameter == 'ADDRESS_INFO_REFRESH_TIME': # Integer + return _ADDRESS_INFO_REFRESH_TIME + elif parameter == 'RESET_AVAILABILITY_TIMEOUT': # Integer + return _RESET_AVAILABILITY_TIMEOUT + elif parameter in ['DEFAULT_CLIENT_ENCODING', 'DEFAULT_ENCODING']: # String - DEFAULT_ENCODING for backward compatibility + return _DEFAULT_CLIENT_ENCODING + elif parameter == 'DEFAULT_SERVER_ENCODING': # String + return _DEFAULT_SERVER_ENCODING + elif parameter == 'CLASSES_EXCLUDED_FROM_CHECK': # Sequence + if isinstance(_CLASSES_EXCLUDED_FROM_CHECK, SEQUENCE_TYPES): + return _CLASSES_EXCLUDED_FROM_CHECK + else: + return [_CLASSES_EXCLUDED_FROM_CHECK] + elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_CHECK': # Sequence + if isinstance(_ATTRIBUTES_EXCLUDED_FROM_CHECK, SEQUENCE_TYPES): + return _ATTRIBUTES_EXCLUDED_FROM_CHECK + else: + return [_ATTRIBUTES_EXCLUDED_FROM_CHECK] + elif parameter == 'UTF8_ENCODED_SYNTAXES': # Sequence + if isinstance(_UTF8_ENCODED_SYNTAXES, SEQUENCE_TYPES): + return _UTF8_ENCODED_SYNTAXES + else: + return [_UTF8_ENCODED_SYNTAXES] + elif parameter == 'UTF8_ENCODED_TYPES': # Sequence + if isinstance(_UTF8_ENCODED_TYPES, SEQUENCE_TYPES): + return _UTF8_ENCODED_TYPES + else: + return [_UTF8_ENCODED_TYPES] + elif parameter in ['ADDITIONAL_SERVER_ENCODINGS', 'ADDITIONAL_ENCODINGS']: # Sequence - ADDITIONAL_ENCODINGS for backward compatibility + if isinstance(_ADDITIONAL_SERVER_ENCODINGS, SEQUENCE_TYPES): + return _ADDITIONAL_SERVER_ENCODINGS + else: + return [_ADDITIONAL_SERVER_ENCODINGS] + elif parameter in ['ADDITIONAL_CLIENT_ENCODINGS']: # Sequence + if isinstance(_ADDITIONAL_CLIENT_ENCODINGS, SEQUENCE_TYPES): + return _ADDITIONAL_CLIENT_ENCODINGS + else: + return [_ADDITIONAL_CLIENT_ENCODINGS] + elif parameter == 'IGNORE_MALFORMED_SCHEMA': # Boolean + return _IGNORE_MALFORMED_SCHEMA + elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF': # Sequence + if isinstance(_ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF, SEQUENCE_TYPES): + return _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF + else: + return [_ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF] + elif parameter == 'IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF': # Sequence + if isinstance(_IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF, SEQUENCE_TYPES): + return _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF + else: + return [_IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF] + elif parameter == 'LDIF_LINE_LENGTH': # Integer + return _LDIF_LINE_LENGTH + + raise LDAPConfigurationParameterError('configuration parameter %s not valid' % parameter) + + +def set_config_parameter(parameter, value): + if parameter == 'CASE_INSENSITIVE_ATTRIBUTE_NAMES': + global _CASE_INSENSITIVE_ATTRIBUTE_NAMES + _CASE_INSENSITIVE_ATTRIBUTE_NAMES = value + elif parameter == 'CASE_INSENSITIVE_SCHEMA_NAMES': + global _CASE_INSENSITIVE_SCHEMA_NAMES + _CASE_INSENSITIVE_SCHEMA_NAMES = value + elif parameter == 'ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX': + global _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX + _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX = value + elif parameter == 'POOLING_LOOP_TIMEOUT': + global _POOLING_LOOP_TIMEOUT + _POOLING_LOOP_TIMEOUT = value + elif parameter == 'RESPONSE_SLEEPTIME': + global _RESPONSE_SLEEPTIME + _RESPONSE_SLEEPTIME = value + elif parameter == 'RESPONSE_WAITING_TIMEOUT': + global _RESPONSE_WAITING_TIMEOUT + _RESPONSE_WAITING_TIMEOUT = value + elif parameter == 'SOCKET_SIZE': + global _SOCKET_SIZE + _SOCKET_SIZE = value + elif parameter == 'CHECK_AVAILABILITY_TIMEOUT': + global _CHECK_AVAILABILITY_TIMEOUT + _CHECK_AVAILABILITY_TIMEOUT = value + elif parameter == 'RESTARTABLE_SLEEPTIME': + global _RESTARTABLE_SLEEPTIME + _RESTARTABLE_SLEEPTIME = value + elif parameter == 'RESTARTABLE_TRIES': + global _RESTARTABLE_TRIES + _RESTARTABLE_TRIES = value + elif parameter == 'REUSABLE_THREADED_POOL_SIZE': + global _REUSABLE_THREADED_POOL_SIZE + _REUSABLE_THREADED_POOL_SIZE = value + elif parameter == 'REUSABLE_THREADED_LIFETIME': + global _REUSABLE_THREADED_LIFETIME + _REUSABLE_THREADED_LIFETIME = value + elif parameter == 'DEFAULT_THREADED_POOL_NAME': + global _DEFAULT_THREADED_POOL_NAME + _DEFAULT_THREADED_POOL_NAME = value + elif parameter == 'ADDRESS_INFO_REFRESH_TIME': + global _ADDRESS_INFO_REFRESH_TIME + _ADDRESS_INFO_REFRESH_TIME = value + elif parameter == 'RESET_AVAILABILITY_TIMEOUT': + global _RESET_AVAILABILITY_TIMEOUT + _RESET_AVAILABILITY_TIMEOUT = value + elif parameter in ['DEFAULT_CLIENT_ENCODING', 'DEFAULT_ENCODING']: + global _DEFAULT_CLIENT_ENCODING + _DEFAULT_CLIENT_ENCODING = value + elif parameter == 'DEFAULT_SERVER_ENCODING': + global _DEFAULT_SERVER_ENCODING + _DEFAULT_SERVER_ENCODING = value + elif parameter == 'CLASSES_EXCLUDED_FROM_CHECK': + global _CLASSES_EXCLUDED_FROM_CHECK + _CLASSES_EXCLUDED_FROM_CHECK = value + elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_CHECK': + global _ATTRIBUTES_EXCLUDED_FROM_CHECK + _ATTRIBUTES_EXCLUDED_FROM_CHECK = value + elif parameter == 'UTF8_ENCODED_SYNTAXES': + global _UTF8_ENCODED_SYNTAXES + _UTF8_ENCODED_SYNTAXES = value + elif parameter == 'UTF8_ENCODED_TYPES': + global _UTF8_ENCODED_TYPES + _UTF8_ENCODED_TYPES = value + elif parameter in ['ADDITIONAL_SERVER_ENCODINGS', 'ADDITIONAL_ENCODINGS']: + global _ADDITIONAL_SERVER_ENCODINGS + _ADDITIONAL_SERVER_ENCODINGS = value if isinstance(value, SEQUENCE_TYPES) else [value] + elif parameter in ['ADDITIONAL_CLIENT_ENCODINGS']: + global _ADDITIONAL_CLIENT_ENCODINGS + _ADDITIONAL_CLIENT_ENCODINGS = value if isinstance(value, SEQUENCE_TYPES) else [value] + elif parameter == 'IGNORE_MALFORMED_SCHEMA': + global _IGNORE_MALFORMED_SCHEMA + _IGNORE_MALFORMED_SCHEMA = value + elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF': + global _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF + _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF = value + elif parameter == 'IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF': + global _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF + _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF = value + elif parameter == 'LDIF_LINE_LENGTH': + global _LDIF_LINE_LENGTH + _LDIF_LINE_LENGTH = value + else: + raise LDAPConfigurationParameterError('unable to set configuration parameter %s' % parameter) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/conv.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/conv.py new file mode 100644 index 0000000..514faad --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/conv.py @@ -0,0 +1,272 @@ +""" +""" + +# Created on 2014.04.26 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from base64 import b64encode, b64decode +import datetime +import re + +from .. import SEQUENCE_TYPES, STRING_TYPES, NUMERIC_TYPES, get_config_parameter +from ..utils.ciDict import CaseInsensitiveDict +from ..core.exceptions import LDAPDefinitionError + + +def to_unicode(obj, encoding=None, from_server=False): + """Try to convert bytes (and str in python2) to unicode. + Return object unmodified if python3 string, else raise an exception + """ + conf_default_client_encoding = get_config_parameter('DEFAULT_CLIENT_ENCODING') + conf_default_server_encoding = get_config_parameter('DEFAULT_SERVER_ENCODING') + conf_additional_server_encodings = get_config_parameter('ADDITIONAL_SERVER_ENCODINGS') + conf_additional_client_encodings = get_config_parameter('ADDITIONAL_CLIENT_ENCODINGS') + if isinstance(obj, NUMERIC_TYPES): + obj = str(obj) + + if isinstance(obj, (bytes, bytearray)): + if from_server: # data from server + if encoding is None: + encoding = conf_default_server_encoding + try: + return obj.decode(encoding) + except UnicodeDecodeError: + for encoding in conf_additional_server_encodings: # AD could have DN not encoded in utf-8 (even if this is not allowed by RFC4510) + try: + return obj.decode(encoding) + except UnicodeDecodeError: + pass + raise UnicodeError("Unable to convert server data to unicode: %r" % obj) + else: # data from client + if encoding is None: + encoding = conf_default_client_encoding + try: + return obj.decode(encoding) + except UnicodeDecodeError: + for encoding in conf_additional_client_encodings: # tries additional encodings + try: + return obj.decode(encoding) + except UnicodeDecodeError: + pass + raise UnicodeError("Unable to convert client data to unicode: %r" % obj) + + if isinstance(obj, STRING_TYPES): # python3 strings, python 2 unicode + return obj + + raise UnicodeError("Unable to convert type %s to unicode: %r" % (obj.__class__.__name__, obj)) + + +def to_raw(obj, encoding='utf-8'): + """Tries to convert to raw bytes from unicode""" + if isinstance(obj, NUMERIC_TYPES): + obj = str(obj) + + if not (isinstance(obj, bytes)): + if isinstance(obj, SEQUENCE_TYPES): + return [to_raw(element) for element in obj] + elif isinstance(obj, STRING_TYPES): + return obj.encode(encoding) + return obj + + +def escape_filter_chars(text, encoding=None): + """ Escape chars mentioned in RFC4515. """ + if encoding is None: + encoding = get_config_parameter('DEFAULT_ENCODING') + + try: + text = to_unicode(text, encoding) + escaped = text.replace('\\', '\\5c') + escaped = escaped.replace('*', '\\2a') + escaped = escaped.replace('(', '\\28') + escaped = escaped.replace(')', '\\29') + escaped = escaped.replace('\x00', '\\00') + except Exception: # probably raw bytes values, return escaped bytes value + escaped = to_unicode(escape_bytes(text)) + # escape all octets greater than 0x7F that are not part of a valid UTF-8 + # escaped = ''.join(c if c <= ord(b'\x7f') else escape_bytes(to_raw(to_unicode(c, encoding))) for c in escaped) + return escaped + + +def unescape_filter_chars(text, encoding=None): + """ unescape chars mentioned in RFC4515. """ + if encoding is None: + encoding = get_config_parameter('DEFAULT_ENCODING') + + unescaped = to_raw(text, encoding) + unescaped = unescaped.replace(b'\\5c', b'\\') + unescaped = unescaped.replace(b'\\5C', b'\\') + unescaped = unescaped.replace(b'\\2a', b'*') + unescaped = unescaped.replace(b'\\2A', b'*') + unescaped = unescaped.replace(b'\\28', b'(') + unescaped = unescaped.replace(b'\\29', b')') + unescaped = unescaped.replace(b'\\00', b'\x00') + return unescaped + + +def escape_bytes(bytes_value): + """ Convert a byte sequence to a properly escaped for LDAP (format BACKSLASH HEX HEX) string""" + if bytes_value: + if str is not bytes: # Python 3 + if isinstance(bytes_value, str): + bytes_value = bytearray(bytes_value, encoding='utf-8') + escaped = '\\'.join([('%02x' % int(b)) for b in bytes_value]) + else: # Python 2 + if isinstance(bytes_value, unicode): + bytes_value = bytes_value.encode('utf-8') + escaped = '\\'.join([('%02x' % ord(b)) for b in bytes_value]) + else: + escaped = '' + + return ('\\' + escaped) if escaped else '' + + +def prepare_for_stream(value): + if str is not bytes: # Python 3 + return value + else: # Python 2 + return value.decode() + + +def json_encode_b64(obj): + try: + return dict(encoding='base64', encoded=b64encode(obj)) + except Exception as e: + raise LDAPDefinitionError('unable to encode ' + str(obj) + ' - ' + str(e)) + + +# noinspection PyProtectedMember +def check_json_dict(json_dict): + # needed for python 2 + + for k, v in json_dict.items(): + if isinstance(v, dict): + check_json_dict(v) + elif isinstance(v, CaseInsensitiveDict): + check_json_dict(v._store) + elif isinstance(v, SEQUENCE_TYPES): + for i, e in enumerate(v): + if isinstance(e, dict): + check_json_dict(e) + elif isinstance(e, CaseInsensitiveDict): + check_json_dict(e._store) + else: + v[i] = format_json(e) + else: + json_dict[k] = format_json(v) + + +def json_hook(obj): + if hasattr(obj, 'keys') and len(list(obj.keys())) == 2 and 'encoding' in obj.keys() and 'encoded' in obj.keys(): + return b64decode(obj['encoded']) + + return obj + + +# noinspection PyProtectedMember +def format_json(obj, iso_format=False): + if isinstance(obj, CaseInsensitiveDict): + return obj._store + + if isinstance(obj, datetime.datetime): + return str(obj) + + if isinstance(obj, int): + return obj + + if isinstance(obj, datetime.timedelta): + if iso_format: + return obj.isoformat() + return str(obj) + + if str is bytes: # Python 2 + if isinstance(obj, long): # long exists only in python2 + return obj + + try: + if str is not bytes: # Python 3 + if isinstance(obj, bytes): + # return check_escape(str(obj, 'utf-8', errors='strict')) + return str(obj, 'utf-8', errors='strict') + raise LDAPDefinitionError('unable to serialize ' + str(obj)) + else: # Python 2 + if isinstance(obj, unicode): + return obj + else: + # return unicode(check_escape(obj)) + return unicode(obj) + except (TypeError, UnicodeDecodeError): + pass + + try: + return json_encode_b64(bytes(obj)) + except Exception: + pass + + raise LDAPDefinitionError('unable to serialize ' + str(obj)) + + +def is_filter_escaped(text): + if not type(text) == ((str is not bytes) and str or unicode): # requires str for Python 3 and unicode for Python 2 + raise ValueError('unicode input expected') + + return all(c not in text for c in '()*\0') and not re.search('\\\\([^0-9a-fA-F]|(.[^0-9a-fA-F]))', text) + + +def ldap_escape_to_bytes(text): + bytesequence = bytearray() + i = 0 + try: + if isinstance(text, STRING_TYPES): + while i < len(text): + if text[i] == '\\': + if len(text) > i + 2: + try: + bytesequence.append(int(text[i+1:i+3], 16)) + i += 3 + continue + except ValueError: + pass + bytesequence.append(92) # "\" ASCII code + else: + raw = to_raw(text[i]) + for c in raw: + bytesequence.append(c) + i += 1 + elif isinstance(text, (bytes, bytearray)): + while i < len(text): + if text[i] == 92: # "\" ASCII code + if len(text) > i + 2: + try: + bytesequence.append(int(text[i + 1:i + 3], 16)) + i += 3 + continue + except ValueError: + pass + bytesequence.append(92) # "\" ASCII code + else: + bytesequence.append(text[i]) + i += 1 + except Exception: + raise LDAPDefinitionError('badly formatted LDAP byte escaped sequence') + + return bytes(bytesequence) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/dn.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/dn.py new file mode 100644 index 0000000..c2a1e66 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/dn.py @@ -0,0 +1,405 @@ +""" +""" + +# Created on 2014.09.08 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from string import hexdigits, ascii_letters, digits + +from .. import SEQUENCE_TYPES +from ..core.exceptions import LDAPInvalidDnError + + +STATE_ANY = 0 +STATE_ESCAPE = 1 +STATE_ESCAPE_HEX = 2 + + +def _add_ava(ava, decompose, remove_space, space_around_equal): + if not ava: + return '' + + space = ' ' if space_around_equal else '' + attr_name, _, value = ava.partition('=') + if decompose: + if remove_space: + component = (attr_name.strip(), value.strip()) + else: + component = (attr_name, value) + else: + if remove_space: + component = attr_name.strip() + space + '=' + space + value.strip() + else: + component = attr_name + space + '=' + space + value + + return component + + +def to_dn(iterator, decompose=False, remove_space=False, space_around_equal=False, separate_rdn=False): + """ + Convert an iterator to a list of dn parts + if decompose=True return a list of tuple (one for each dn component) else return a list of strings + if remove_space=True removes unneeded spaces + if space_around_equal=True add spaces around equal in returned strings + if separate_rdn=True consider multiple RDNs as different component of DN + """ + dn = [] + component = '' + escape_sequence = False + for c in iterator: + if c == '\\': # escape sequence + escape_sequence = True + elif escape_sequence and c != ' ': + escape_sequence = False + elif c == '+' and separate_rdn: + dn.append(_add_ava(component, decompose, remove_space, space_around_equal)) + component = '' + continue + elif c == ',': + if '=' in component: + dn.append(_add_ava(component, decompose, remove_space, space_around_equal)) + component = '' + continue + + component += c + + dn.append(_add_ava(component, decompose, remove_space, space_around_equal)) + return dn + + +def _find_first_unescaped(dn, char, pos): + while True: + pos = dn.find(char, pos) + if pos == -1: + break # no char found + if pos > 0 and dn[pos - 1] != '\\': # unescaped char + break + elif pos > 1 and dn[pos - 1] == '\\': # may be unescaped + escaped = True + for c in dn[pos - 2:0:-1]: + if c == '\\': + escaped = not escaped + else: + break + if not escaped: + break + pos += 1 + + return pos + + +def _find_last_unescaped(dn, char, start, stop=0): + while True: + stop = dn.rfind(char, start, stop) + if stop == -1: + break + if stop >= 0 and dn[stop - 1] != '\\': + break + elif stop > 1 and dn[stop - 1] == '\\': # may be unescaped + escaped = True + for c in dn[stop - 2:0:-1]: + if c == '\\': + escaped = not escaped + else: + break + if not escaped: + break + if stop < start: + stop = -1 + break + + return stop + + +def _get_next_ava(dn): + comma = _find_first_unescaped(dn, ',', 0) + plus = _find_first_unescaped(dn, '+', 0) + + if plus > 0 and (plus < comma or comma == -1): + equal = _find_first_unescaped(dn, '=', plus + 1) + if equal > plus + 1: + plus = _find_last_unescaped(dn, '+', plus, equal) + return dn[:plus], '+' + + if comma > 0: + equal = _find_first_unescaped(dn, '=', comma + 1) + if equal > comma + 1: + comma = _find_last_unescaped(dn, ',', comma, equal) + return dn[:comma], ',' + + return dn, '' + + +def _split_ava(ava, escape=False, strip=True): + equal = ava.find('=') + while equal > 0: # not first character + if ava[equal - 1] != '\\': # not an escaped equal so it must be an ava separator + # attribute_type1 = ava[0:equal].strip() if strip else ava[0:equal] + if strip: + attribute_type = ava[0:equal].strip() + attribute_value = _escape_attribute_value(ava[equal + 1:].strip()) if escape else ava[equal + 1:].strip() + else: + attribute_type = ava[0:equal] + attribute_value = _escape_attribute_value(ava[equal + 1:]) if escape else ava[equal + 1:] + + return attribute_type, attribute_value + equal = ava.find('=', equal + 1) + + return '', (ava.strip if strip else ava) # if no equal found return only value + + +def _validate_attribute_type(attribute_type): + if not attribute_type: + raise LDAPInvalidDnError('attribute type not present') + + if attribute_type == ' pairs') + if attribute_value[0] == ' ': # unescaped space cannot be used as leading or last character + raise LDAPInvalidDnError('SPACE must be escaped as leading character of attribute value') + if attribute_value.endswith(' ') and not attribute_value.endswith('\\ '): + raise LDAPInvalidDnError('SPACE must be escaped as trailing character of attribute value') + + state = STATE_ANY + for c in attribute_value: + if state == STATE_ANY: + if c == '\\': + state = STATE_ESCAPE + elif c in '"#+,;<=>\00': + raise LDAPInvalidDnError('special character ' + c + ' must be escaped') + elif state == STATE_ESCAPE: + if c in hexdigits: + state = STATE_ESCAPE_HEX + elif c in ' "#+,;<=>\\\00': + state = STATE_ANY + else: + raise LDAPInvalidDnError('invalid escaped character ' + c) + elif state == STATE_ESCAPE_HEX: + if c in hexdigits: + state = STATE_ANY + else: + raise LDAPInvalidDnError('invalid escaped character ' + c) + + # final state + if state != STATE_ANY: + raise LDAPInvalidDnError('invalid final character') + + return True + + +def _escape_attribute_value(attribute_value): + if not attribute_value: + return '' + + if attribute_value[0] == '#': # with leading SHARP only pairs of hex characters are valid + valid_hex = True + if len(attribute_value) % 2 == 0: # string must be # + HEX HEX (an odd number of chars) + valid_hex = False + + if valid_hex: + for c in attribute_value: + if c not in hexdigits: # allowed only hex digits as per RFC 4514 + valid_hex = False + break + + if valid_hex: + return attribute_value + + state = STATE_ANY + escaped = '' + tmp_buffer = '' + for c in attribute_value: + if state == STATE_ANY: + if c == '\\': + state = STATE_ESCAPE + elif c in '"#+,;<=>\00': + escaped += '\\' + c + else: + escaped += c + elif state == STATE_ESCAPE: + if c in hexdigits: + tmp_buffer = c + state = STATE_ESCAPE_HEX + elif c in ' "#+,;<=>\\\00': + escaped += '\\' + c + state = STATE_ANY + else: + escaped += '\\\\' + c + elif state == STATE_ESCAPE_HEX: + if c in hexdigits: + escaped += '\\' + tmp_buffer + c + else: + escaped += '\\\\' + tmp_buffer + c + tmp_buffer = '' + state = STATE_ANY + + # final state + if state == STATE_ESCAPE: + escaped += '\\\\' + elif state == STATE_ESCAPE_HEX: + escaped += '\\\\' + tmp_buffer + + if escaped[0] == ' ': # leading SPACE must be escaped + escaped = '\\' + escaped + + if escaped[-1] == ' ' and len(escaped) > 1 and escaped[-2] != '\\': # trailing SPACE must be escaped + escaped = escaped[:-1] + '\\ ' + + return escaped + + +def parse_dn(dn, escape=False, strip=False): + """ + Parses a DN into syntactic components + :param dn: + :param escape: + :param strip: + :return: + a list of tripels representing `attributeTypeAndValue` elements + containing `attributeType`, `attributeValue` and the following separator (`COMMA` or `PLUS`) if given, else an empty `str`. + in their original representation, still containing escapes or encoded as hex. + """ + rdns = [] + avas = [] + while dn: + ava, separator = _get_next_ava(dn) # if returned ava doesn't containg any unescaped equal it'a appended to last ava in avas + + dn = dn[len(ava) + 1:] + if _find_first_unescaped(ava, '=', 0) > 0 or len(avas) == 0: + avas.append((ava, separator)) + else: + avas[len(avas) - 1] = (avas[len(avas) - 1][0] + avas[len(avas) - 1][1] + ava, separator) + + for ava, separator in avas: + attribute_type, attribute_value = _split_ava(ava, escape, strip) + + if not _validate_attribute_type(attribute_type): + raise LDAPInvalidDnError('unable to validate attribute type in ' + ava) + + if not _validate_attribute_value(attribute_value): + raise LDAPInvalidDnError('unable to validate attribute value in ' + ava) + + rdns.append((attribute_type, attribute_value, separator)) + dn = dn[len(ava) + 1:] + + if not rdns: + raise LDAPInvalidDnError('empty dn') + + return rdns + + +def safe_dn(dn, decompose=False, reverse=False): + """ + normalize and escape a dn, if dn is a sequence it is joined. + the reverse parameter changes the join direction of the sequence + """ + if isinstance(dn, SEQUENCE_TYPES): + components = [rdn for rdn in dn] + if reverse: + dn = ','.join(reversed(components)) + else: + dn = ','.join(components) + if decompose: + escaped_dn = [] + else: + escaped_dn = '' + + if dn.startswith(''): # Active Directory allows looking up objects by putting its GUID in a specially-formatted DN (e.g. '') + escaped_dn = dn + elif dn.startswith(''): # Active Directory allows Binding to Well-Known Objects Using WKGUID in a specially-formatted DN (e.g. ) + escaped_dn = dn + elif dn.startswith(''): # Active Directory allows looking up objects by putting its security identifier (SID) in a specially-formatted DN (e.g. '') + escaped_dn = dn + elif '@' not in dn: # active directory UPN (User Principal Name) consist of an account, the at sign (@) and a domain, or the domain level logn name domain\username + for component in parse_dn(dn, escape=True): + if decompose: + escaped_dn.append((component[0], component[1], component[2])) + else: + escaped_dn += component[0] + '=' + component[1] + component[2] + elif '@' in dn and '=' not in dn and len(dn.split('@')) != 2: + raise LDAPInvalidDnError('Active Directory User Principal Name must consist of name@domain') + elif '\\' in dn and '=' not in dn and len(dn.split('\\')) != 2: + raise LDAPInvalidDnError('Active Directory Domain Level Logon Name must consist of name\\domain') + else: + escaped_dn = dn + + return escaped_dn + + +def safe_rdn(dn, decompose=False): + """Returns a list of rdn for the dn, usually there is only one rdn, but it can be more than one when the + sign is used""" + escaped_rdn = [] + one_more = True + for component in parse_dn(dn, escape=True): + if component[2] == '+' or one_more: + if decompose: + escaped_rdn.append((component[0], component[1])) + else: + escaped_rdn.append(component[0] + '=' + component[1]) + if component[2] == '+': + one_more = True + else: + one_more = False + break + + if one_more: + raise LDAPInvalidDnError('bad dn ' + str(dn)) + + return escaped_rdn + + +def escape_rdn(rdn): + """ + Escape rdn characters to prevent injection according to RFC 4514. + """ + + # '/' must be handled first or the escape slashes will be escaped! + for char in ['\\', ',', '+', '"', '<', '>', ';', '=', '\x00']: + rdn = rdn.replace(char, '\\' + char) + + if rdn[0] == '#' or rdn[0] == ' ': + rdn = ''.join(('\\', rdn)) + + if rdn[-1] == ' ': + rdn = ''.join((rdn[:-1], '\\ ')) + + return rdn diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/hashed.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/hashed.py new file mode 100644 index 0000000..e58d67d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/hashed.py @@ -0,0 +1,94 @@ +""" +""" + +# Created on 2015.07.16 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import HASHED_NONE, HASHED_MD5, HASHED_SALTED_MD5, HASHED_SALTED_SHA, HASHED_SALTED_SHA256, \ + HASHED_SALTED_SHA384, HASHED_SALTED_SHA512, HASHED_SHA, HASHED_SHA256, HASHED_SHA384, HASHED_SHA512 + +import hashlib +from os import urandom +from base64 import b64encode + +from ..core.exceptions import LDAPInvalidHashAlgorithmError + +# each tuple: (the string to include between braces in the digest, the name of the algorithm to invoke with the new() function) + +algorithms_table = { + HASHED_MD5: ('md5', 'MD5'), + HASHED_SHA: ('sha', 'SHA1'), + HASHED_SHA256: ('sha256', 'SHA256'), + HASHED_SHA384: ('sha384', 'SHA384'), + HASHED_SHA512: ('sha512', 'SHA512') +} + + +salted_table = { + HASHED_SALTED_MD5: ('smd5', HASHED_MD5), + HASHED_SALTED_SHA: ('ssha', HASHED_SHA), + HASHED_SALTED_SHA256: ('ssha256', HASHED_SHA256), + HASHED_SALTED_SHA384: ('ssha384', HASHED_SHA384), + HASHED_SALTED_SHA512: ('ssha512', HASHED_SHA512) +} + + +def hashed(algorithm, value, salt=None, raw=False, encoding='utf-8'): + if str is not bytes and not isinstance(value, bytes): # Python 3 + value = value.encode(encoding) + + if algorithm is None or algorithm == HASHED_NONE: + return value + + # algorithm name can be already coded in the ldap3 constants or can be any value passed in the 'algorithm' parameter + + if algorithm in algorithms_table: + try: + digest = hashlib.new(algorithms_table[algorithm][1], value).digest() + except ValueError: + raise LDAPInvalidHashAlgorithmError('Hash algorithm ' + str(algorithm) + ' not available') + + if raw: + return digest + return ('{%s}' % algorithms_table[algorithm][0]) + b64encode(digest).decode('ascii') + elif algorithm in salted_table: + if not salt: + salt = urandom(8) + digest = hashed(salted_table[algorithm][1], value + salt, raw=True) + salt + if raw: + return digest + return ('{%s}' % salted_table[algorithm][0]) + b64encode(digest).decode('ascii') + else: + # if an unknown (to the library) algorithm is requested passes the name as the string in braces and as the algorithm name + # if salt is present uses it to salt the digest + try: + if not salt: + digest = hashlib.new(algorithm, value).digest() + else: + digest = hashlib.new(algorithm, value + salt).digest() + salt + except ValueError: + raise LDAPInvalidHashAlgorithmError('Hash algorithm ' + str(algorithm) + ' not available') + + if raw: + return digest + return ('{%s}' % algorithm) + b64encode(digest).decode('ascii') + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/log.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/log.py new file mode 100644 index 0000000..d1cf4d5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/log.py @@ -0,0 +1,216 @@ +""" +""" + +# Created on 2015.05.01 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from logging import getLogger, DEBUG +from copy import deepcopy +from pprint import pformat +from ..protocol.rfc4511 import LDAPMessage + +# logging levels +OFF = 0 +ERROR = 10 +BASIC = 20 +PROTOCOL = 30 +NETWORK = 40 +EXTENDED = 50 + +_sensitive_lines = ('simple', 'credentials', 'serversaslcreds') # must be a tuple, not a list, lowercase +_sensitive_args = ('simple', 'password', 'sasl_credentials', 'saslcreds', 'server_creds') +_sensitive_attrs = ('userpassword', 'unicodepwd') + +_hide_sensitive_data = None + +DETAIL_LEVELS = [OFF, ERROR, BASIC, PROTOCOL, NETWORK, EXTENDED] + +_max_line_length = 4096 +_logging_level = 0 +_detail_level = 0 +_logging_encoding = 'ascii' + +try: + from logging import NullHandler +except ImportError: # NullHandler not present in Python < 2.7 + from logging import Handler + + class NullHandler(Handler): + def handle(self, record): + pass + + def emit(self, record): + pass + + def createLock(self): + self.lock = None + + +def _strip_sensitive_data_from_dict(d): + if not isinstance(d, dict): + return d + + try: + d = deepcopy(d) + except Exception: # if deepcopy goes wrong gives up and returns the dict unchanged + return d + for k in d.keys(): + if isinstance(d[k], dict): + d[k] = _strip_sensitive_data_from_dict(d[k]) + elif k.lower() in _sensitive_args and d[k]: + d[k] = '' % len(d[k]) + + return d + + +def get_detail_level_name(level_name): + if level_name == OFF: + return 'OFF' + elif level_name == ERROR: + return 'ERROR' + elif level_name == BASIC: + return 'BASIC' + elif level_name == PROTOCOL: + return 'PROTOCOL' + elif level_name == NETWORK: + return 'NETWORK' + elif level_name == EXTENDED: + return 'EXTENDED' + raise ValueError('unknown detail level') + + +def log(detail, message, *args): + if detail <= _detail_level: + if _hide_sensitive_data: + args = tuple([_strip_sensitive_data_from_dict(arg) if isinstance(arg, dict) else arg for arg in args]) + + if str is not bytes: # Python 3 + encoded_message = (get_detail_level_name(detail) + ':' + message % args).encode(_logging_encoding, 'backslashreplace') + encoded_message = encoded_message.decode() + else: + try: + encoded_message = (get_detail_level_name(detail) + ':' + message % args).encode(_logging_encoding, 'replace') + except Exception: + encoded_message = (get_detail_level_name(detail) + ':' + message % args).decode(_logging_encoding, 'replace') + + if len(encoded_message) > _max_line_length: + logger.log(_logging_level, encoded_message[:_max_line_length] + ' ' % (len(encoded_message) - _max_line_length, )) + else: + logger.log(_logging_level, encoded_message) + + +def log_enabled(detail): + if detail <= _detail_level: + if logger.isEnabledFor(_logging_level): + return True + + return False + + +def set_library_log_hide_sensitive_data(hide=True): + global _hide_sensitive_data + if hide: + _hide_sensitive_data = True + else: + _hide_sensitive_data = False + if log_enabled(ERROR): + log(ERROR, 'hide sensitive data set to ' + str(_hide_sensitive_data)) + + +def get_library_log_hide_sensitive_data(): + return True if _hide_sensitive_data else False + + +def set_library_log_activation_level(logging_level): + if isinstance(logging_level, int): + global _logging_level + _logging_level = logging_level + else: + if log_enabled(ERROR): + log(ERROR, 'invalid library log activation level <%s> ', logging_level) + raise ValueError('invalid library log activation level') + + +def get_library_log_activation_lavel(): + return _logging_level + + +def set_library_log_max_line_length(length): + if isinstance(length, int): + global _max_line_length + _max_line_length = length + else: + if log_enabled(ERROR): + log(ERROR, 'invalid log max line length <%s> ', length) + raise ValueError('invalid library log max line length') + + +def get_library_log_max_line_length(): + return _max_line_length + + +def set_library_log_detail_level(detail): + if detail in DETAIL_LEVELS: + global _detail_level + _detail_level = detail + if log_enabled(ERROR): + log(ERROR, 'detail level set to ' + get_detail_level_name(_detail_level)) + else: + if log_enabled(ERROR): + log(ERROR, 'unable to set log detail level to <%s>', detail) + raise ValueError('invalid library log detail level') + + +def get_library_log_detail_level(): + return _detail_level + + +def format_ldap_message(message, prefix): + if isinstance(message, LDAPMessage): + try: # pyasn1 prettyprint raises exception in version 0.4.3 + formatted = message.prettyPrint().split('\n') # pyasn1 pretty print + except Exception as e: + formatted = ['pyasn1 exception', str(e)] + else: + formatted = pformat(message).split('\n') + + prefixed = '' + for line in formatted: + if line: + if _hide_sensitive_data and line.strip().lower().startswith(_sensitive_lines): # _sensitive_lines is a tuple. startswith() method checks each tuple element + tag, _, data = line.partition('=') + if data.startswith("b'") and data.endswith("'") or data.startswith('b"') and data.endswith('"'): + prefixed += '\n' + prefix + tag + '=' % (len(data) - 3, ) + else: + prefixed += '\n' + prefix + tag + '=' % len(data) + else: + prefixed += '\n' + prefix + line + return prefixed + +# sets a logger for the library with NullHandler. It can be used by the application with its own logging configuration +logger = getLogger('ldap3') +logger.addHandler(NullHandler()) + +# sets defaults for the library logging +set_library_log_activation_level(DEBUG) +set_library_log_detail_level(OFF) +set_library_log_hide_sensitive_data(True) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ntlm.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ntlm.py new file mode 100644 index 0000000..5271669 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/ntlm.py @@ -0,0 +1,505 @@ +""" +""" + +# Created on 2015.04.02 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# NTLMv2 authentication as per [MS-NLMP] (https://msdn.microsoft.com/en-us/library/cc236621.aspx) + +from struct import pack, unpack +from platform import system, version +from socket import gethostname +from time import time +import hmac +import hashlib +import binascii +from os import urandom + +try: + from locale import getpreferredencoding + oem_encoding = getpreferredencoding() +except Exception: + oem_encoding = 'utf-8' + +from ..protocol.formatters.formatters import format_ad_timestamp + +NTLM_SIGNATURE = b'NTLMSSP\x00' +NTLM_MESSAGE_TYPE_NTLM_NEGOTIATE = 1 +NTLM_MESSAGE_TYPE_NTLM_CHALLENGE = 2 +NTLM_MESSAGE_TYPE_NTLM_AUTHENTICATE = 3 + +FLAG_NEGOTIATE_56 = 31 # W +FLAG_NEGOTIATE_KEY_EXCH = 30 # V +FLAG_NEGOTIATE_128 = 29 # U +FLAG_NEGOTIATE_VERSION = 25 # T +FLAG_NEGOTIATE_TARGET_INFO = 23 # S +FLAG_REQUEST_NOT_NT_SESSION_KEY = 22 # R +FLAG_NEGOTIATE_IDENTIFY = 20 # Q +FLAG_NEGOTIATE_EXTENDED_SESSIONSECURITY = 19 # P +FLAG_TARGET_TYPE_SERVER = 17 # O +FLAG_TARGET_TYPE_DOMAIN = 16 # N +FLAG_NEGOTIATE_ALWAYS_SIGN = 15 # M +FLAG_NEGOTIATE_OEM_WORKSTATION_SUPPLIED = 13 # L +FLAG_NEGOTIATE_OEM_DOMAIN_SUPPLIED = 12 # K +FLAG_NEGOTIATE_ANONYMOUS = 11 # J +FLAG_NEGOTIATE_NTLM = 9 # H +FLAG_NEGOTIATE_LM_KEY = 7 # G +FLAG_NEGOTIATE_DATAGRAM = 6 # F +FLAG_NEGOTIATE_SEAL = 5 # E +FLAG_NEGOTIATE_SIGN = 4 # D +FLAG_REQUEST_TARGET = 2 # C +FLAG_NEGOTIATE_OEM = 1 # B +FLAG_NEGOTIATE_UNICODE = 0 # A + +FLAG_TYPES = [FLAG_NEGOTIATE_56, + FLAG_NEGOTIATE_KEY_EXCH, + FLAG_NEGOTIATE_128, + FLAG_NEGOTIATE_VERSION, + FLAG_NEGOTIATE_TARGET_INFO, + FLAG_REQUEST_NOT_NT_SESSION_KEY, + FLAG_NEGOTIATE_IDENTIFY, + FLAG_NEGOTIATE_EXTENDED_SESSIONSECURITY, + FLAG_TARGET_TYPE_SERVER, + FLAG_TARGET_TYPE_DOMAIN, + FLAG_NEGOTIATE_ALWAYS_SIGN, + FLAG_NEGOTIATE_OEM_WORKSTATION_SUPPLIED, + FLAG_NEGOTIATE_OEM_DOMAIN_SUPPLIED, + FLAG_NEGOTIATE_ANONYMOUS, + FLAG_NEGOTIATE_NTLM, + FLAG_NEGOTIATE_LM_KEY, + FLAG_NEGOTIATE_DATAGRAM, + FLAG_NEGOTIATE_SEAL, + FLAG_NEGOTIATE_SIGN, + FLAG_REQUEST_TARGET, + FLAG_NEGOTIATE_OEM, + FLAG_NEGOTIATE_UNICODE] + +AV_END_OF_LIST = 0 +AV_NETBIOS_COMPUTER_NAME = 1 +AV_NETBIOS_DOMAIN_NAME = 2 +AV_DNS_COMPUTER_NAME = 3 +AV_DNS_DOMAIN_NAME = 4 +AV_DNS_TREE_NAME = 5 +AV_FLAGS = 6 +AV_TIMESTAMP = 7 +AV_SINGLE_HOST_DATA = 8 +AV_TARGET_NAME = 9 +AV_CHANNEL_BINDINGS = 10 + +AV_TYPES = [AV_END_OF_LIST, + AV_NETBIOS_COMPUTER_NAME, + AV_NETBIOS_DOMAIN_NAME, + AV_DNS_COMPUTER_NAME, + AV_DNS_DOMAIN_NAME, + AV_DNS_TREE_NAME, + AV_FLAGS, + AV_TIMESTAMP, + AV_SINGLE_HOST_DATA, + AV_TARGET_NAME, + AV_CHANNEL_BINDINGS] + +AV_FLAG_CONSTRAINED = 0 +AV_FLAG_INTEGRITY = 1 +AV_FLAG_TARGET_SPN_UNTRUSTED = 2 + +AV_FLAG_TYPES = [AV_FLAG_CONSTRAINED, + AV_FLAG_INTEGRITY, + AV_FLAG_TARGET_SPN_UNTRUSTED] + + +def pack_windows_version(debug=False): + if debug: + if system().lower() == 'windows': + try: + major_release, minor_release, build = version().split('.') + major_release = int(major_release) + minor_release = int(minor_release) + build = int(build) + except Exception: + major_release = 5 + minor_release = 1 + build = 2600 + else: + major_release = 5 + minor_release = 1 + build = 2600 + else: + major_release = 0 + minor_release = 0 + build = 0 + + return pack(' 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__end + except AttributeError: + self.clear() + self.update(*args, **kwds) + + def clear(self): + self.__end = end = [] + end += [None, end, end] # sentinel node for doubly linked list + self.__map = {} # key --> [key, prev, next] + dict.clear(self) + + def __setitem__(self, key, value): + if key not in self: + end = self.__end + curr = end[1] + curr[2] = end[1] = self.__map[key] = [key, curr, end] + dict.__setitem__(self, key, value) + + def __delitem__(self, key): + dict.__delitem__(self, key) + key, prev, next = self.__map.pop(key) + prev[2] = next + next[1] = prev + + def __iter__(self): + end = self.__end + curr = end[2] + while curr is not end: + yield curr[0] + curr = curr[2] + + def __reversed__(self): + end = self.__end + curr = end[1] + while curr is not end: + yield curr[0] + curr = curr[1] + + def popitem(self, last=True): + if not self: + raise KeyError('dictionary is empty') + if last: + key = reversed(self).next() + else: + key = iter(self).next() + value = self.pop(key) + return key, value + + def __reduce__(self): + items = [[k, self[k]] for k in self] + tmp = self.__map, self.__end + del self.__map, self.__end + inst_dict = vars(self).copy() + self.__map, self.__end = tmp + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def keys(self): + return list(self) + + setdefault = DictMixin.setdefault + update = DictMixin.update + pop = DictMixin.pop + values = DictMixin.values + items = DictMixin.items + iterkeys = DictMixin.iterkeys + itervalues = DictMixin.itervalues + iteritems = DictMixin.iteritems + + def __repr__(self): + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + + def copy(self): + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + if isinstance(other, OrderedDict): + if len(self) != len(other): + return False + for p, q in zip(self.items(), other.items()): + if p != q: + return False + return True + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/port_validators.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/port_validators.py new file mode 100644 index 0000000..c46b752 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/port_validators.py @@ -0,0 +1,37 @@ +""" Some helper functions for validation of ports and lists of ports. """ + + +def check_port(port): + """ Check if a port is valid. Return an error message indicating what is invalid if something isn't valid. """ + if isinstance(port, int): + if port not in range(0, 65535): + return 'Source port must in range from 0 to 65535' + else: + return 'Source port must be an integer' + return None + + +def check_port_and_port_list(port, port_list): + """ Take in a port and a port list and check that at most one is non-null. Additionally check that if either + is non-null, it is valid. + Return an error message indicating what is invalid if something isn't valid. + """ + if port is not None and port_list is not None: + return 'Cannot specify both a source port and a source port list' + elif port is not None: + if isinstance(port, int): + if port not in range(0, 65535): + return 'Source port must in range from 0 to 65535' + else: + return 'Source port must be an integer' + elif port_list is not None: + try: + _ = iter(port_list) + except TypeError: + return 'Source port list must be an iterable {}'.format(port_list) + + for candidate_port in port_list: + err = check_port(candidate_port) + if err: + return err + return None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/repr.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/repr.py new file mode 100644 index 0000000..8ac9d0b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/repr.py @@ -0,0 +1,51 @@ +""" +""" + +# Created on 2015.07.09 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from binascii import hexlify + +from .. import STRING_TYPES + +try: + from sys import stdout + repr_encoding = stdout.encoding # get the encoding of the stdout for printing (repr) + if not repr_encoding: + repr_encoding = 'ascii' # default +except Exception: + repr_encoding = 'ascii' # default + + +def to_stdout_encoding(value): + if not isinstance(value, STRING_TYPES): + value = str(value) + + if str is bytes: # Python 2 + try: + return value.encode(repr_encoding, 'backslashreplace') + except UnicodeDecodeError: # Python 2.6 + return hexlify(value) + else: # Python 3 + try: + return value.encode(repr_encoding, errors='backslashreplace').decode(repr_encoding, errors='backslashreplace') + except UnicodeDecodeError: + return hexlify(value) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/tls_backport.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/tls_backport.py new file mode 100644 index 0000000..252c141 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/tls_backport.py @@ -0,0 +1,133 @@ +""" +""" + +# Created on 2014.10.05 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +import re +from ..utils.log import log, log_enabled, NETWORK + +try: + from backports.ssl_match_hostname import match_hostname, CertificateError +except ImportError: + class CertificateError(ValueError): # fix for Python 2, code from Python 3.5 standard library + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Backported from Python 3.4.3 standard library + + Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + if log_enabled(NETWORK): + log(NETWORK, "matching dn %s with hostname %s", dn, hostname) + pats = [] + if not dn: + return False + + pieces = dn.split(r'.') + leftmost = pieces[0] + remainder = pieces[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Backported from Python 3.4.3 standard library. + + Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/uri.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/uri.py new file mode 100644 index 0000000..3e56674 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/utils/uri.py @@ -0,0 +1,118 @@ +""" +""" + +# Created on 2014.09.08 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from urllib.parse import unquote # Python3 +except ImportError: + from urllib import unquote # Python 2 + +from .. import SUBTREE, BASE, LEVEL + + +def parse_uri(uri): + """ + Decode LDAP URI as specified in RFC 4516 relaxing specifications + permitting 'ldaps' as scheme for ssl-ldap + """ + + # ldapurl = scheme COLON SLASH SLASH [host [COLON port]] + # [SLASH dn [QUESTION [attributes] + # [QUESTION [scope] [QUESTION [filter] + # [QUESTION extensions]]]]] + # ; and are defined + # ; in Sections 3.2.2 and 3.2.3 + # ; of [RFC3986]. + # ; is from Section 3 of + # ; [RFC4515], subject to the + # ; provisions of the + # ; "Percent-Encoding" section + # ; below. + # + # scheme = "ldap" / "ldaps" <== not RFC4516 compliant (original is 'scheme = "ldap"') + # dn = distinguishedName ; From Section 3 of [RFC4514], + # ; subject to the provisions of + # ; the "Percent-Encoding" + # ; section below. + # + # attributes = attrdesc *(COMMA attrdesc) + # attrdesc = selector *(COMMA selector) + # selector = attributeSelector ; From Section 4.5.1 of + # ; [RFC4511], subject to the + # ; provisions of the + # ; "Percent-Encoding" section + # ; below. + # + # scope = "base" / "one" / "sub" + # extensions = extension *(COMMA extension) + # extension = [EXCLAMATION] extype [EQUALS exvalue] + # extype = oid ; From section 1.4 of [RFC4512]. + # + # exvalue = LDAPString ; From section 4.1.2 of + # ; [RFC4511], subject to the + # ; provisions of the + # ; "Percent-Encoding" section + # ; below. + # + # EXCLAMATION = %x21 ; exclamation mark ("!") + # SLASH = %x2F ; forward slash ("/") + # COLON = %x3A ; colon (":") + # QUESTION = %x3F ; question mark ("?") + + uri_components = dict() + parts = unquote(uri).split('?') # encoding defaults to utf-8 in Python 3 + scheme, sep, remain = parts[0].partition('://') + if sep != '://' or scheme not in ['ldap', 'ldaps']: + return None + + address, _, uri_components['base'] = remain.partition('/') + + uri_components['ssl'] = True if scheme == 'ldaps' else False + uri_components['host'], sep, uri_components['port'] = address.partition(':') + if sep != ':': + if uri_components['ssl']: + uri_components['port'] = 636 + else: + uri_components['port'] = None + else: + if not uri_components['port'].isdigit() or not (0 < int(uri_components['port']) < 65536): + return None + else: + uri_components['port'] = int(uri_components['port']) + + uri_components['attributes'] = parts[1].split(',') if len(parts) > 1 and parts[1] else None + uri_components['scope'] = parts[2] if len(parts) > 2 else None + if uri_components['scope'] == 'base': + uri_components['scope'] = BASE + elif uri_components['scope'] == 'sub': + uri_components['scope'] = SUBTREE + elif uri_components['scope'] == 'one': + uri_components['scope'] = LEVEL + elif uri_components['scope']: + return None + + uri_components['filter'] = parts[3] if len(parts) > 3 else None + uri_components['extensions'] = parts[4].split(',') if len(parts) > 4 else None + + return uri_components diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/version.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/version.py new file mode 100644 index 0000000..1b1962e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/ldap3/version.py @@ -0,0 +1,13 @@ +# THIS FILE IS AUTO-GENERATED. PLEASE DO NOT MODIFY +# version file for ldap3 +# generated on 2021-07-18 08:33:22.864195 +# on system uname_result(system='Windows', node='ELITE10GC', release='10', version='10.0.19041', machine='AMD64') +# with Python 3.9.4 - ('tags/v3.9.4:1f2e308', 'Apr 6 2021 13:40:21') - MSC v.1928 64 bit (AMD64) +# +__version__ = '2.9.1' +__author__ = 'Giovanni Cannata' +__email__ = 'cannatag@gmail.com' +__url__ = 'https://github.com/cannatag/ldap3' +__description__ = 'A strictly RFC 4510 conforming LDAP V3 pure Python client library' +__status__ = '5 - Production/Stable' +__license__ = 'LGPL v3' diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/DESCRIPTION.rst b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..cf0a2a3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,44 @@ +pip +=== + +The `PyPA recommended`_ tool for installing Python packages. + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg?label=travis-ci + :target: https://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg?label=appveyor-ci + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +* `Installation`_ +* `Documentation`_ +* `Changelog`_ +* `GitHub Page`_ +* `Issue Tracking`_ +* `User mailing list`_ +* `Dev mailing list`_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA recommended: https://packaging.python.org/en/latest/current/ +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Documentation: https://pip.pypa.io/en/stable/ +.. _Changelog: https://pip.pypa.io/en/stable/news.html +.. _GitHub Page: https://github.com/pypa/pip +.. _Issue Tracking: https://github.com/pypa/pip/issues +.. _User mailing list: https://groups.google.com/forum/#!forum/python-virtualenv +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/INSTALLER b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/LICENSE.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..d3379fa --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2018 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/METADATA b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/METADATA new file mode 100644 index 0000000..560e392 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/METADATA @@ -0,0 +1,70 @@ +Metadata-Version: 2.0 +Name: pip +Version: 18.1 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Keywords: distutils easy_install egg setuptools wheel virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +pip +=== + +The `PyPA recommended`_ tool for installing Python packages. + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg?label=travis-ci + :target: https://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg?label=appveyor-ci + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +* `Installation`_ +* `Documentation`_ +* `Changelog`_ +* `GitHub Page`_ +* `Issue Tracking`_ +* `User mailing list`_ +* `Dev mailing list`_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA recommended: https://packaging.python.org/en/latest/current/ +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Documentation: https://pip.pypa.io/en/stable/ +.. _Changelog: https://pip.pypa.io/en/stable/news.html +.. _GitHub Page: https://github.com/pypa/pip +.. _Issue Tracking: https://github.com/pypa/pip/issues +.. _User mailing list: https://groups.google.com/forum/#!forum/python-virtualenv +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/RECORD b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/RECORD new file mode 100644 index 0000000..ed62e9d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/RECORD @@ -0,0 +1,174 @@ +../../../bin/pip,sha256=OwK1j23wwRWiaEiOlN8seQVe51_uy4sjVxv014mDPWA,308 +../../../bin/pip3,sha256=OwK1j23wwRWiaEiOlN8seQVe51_uy4sjVxv014mDPWA,308 +../../../bin/pip3.5,sha256=OwK1j23wwRWiaEiOlN8seQVe51_uy4sjVxv014mDPWA,308 +pip-18.1.dist-info/DESCRIPTION.rst,sha256=FEajmtun8GTcxfkyCERaCVCmZ4HnrVQNvM8tZZBRAII,1485 +pip-18.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-18.1.dist-info/LICENSE.txt,sha256=ORqHhOMZ2uVDFHfUzJvFBPxdcf2eieHIDxzThV9dfPo,1090 +pip-18.1.dist-info/METADATA,sha256=XuRGzU9OZJOQFUOAsoLPs66JHZnd49KBa3Pbwcm41nE,2588 +pip-18.1.dist-info/RECORD,, +pip-18.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +pip-18.1.dist-info/entry_points.txt,sha256=CaOvpZsyG0jjwmGQlz8yw4AcWbnU9xlxU_I17NyRFOI,98 +pip-18.1.dist-info/metadata.json,sha256=VJ2hbw501wnhcpeFZIIGK-of4oJxJolcMP4ZPrQMfQg,1495 +pip-18.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=nO-iphoXiDoci_ZAMl-PG2zdd4Y7m88jBDILTYzwGy4,21 +pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 +pip/__pycache__/__init__.cpython-35.pyc,, +pip/__pycache__/__main__.cpython-35.pyc,, +pip/_internal/__init__.py,sha256=b0jSFCCViGhB1RWni35_NMkH3Y-mbZrV648DGMagDjs,2869 +pip/_internal/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/__pycache__/build_env.cpython-35.pyc,, +pip/_internal/__pycache__/cache.cpython-35.pyc,, +pip/_internal/__pycache__/configuration.cpython-35.pyc,, +pip/_internal/__pycache__/download.cpython-35.pyc,, +pip/_internal/__pycache__/exceptions.cpython-35.pyc,, +pip/_internal/__pycache__/index.cpython-35.pyc,, +pip/_internal/__pycache__/locations.cpython-35.pyc,, +pip/_internal/__pycache__/pep425tags.cpython-35.pyc,, +pip/_internal/__pycache__/pyproject.cpython-35.pyc,, +pip/_internal/__pycache__/resolve.cpython-35.pyc,, +pip/_internal/__pycache__/wheel.cpython-35.pyc,, +pip/_internal/build_env.py,sha256=zKhqmDMnrX5OTSNQ4xBw-mN5mTGVu6wjiNFW-ajWYEI,4797 +pip/_internal/cache.py,sha256=96_aKtDbwgLEVNgNabOT8GrFCYZEACedoiucqU5ccg8,6829 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-35.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-35.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-35.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-35.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-35.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-35.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 +pip/_internal/cli/base_command.py,sha256=ke6af4iWzrZoc3HtiPKnCZJvD6GlX8dRwBwpFCg1axc,9963 +pip/_internal/cli/cmdoptions.py,sha256=klAO3AxS0_xoZY_3LwwRjT4TbxtdIwBrmnLJvgG6sGI,19467 +pip/_internal/cli/main_parser.py,sha256=Ga_kT7if-Gg0rmmRqlGEHW6JWVm9zwzO7igJm6RE9EI,2763 +pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/commands/__init__.py,sha256=CQAzhVx9ViPtqLNUvAeqnKj5iWfFEcqMx5RlZWjJ30c,2251 +pip/_internal/commands/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/commands/__pycache__/check.cpython-35.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-35.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-35.pyc,, +pip/_internal/commands/__pycache__/download.cpython-35.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-35.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-35.pyc,, +pip/_internal/commands/__pycache__/help.cpython-35.pyc,, +pip/_internal/commands/__pycache__/install.cpython-35.pyc,, +pip/_internal/commands/__pycache__/list.cpython-35.pyc,, +pip/_internal/commands/__pycache__/search.cpython-35.pyc,, +pip/_internal/commands/__pycache__/show.cpython-35.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-35.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-35.pyc,, +pip/_internal/commands/check.py,sha256=CyeYH2kfDKSGSURoBfWtx-sTcZZQP-bK170NmKYlmsg,1398 +pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 +pip/_internal/commands/configuration.py,sha256=265HWuUxPggCNcIeWHA3p-LDDiRVnexwFgwmHGgWOHY,7125 +pip/_internal/commands/download.py,sha256=D_iGMp3xX2iD7KZYZAjXlYT3rf3xjwxyYe05KE-DVzE,6514 +pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 +pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 +pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 +pip/_internal/commands/install.py,sha256=I_zZhkmIbDm_HqLI2WWC9vjXEnd5kNAdQ2k1xtU38zg,21874 +pip/_internal/commands/list.py,sha256=n740MsR0cG34EuvGWMzdVl0uIA3UIYx1_95FUsTktN0,10272 +pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 +pip/_internal/commands/show.py,sha256=9EVh86vY0NZdlhT-wsuV-zq_MAV6qqV4S1Akn3wkUuw,6289 +pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 +pip/_internal/commands/wheel.py,sha256=ZuVf_DMpKCUzBVstolvQPAeajQRC51Oky5_hDHzhhFs,7020 +pip/_internal/configuration.py,sha256=KMgG3ufFrUKX_QESi2cMVvFi47tl845Bg1ZkNthlWik,13243 +pip/_internal/download.py,sha256=c5Hkimq39eJdZ6DN0_0etjK43-0a5CK_W_3sVLqH87g,33300 +pip/_internal/exceptions.py,sha256=EIGotnq6qM2nbGtnlgZ8Xp5VfP2W4-9UOCzQGMwy5MY,8899 +pip/_internal/index.py,sha256=FUA7IIhNcw2wmN1TQli-DNQzZJRGqKwcwKEcW8K1KSk,34791 +pip/_internal/locations.py,sha256=ujNrLnA04Y_EmSriO0nS6qkkw_BkPfobB_hdwIDPvpM,6307 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-35.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-35.pyc,, +pip/_internal/models/__pycache__/index.cpython-35.pyc,, +pip/_internal/models/__pycache__/link.cpython-35.pyc,, +pip/_internal/models/candidate.py,sha256=zq2Vb5l5JflrVX7smHTJHQciZWHyoJZuYTLeQa1G16c,741 +pip/_internal/models/format_control.py,sha256=aDbH4D2XuyaGjtRjTLQhNzClAcLZdJCKSHO8xbZSmFA,2202 +pip/_internal/models/index.py,sha256=YI1WlhWfS9mVPY0bIboA5la2pjJ2J0qgPJIbvdEjZBk,996 +pip/_internal/models/link.py,sha256=E61PvS2Wrmb9-zT-eAc_8_xI3C-89wJlpL8SL-mlQmg,3998 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/operations/__pycache__/check.cpython-35.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-35.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-35.pyc,, +pip/_internal/operations/check.py,sha256=ahcOg5p68nNow6_wy5prYYK0KZq22lm0CsJn8AyDMCI,4937 +pip/_internal/operations/freeze.py,sha256=lskaBcqf3bPZupG032fuLf76QYv5wpAQ6jsiXac56Bg,10450 +pip/_internal/operations/prepare.py,sha256=atoLFj3OD5KfXsa5dYBMC_mI06l068F5yZhF4jle1JA,14280 +pip/_internal/pep425tags.py,sha256=TQhxOPss4RjxgyVgxpSRe31HaTcWmn-LVjWBbkvkjzk,10845 +pip/_internal/pyproject.py,sha256=fpO52MCa3w5xSlXIBXw39BDTGzP8G4570EW34hVvIKQ,5481 +pip/_internal/req/__init__.py,sha256=JnNZWvKUQuqAwHh64LCD3zprzWIVQEXChTo2UGHzVqo,2093 +pip/_internal/req/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-35.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-35.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-35.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-35.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-35.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-35.pyc,, +pip/_internal/req/constructors.py,sha256=97WQp9Svh-Jw3oLZL9_57gJ3zihm5LnWlSRjOwOorDU,9573 +pip/_internal/req/req_file.py,sha256=ORA0GKUjGd6vy7pmBwXR55FFj4h_OxYykFQ6gHuWvt0,11940 +pip/_internal/req/req_install.py,sha256=ry1RtNNCefDHAnf3EeGMpea-9pC6Yk1uHzP0Q5p2Un0,34046 +pip/_internal/req/req_set.py,sha256=nE6oagXJSiQREuuebX3oJO5OHSOVUIlvLLilodetBzc,7264 +pip/_internal/req/req_tracker.py,sha256=zH28YHV5TXAVh1ZOEZi6Z1Edkiu26dN2tXfR6VbQ3B4,2370 +pip/_internal/req/req_uninstall.py,sha256=ORSPah64KOVrKo-InMM3zgS5HQqbl5TLHFnE_Lxstq8,16737 +pip/_internal/resolve.py,sha256=tdepxCewsXXNFKSIYGSxiLvzi1xCv7UVFT9jRCDO90A,13578 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-35.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-35.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-35.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-35.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-35.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-35.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-35.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-35.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-35.pyc,, +pip/_internal/utils/__pycache__/models.cpython-35.pyc,, +pip/_internal/utils/__pycache__/outdated.cpython-35.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-35.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-35.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-35.pyc,, +pip/_internal/utils/__pycache__/typing.cpython-35.pyc,, +pip/_internal/utils/__pycache__/ui.cpython-35.pyc,, +pip/_internal/utils/appdirs.py,sha256=SPfibHtvOKzD_sHrpEZ60HfLae3GharU4Tg7SB3c-XM,9120 +pip/_internal/utils/compat.py,sha256=LSAvzXcsGY2O2drKIPszR5Ja2G0kup__51l3bx1jR_Q,8015 +pip/_internal/utils/deprecation.py,sha256=yQTe6dyWlBfxSBrOv_MdRXF1RPLER_EWOp-pa2zLoZc,3021 +pip/_internal/utils/encoding.py,sha256=D8tmfStCah6xh9OLhH9mWLr77q4akhg580YHJMKpq3Y,1025 +pip/_internal/utils/filesystem.py,sha256=ZOIHbacJ-SJtuZru4GoA5DuSIYyeaE4G5kfZPf5cn1A,915 +pip/_internal/utils/glibc.py,sha256=prOrsBjmgkDE-hY4Pl120yF5MIlkkmGrFLs8XfIyT-w,3004 +pip/_internal/utils/hashes.py,sha256=rJk-gj6F-sHggXAG97dhynqUHFFgApyZLWgaG2xCHME,2900 +pip/_internal/utils/logging.py,sha256=BQeUDEER3zlK0O4yv6DBfz6TK3f9XoLXyDlnB0mZVf0,6295 +pip/_internal/utils/misc.py,sha256=K5ouAkGO96le5zhngk_hSo7eysD-vMRYMqmkWnEaIFc,30639 +pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 +pip/_internal/utils/outdated.py,sha256=BXtCMKR6gjTrvMfP3MWzZ1Y4ZU4qqoCfbRNqQCusVt8,5642 +pip/_internal/utils/packaging.py,sha256=Ru8ls_S8PPKR8RKEn7jMetENY_A9jPet1HlhTZwpFxU,2443 +pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 +pip/_internal/utils/temp_dir.py,sha256=n2FkVlwRX_hS61fYt3nSAh2e2V6CcZn_dfbPId1pAQE,2615 +pip/_internal/utils/typing.py,sha256=ztYtZAcqjCYDwP-WlF6EiAAskAsZBMMXtuqvfgZIlgQ,1139 +pip/_internal/utils/ui.py,sha256=FW8wdtc7DvNwJClGr_TvGZlqcoO482GYe0UY9nKmpso,13657 +pip/_internal/vcs/__init__.py,sha256=2Ct9ogOwzS6ZKKaEXKN2XDiBOiFHMcejnN1KM21mLrQ,16319 +pip/_internal/vcs/__pycache__/__init__.cpython-35.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-35.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-35.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-35.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-35.pyc,, +pip/_internal/vcs/bazaar.py,sha256=rjskVmSSn68O7lC5JrGmDTWXneXFMMJJvj_bbdSM8QA,3669 +pip/_internal/vcs/git.py,sha256=n1cFBqTnLIcxAOClZMgOBqELjEjygDBPZ9z-Q7g0qVQ,12580 +pip/_internal/vcs/mercurial.py,sha256=jVTa0XQpFR6EiBcaqW4E4JjTce_t1tFnKRaIhaIPlS8,3471 +pip/_internal/vcs/subversion.py,sha256=vDLTfcjj0kgqcEsbPBfveC4CRxyhWiOjke-qN0Zr8CE,7676 +pip/_internal/wheel.py,sha256=fg9E936DaI1LyrBPHqtzHG_WEVyuUwipHISkD6N3jNw,32007 +pip/_vendor/__init__.py,sha256=bdhl7DUZ1z7eukZLktoO1vhki9sC576gBWcFgel4684,4890 +pip/_vendor/__pycache__/__init__.cpython-35.pyc,, +pip/_vendor/pep517/__init__.py,sha256=GH4HshnLERtjAjkY0zHoz3f7-35UcIvr27iFWSOUazU,82 +pip/_vendor/pep517/__pycache__/__init__.cpython-35.pyc,, +pip/_vendor/pep517/__pycache__/_in_process.cpython-35.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-35.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-35.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-35.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-35.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-35.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=iWpagFk2GhNBbvl-Ca2RagfD0ALuits4WWSM6nQMTdg,5831 +pip/_vendor/pep517/check.py,sha256=Yp2NHW71DIOCgkFb7HKJOzKmsum_s_OokRP6HnR3bTg,5761 +pip/_vendor/pep517/colorlog.py,sha256=2AJuPI_DHM5T9IDgcTwf0E8suyHAFnfsesogr0AB7RQ,4048 +pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 +pip/_vendor/pep517/envbuild.py,sha256=osRsJVd7hir1w_uFXiVeeWxfJ3iYhwxsKRgNBWpqtCI,5672 +pip/_vendor/pep517/wrappers.py,sha256=RhgWm-MLxpYPgc9cZ3-A3ToN99ZzgM8-ia4FDB58koM,5018 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/WHEEL b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/entry_points.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/entry_points.txt new file mode 100644 index 0000000..d6133a2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.5 = pip._internal:main + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/metadata.json b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/metadata.json new file mode 100644 index 0000000..fb8fca5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.commands": {"wrap_console": {"pip": "pip._internal:main", "pip3": "pip._internal:main", "pip3.5": "pip._internal:main"}}, "python.details": {"contacts": [{"email": "pypa-dev@groups.google.com", "name": "The pip developers", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://pip.pypa.io/"}}, "python.exports": {"console_scripts": {"pip": "pip._internal:main", "pip3": "pip._internal:main", "pip3.5": "pip._internal:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["distutils", "easy_install", "egg", "setuptools", "wheel", "virtualenv"], "license": "MIT", "metadata_version": "2.0", "name": "pip", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "summary": "The PyPA recommended tool for installing Python packages.", "version": "18.1"} \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/top_level.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip-18.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__init__.py new file mode 100644 index 0000000..ae265fa --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "18.1" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__main__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +from pip._internal import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e88ff8e8f299180087e16158600d220c10626550 GIT binary patch literal 150 zcmWgV<>eAsnwl!gz`*brh~a<{$Z`PUVlE(&!oUy(BpDfkHJPed3@!8w{WKYGamUA( zr4|)u=I6!7uVg4<0xAR(zjXCWatrheG7EGw^NLFnb8>XeQ%x*VN>cMdf?ymUpP83g a5+AQuPZ^2)?3 zFmVn-s&#k%eBa%7=kqij&pwE134Gz;M2zp)+jkBHn}7jIflNSzw}g?%WX~~!Des(hS-Z>SptfBb`;tv!CwA}#xO@H$H*oSG)0m0VsCwU3YuV#ARu`9 z!+h|~t6?tuN&eW@rgNlp+0@qE`;d*xTvvXiRJfIzAN#RV>&|tSl(PI^cv-hTYIm)l zDAnXo+x(d+A2+#s@xwyfDlaK0thEWmKvykU=hH?vOQkDETw!b+q>_G2C=N|Qgn%PyOpAKjF7(HXiGtkBLl%;Z!|<7sjs H&Sb#9`VMa* literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..276124d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__init__.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import warnings + +import sys + +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +# We want to inject the use of SecureTransport as early as possible so that any +# references or sessions or what have you are ensured to have it, however we +# only want to do this in the case that we're running on macOS and the linked +# OpenSSL is too old to handle TLSv1.2 +try: + import ssl +except ImportError: + pass +else: + # Checks for OpenSSL 1.0.1 on MacOS + if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + pass + else: + securetransport.inject_into_urllib3() + +from pip._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import commands_dict +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation +from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parse_command(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = commands_dict[cmd_name](isolated=("--isolated" in cmd_args)) + return command.main(cmd_args) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4b3b6eda9c01b8464ed1c5549f5e284e6c2fce1 GIT binary patch literal 1947 zcmZuxTW=dh6#iz{UfUZxcH+coT9P^~MKUPq1D6(r5Vt%;3Q3g+lCF?e8}G!dvllZv zPUOW_yr3qaz5zcf!sJXJjM#uH~|Z7Bh4&+)m;xy(7=%u1u-wtnUO{W;(d-1saJ z|0%8f7Y2m%V~Bx-!DC=rwh&wJEMp_yhG)ukFT*R(cn6+icpGsANflldjF&O2 zAtZ+~conZ0W0Tg*!-ePKC|yK}&*994_z7fxo*v_vI~djxIykc+{seb1Y#^-Q3|gEl znGjXP^GKTTnqWui9TSGPaB7)gzZb#gC|DE21-wFWv>M_?ByD)@LUs`^Az6mET*z~X zJ4jaGtrT({@f{?q@Ky`Cf%qXLEOM4|{41s!q7H@mL>By=|GmX7j^qv3)c+S79s9AN|K;Oi2E7r+6KG) z(1fdCSk(=`ve6+Arc)T5tYPTtAVxK(vufe!xxOm^g?MS>IAu7VtU%T^ST&tTNaa`> zolhwxX__YMUzD{(S(hPO8k%%JuBc$WaTc+Jm!%@2T*MW_DqSGD4p)S2hmOXs=~#5P z+FC=U9QG=EuXWolYug70`v)I&ALR;{k9IT;2oYVb=S0fx#dkdI=3GjxjkA6b6HFok z6(J?ObT>C=d~ZqF`6O4RKn%`Bonos_l;$#sWB;PSnIC6^0Y$EoQPeb{hX%^YWk_08 zz7Ub*%F1$8iKCR~e56YJ1tG(kCazH-Q`Xu2!vAb{SCtK-^bQ?bl|z0q9tc;*EhRye z_8e1DPS{RDKMfL%a^k4UT-p3ZUooyKQ>gw1@iuw>{p7JsMvq6)Xmfgk%_sc5r=jGT zR+{BUspKLJ;>SL*k@Wqo(L_8X?+<9@T_Rw0*0x=%V%e<27TFSOvu?>|D{R?%$X1!z z-Fr*9zJEHFbiI6ESmY+wh)@gYMAUR~S4-7t3v;oo#dRuU%Ri@UoQbWmh~wzw-7Pu{ zAL$E~3tMlRKaFClappg+$;-a9htXb@816<>Sw7G(TS*-I`KiQ4#5S~9&)q=h26;!jR6kC#a2)eb^k8!hjh0m>T+r95yDipsY}R58 ZR<_rfZ4gqnT&qR8;`@NLtft+z{{b*i@Vo#3 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/build_env.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/build_env.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9219b2ab0822100183ba3fb7626018893e78c69 GIT binary patch literal 5428 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 DZ6yjS7JVAPI5? z7&R~=XKe0PBIi=IsY-2Se}MC_mC8#V@|ypUr&J|{w=> zxMzjCD%>^kQsi21h^*D7~xVB_wx^M7v!-@618mn_;ly@Ajn=`(a>poxs`k zx?T`lkr(%SSU9W6ew<7CM`f=<9mLFJc?#SBlJ6_a4 zqZdx6Ppux&ujNEh*!G>+bFD)^-m@Il$%b{{4bZ5G9??VhnIDW=`0>>UgJ|=(uBDX* zy}Hi5OWz4%8if`4!EVR14nyf$t{1hXk8XCY!#z)8=zG-hD4$C^9>dz(-B@2OfICWu7_JaW9w)=tWN&AH_-T%lB+%`0Z|LE7iv56!4JrrLGu`i%> zVt-_?Q0HTH9cF8gI?H#d8En+ei9glFy1Knx&kyf@>>NNzSSe_^B8-KUP(pChg+@hI zxMM|OU$#B#8s_fHFkm$eC97N=nqXOpW`C<~4E2qTZ*+{QSvQhgCp`3IQjlJ+u+zq6?c1Y_59w3AD~sIv+=I?&JW$#3+W;swjV%Vkjh(X zEmON`^aja-9fY#$bo`-bQ?K76$rMotb4^>&YMOi%_0t7d!yP3+g>?|!cHL+uTH_lM zGzOZBdL2KmYw`lldAO>$h|{EoHIHCnUKa~#L%(m}YD5wcx_q5ln4fLmd6<}eC~}g& zcmITdLBrj@9K@p%9z zEILZYXF_IO{J9W2xQMzb{tQUQi|*zby>h}W2)D@fyl_i|e}r(jn4w*90`1U%p^n;= zQ^2D-8Z+!sy&^oIBjX=V2|MRgAf&r^e1wC*b{B|yf!_%1d_}kyxegG0Rk#+{(d}!( zy~K6EDq#3B*U|qK;l9Cj0PR)bUgP>I&3C(APpVUR;QTwp^J6C<4W7hS=<>Awlv#Zr z$nb>^1hX7MR4CdGG}ekk%W1b^0t9O4OLasiQ+HP3*%C z@MKBEWf9NOT{MQp5PYIb=(+m;CwK|J$F6WMLfF-bcc}N}`N}+(3t~4%x<)|e%+F9q+1>5mZ2#IcPdT1VmY zi=QrtV~q!)iNDsx^Ssy|BP1N7-uOOxbeJ%VZ%Bg9Z_77bxIr+F-urvhE4`wm4d2|H zqznxkxbMfd-MHBa+gSYf8{@}*yV21|PaU27KHeyQKm|FWF{;bAae9Cw9n&}ei@*8` zJVC$bNx6YLNpUo=BzFMs9LdYn#T!&yqk@E$-5}$9by?I0Lcckg5x-2`@8UQo(+${E-u0V6g!HNLdr(asvElgj_>-YbR!ith`gyIQ8CqVuW|Xv& zdDU3JZ%wCTc=q%~%NB^#h>lGh5$PEzICB<_YMO{%;Y-R)VSL+leRzjh9HZz2O(wc{ z8fGv|LOLUM!stL4N=#%?%~nATlfZ~2lAKjHCZ2(LbQD1=$o zps&-^v_Va#rcDtRPx}v0QPal!4oV_APxu6gd8r9t$Y60S0r>9q?Z?4cVFIfT%0k`| znnpp^_LD#ppR;_-;Rg>9C&)m#1!A^}-|zXmdtMX+gZ&UO!hnEw3S`Hk8P=N~FdD!N zFo=3yo0Z3M*rBDDJ=c%n@gyx@-Bda>e+!I95=m85e8t}N;#BACI8gt@4dbVFOzs@m}4w0g}xG$rp$&8p}`$s76w^xv*)!#^5{ zjJ(x25{ayi4-!mx)Bxe{M%U`#zwE>UnmjuyT3OG{gm=0~fq8SFgd93Ka**V>yVGYc zKgI~Z!lC$LZn!i(O@6e^ToR4wH`Apb;bgFoP7mlt+Hw`z0>y&1{E)OIW=6OV&o<$x zl=?8m9bUiZfi#SK1ew(dcdUFYS<$f846Uf&-Xl%|AM(X<6UuNO!$^uBc>`W!#ykWX z&=Z~QCo#}?)`&{9dMx^1pk+$a4bXI~^Xjw!vX+^XFW?bERyL?#qB4skSm!@P@MDN$ zQ+x^M%9bX50cj{X(A}Ik&eL5IPL9kkdc>!AgikfP2N#Y1Xa@r|ghu=TNQHBh1+k9a zZc?>K!~pHV2-rY@TN@t}3J)^bomNr;6o-#dzv>UJFVwkY30P9vF5pBbs$XJ}b3jnz~>rk8(C#SozWgcwSV&P^XJQgYTI>lSl_Wa)9^=WOIx;!|G!&19ohobtOu)!)Cp#R{R#mpX8Bl+=W0*KLCRzt4;JU zO3a=U?dnPrdJ|(N{(X?HFX9l6H;b@EDVs<^*z`G8_TetdpiZuZhRFPW+87b zLo4f?Y~=GCv;4-^J3Y=oaY;q!`j}CE1M(s30b+ z_)A&QA9{`aeQKR|dVm?Xo>z*N?hK?s9H|?~3>rrhK4T`Dzk^2qgCjbJg5rwT5yTb@ zQ(xDr#zoYtx}h%`Luj1O6@ZlpoqSd$#lmcqSuSg$X^$Kuc~>%+Cv#7s+=QANVJ8V(lkuTfFrh2%2lnbAV|H)3#x#7u;p-GKHu z2*Jj2_4SkN$@V7V}qqA>T984-L&B{=L69@ zt(}H;kDtJ&;6LvE%n+YbM2`2vh?@k1P80^ii;#5eU@s#}#eH#Xwf7w9v|%05T~^j4 z$6Tylkp||NEIf1$m1rLDwwEMhk(3%s^4<}4W#E9(y_+n4hWuyfdbd3)Rp>?9$e|bc zZsf_lWEs&DBG?_g1AZ?+Qy6uU0LraL6X;^%1z*H969CASEIbOzRvhs`YN zReeRjqzzx4Sx(G+O2^vdzv+*DGY__b6S5GjEj$*%BcdprbI3*&Ci$u6GZ!|7?|vsl zPQaP63T(zi8AuLu@1enaO{nk(c&&n?>r^9EmqQe=4GK2Xetts^2>wKfw@D~86=Bv+ z`f-Mhi4k#c8FUorDIBcZ1aRcX0S|AJ4&Q$ICVL|eU7(i$lvOCCf{0a$Q&ujGOL&jK1=`Ezc3_IEo!Uqj;0ceIyWwe~_gT8nv39+HLMaGN z?dSvfCnShy53T`=N4%9Fz&~OapP1z6zoDs+Eht}{KBw^iJZ?$K?#uU4j8KAQO47x4 zIBy-;&pdnJdmYf}Sy_LDX7@5#8y7%zUj<&AK#5sv%Y<#913FmP|A30Zen?soJV1h? zeGn@J{hTLI-T;h`WfrJy7L)cR_(HnjgFP4y;rSY2Oi@(ALy~^@f?va~0jF5H3UO)B z$6xV|&76o4u2%&%YE*~ww2<=e)9swNMr@Psq)_$qCnTP6$UvJ}u*k_gHgOj0*-d|& z;m5PaINq#@0siz62d65Pon!B2(z?f{lPt_|x@P^1@+W@*ktPPjKf%i0plfCaE=E$8 zMr{_5n3;xZLPc_e|CEK+fe3bLnB05GSfr@pXQP4$GKkaoUP8a1me5*=)lwwy&p zlvWTHE$j2fvQgI75s)uqgW&`#J3%iq)zQ%h9h*2f%vTPEN{}k0HPI!C5ur+0W4LlM zPs+8|&E{`Nl)U}ji4x}C5?@u3APCNx#d26UN`e;BeVW}| ziqbeWwVt^XGUjZ~Z{Y+pg5E+G6}l)9P(tl{slTQ0klBxljI}1ld5Z?#M=>(_jNm0_ zh?!-nefk__b{>?x`8mylR0K2uEboN5pU6qB(FPj%6x&Y9Hsvb&c#WM@Z2LLBy-DvB zY}*an*p<40p5;9%KB9sN=L4$Ydo{t|N60SKD9%ob*lx!@T|D6YH1Yl&49~ zP4}wW!~+U7WtAG_)0266WPu7I@A3>4i&QL8u}sA=3Vh=gOSwWd+6%bPsV4bLy6sUx z?w*t0j8I8Fe728I(O8<}u|CG!uN#J7x(% Q$bwlZSMtPQ)xVPYe>;i!iU0rr literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/download.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/download.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98c76db9d8e600257c9317139514e6001575c3ec GIT binary patch literal 22814 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 RsV7GtojIuX6Ng7%_! zfw~8z2wRn^XtSG~QmM){x1=ih2Xf6J_ncFxR4zHBd`NOk)m9Gq{l1J-)EqAKvd zq}nCb8B>qPRA*d09#@^RdR(^8##DPkbtcv0NmaP%jVrILeuG)c%AZm%OX_h&-Sj4u zH!09biW6nYxaHSnvFzw{Mpu3`Vr28{pxW;$7LD%t9JXdRDgULoCbUS{dF{m^eoyhC8d0lNZp7q>z z@?@gX@S0ZTr3qfdNx7}X&*#FrlUhGE%N^1lmP!HYq)oe*q z@9yXcOfp5(v6)o0Aoqu$ZDu(NTfs(8yJWhh^3qK|^tIa_66pk?)65S9)q0X-5CvUf zcZ6L=n!P$o*fDgxNHOL8Auv60+p;K!=-ggJy`B!j4d5&6l(7fF^*C@lk;9euhrspZ z!!VD5W$U}I#I`pw`XKmD1HaQbe0hHed{12uOss?T9+hAa=JwrTBPr1qcn0_}JFFg^$|Wc;}tF}yznG3W0Omp3

3$1%EPt8`KW7tqX+;Siw7e+`15qYYg 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/locations.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/locations.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59c07e57933e0c5bff02cdafc8358e6907787035 GIT binary patch literal 4640 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 E-xIH#EdT%j literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/pep425tags.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/pep425tags.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15250c425bb82136b74d7edc63c38a1ea21fa3f4 GIT binary patch literal 8133 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 VI8iRom2>6eDB=>#DD-tNZ-wYIEafA)<2t zf5F1f!v4qjr~x)1{u#so34=WbjJ_?1E!eZn81`-0vrXTIxB^KP_NtILu;-N86^Lt) z)M2lV-&F`5_#R-d0bvcoy6HCw@?pF256%Z|R;>H`DvO6&cu|sPQt!5{!pTQEOX9*- z(KA#zb1zlek7Hj)S$bE>Oa_ds@kehPpU?17?_i?=CfG7Kwjg^OG&;^`Msx$^caCv@ z;q>})qySEt@@d^* z{RERLxDsEOqg6PlgZvS6oiYw5{0?WR!4x2U023Vgld=yx2M+a5O@22f4Hz_N6m>45 z@sfSZXxnCje`#g}C3}=Ka3Pp((qt%6E<@o%f+@AHvJi891wt2kn1v``g~&4gmpW+w z>C8S{gDGy3rtz@`QZfu>V*Co%VS;J50pS@q2CH}`!e%GuKR+YCMfMy-i>0> zX*N0j?)%bD1m>~2X}(D|RKm+ee*M}FzRkbzm4QH^P8~$%mL;;d&cK&{v~c0swzC| zmO+(!ZcDu?yg7^#dYF6p2t#>2fKkHDYnYjvVzge0?4ao*B++zda}yDf6p2VRKN4FK zDV`I-FLg6H2bpugxu9~098&2-!rJ8uJU|C!xL7w^= z^hI#MePm=-I5AoLE+!a9k}2$^nTVZXZi3q%Mi{C{49OjH^T4 z-QL+9yT)c)jW8vX&&T)fM9SZfQR5Zq$s>gx9r|$;-lWB%a?Qg`D4u4T_x(en@FWi& zjaN(PS>)sW{|$YT(F$S9&}LYazR#!V%S%g8)Mt#Uam)CjvkcFN58vPEyw|y2RFC>X z#N%_PLmdO_;qLXvUp>!pjr^XNVkk7_eD`$bJ04l~7eWrQB*&e16zTqquAQ6wxfH(2 z(rHnf;T29P89#}LC4$~sWPOWkq+DQ#+7P)k*g1)4iy!r)pigU%_-W|tOpb^Fs!hgz zeC>6HXhI9*b2=4?yYl2#owi$8nJOx@5eg?#RMZM9%8E*si&WZp^5Id66|k^-LdzlOLbk}S+AKGUs@Xm-ANXe}jMIq>EZM2Y*uWbt*0LOS zfo;;ey2@N;vxePZEz@)C4ZBfwnPayq4y#yh-DPgARdrBivvuY=P1M72=GyDjuHj?J zcM-Y0QZzlUJH!GdJWtY9MqZ?56PscMFG3yf5DP;l4c+C{>VgrU+>JWoSs-#^TA3v< lR2%SxAnC>>&DExUE6KuPEN;_fQMuS`Sm>O!X>HhU?LW1(`z8PY literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/resolve.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/resolve.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47566f5dd5636fcdbbc20c1250f9f9686067eaca GIT binary patch literal 9008 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/wheel.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/__pycache__/wheel.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ef43cb620a7d515c1c9372930b624a9560a34d4 GIT binary patch literal 22882 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

e0D`-m(NzK^dhM%H6th;am|ipT(%0PEpL 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 D@)K~+ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/build_env.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..673409d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/build_env.py @@ -0,0 +1,142 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import sys +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip._internal.utils.misc import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import open_spinner + +logger = logging.getLogger(__name__) + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + self._temp_dir = TempDirectory(kind="build-env") + self._temp_dir.create() + + @property + def path(self): + return self._temp_dir.path + + def __enter__(self): + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + self.save_nousersite = os.environ.get('PYTHONNOUSERSITE', None) + + install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' + install_dirs = get_paths(install_scheme, vars={ + 'base': self.path, + 'platbase': self.path, + }) + + scripts = install_dirs['scripts'] + if self.save_path: + os.environ['PATH'] = scripts + os.pathsep + self.save_path + else: + os.environ['PATH'] = scripts + os.pathsep + os.defpath + + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=0, prefix=self.path) + platlib = get_python_lib(plat_specific=1, prefix=self.path) + if purelib == platlib: + lib_dirs = purelib + else: + lib_dirs = purelib + os.pathsep + platlib + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + os.environ['PYTHONNOUSERSITE'] = '1' + + return self.path + + def __exit__(self, exc_type, exc_val, exc_tb): + def restore_var(varname, old_value): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + restore_var('PATH', self.save_path) + restore_var('PYTHONPATH', self.save_pythonpath) + restore_var('PYTHONNOUSERSITE', self.save_nousersite) + + def cleanup(self): + self._temp_dir.cleanup() + + def missing_requirements(self, reqs): + """Return a list of the requirements from reqs that are not present + """ + missing = [] + with self: + ws = WorkingSet(os.environ["PYTHONPATH"].split(os.pathsep)) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.append(req) + except VersionConflict: + missing.append(req) + return missing + + def install_requirements(self, finder, requirements, message): + args = [ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--no-user', '--prefix', self.path, '--no-warn-script-location', + ] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + if finder.index_urls: + args.extend(['-i', finder.index_urls[0]]) + for extra_index in finder.index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + for _, host, _ in finder.secure_origins: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + if finder.process_dependency_links: + args.append('--process-dependency-links') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, show_stdout=False, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, message): + raise NotImplementedError() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cache.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..33bec97 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cache.py @@ -0,0 +1,202 @@ +"""Cache Management +""" + +import errno +import hashlib +import logging +import os + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.download import path_to_url +from pip._internal.models.link import Link +from pip._internal.utils.compat import expanduser +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import InvalidWheelFilename, Wheel + +logger = logging.getLogger(__name__) + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + super(Cache, self).__init__() + self.cache_dir = expanduser(cache_dir) if cache_dir else None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts(self, link): + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, package_name): + can_not_cache = ( + not self.cache_dir or + not package_name or + not link + ) + if can_not_cache: + return [] + + canonical_name = canonicalize_name(package_name) + formats = self.format_control.get_allowed_formats( + canonical_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + root = self.get_path_for_link(link) + try: + return os.listdir(root) + except OSError as err: + if err.errno in {errno.ENOENT, errno.ENOTDIR}: + return [] + raise + + def get_path_for_link(self, link): + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get(self, link, package_name): + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return Link(path_to_url(path)) + + def cleanup(self): + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link(self, link): + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get(self, link, package_name): + candidates = [] + + for wheel_name in self._get_candidates(link, package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if not wheel.supported(): + # Built for a different python/arch/etc + continue + candidates.append((wheel.support_index_min(), wheel_name)) + + if not candidates: + return link + + return self._link_for_candidate(link, min(candidates)[1]) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + self._temp_dir = TempDirectory(kind="ephem-wheel-cache") + self._temp_dir.create() + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + self._temp_dir.cleanup() + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link(self, link): + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + return self._ephem_cache.get_path_for_link(link) + + def get(self, link, package_name): + retval = self._wheel_cache.get(link, package_name) + if retval is link: + retval = self._ephem_cache.get(link, package_name) + return retval + + def cleanup(self): + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8950b47dd6d08a437ff4c7b9d38fc16e6b2608f GIT binary patch literal 227 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 Y7V`~FHD=ipa1{> literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35c217c761020b94fa46b29c54998dbc2450b1f1 GIT binary patch literal 15976 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 G!~PGN%0WK> literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b0d324c5eafc5a9de4ff312b6fc1a3738081f82 GIT binary patch literal 2400 zcmZWqUvC>l5TCuX&-U3)Y&UU9)uK~r3Koik08x-a1WKtuLM>82NQUZk@vfb7?jO7B zwy|OfQF!D5iLbx|-+=GHH`rI6`otqrpP1Qm(kgYbdponYGqW?l-`v%9+wc4##NR%^ zKk(Ae!SyFN)L%GpfDz6NxC04;5iZKL10%<-T}WI=D=?}6qrD0wRY*M;d8J&1qy}jn zMs-LVFlv-q4-y~JCXAYpwqVqPv<;(nxmSZ^4bpWOt(S5gk`AO@7>;T7O5($ji_LOmR`7axBbs5qM@A}Eq*EP_ccgK?fIE$3s68$p!uKs+gOdMnV! zB1oe+3yMf8A^m4~dAL7drWuBhgj8{!g&~UmIOTbvQB(uR^bYcD5>Fpk#aH&Ex$#ZG zBXV$8Orm+B)#oB9?&UI#v=(yUn)WzPQ*^FE9*?!zmN6>GiE^D@C}ci0y|EOL79oWnmf@SWeV&^e(`D%A;lO&s0S@&aPGvQ@OLgN_ z&;Ue|+uY+bJ##LAXXa~*!eg#-EIAbt#X^ZI!%&IW+V6~{7FYs^!o+2KwV7S1y z87vVoK4>4#9MDaeVa>3FE%?QOt%(bLG#j=+w_&zs=XG-Q)PbdIJ$B&Cnqj<6a@Ymk zqackV4O8rY@tv zVy1|TH&t-(E277xvO#Cdp(RS!$mJ<~w&mGw83 zEJ}s(rb&JjC8k0~7S3?ExQ2d$Z52#pp3?KJ;#42!87>F+pSf77uMLbDKIunt6~`eC zbsMKCUK-%xb@(3BRc0DBcx4AB4)lL>;0F({%@+0Top8tJHj|aC}&Z!J5J)=mvA>MPM`aGNvt%crPzOu z!lQoDfW_@sQ99g9@^O@?eO#O$G0Y!qNV=OOpvnqPW{bxvI!Z+8R~5)d!NW*Sm2q-~ zNsRQdsYOT1E-JG;&PijyJhbV;S2XFz`&Hq+odR*mx^8HZgHwaWX~1OCoMYwv_3v zuoJ3tp34Cmd{GOzMPd^tDv!E_6I4Csu?CKHx5a#?$6j|_7F0G_+iAEBc8&F%3z$%N zbi)H2s*m6)`MqK=q66v9EM!WOIWTiTehb=#nI$$N2sQW)yHIJ52z9Qi+b)2-Y^fiK zp4d;eu>YQ*nct}cl#J!>N<;SivT>k`i^FsZS&X#Bws2Ad`7h`eiRgwnY`6Nz@TEso zmIlr+iZ*pD6#F)qHELTkY#AP%!vCM_{kZ*xQHNP#8>qnyyNI>R@PRV2<8V;BFNs;E zLZp30%f-e#JIV6L8GbTsvkq=1s)w2_*_s5l>=m+(cw}S|YV!8h16wJ_xQ7>P#rD=+RM@-6R1U0e+> z8pjYDM@hcdUeOOr)>!J>PGI_%-dTM=U!3(G%Y!W#A;UUe^Es literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/parser.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/parser.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b038150a73a6ace5711e1768ad6da7e864d22d82 GIT binary patch literal 9547 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6fbfa55d5391e3a5d4dc152c29d16612b18ae64 GIT binary patch literal 370 zcmX|+y-ve06os$TUsY7?fK*dKSha4`N5;vE3KjQ)>hUbjZ&+<==)Kmw!$7y)8>W&yW=wSc#P zwSl*Rb%1w(b%A$*^?>&vnD%Qk4O5~=o7Xavl@gewc~+>J7{6|o)U5{X1``81?dt*J zTcxT(AQnwT_kw7-bb>&49N+hRJ&foh^^b23##U)==Se``, ``

`` or ```` + if completion_type: + options = auto_complete_paths(current, completion_type) + options = ((opt, 0) for opt in options) + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + opts = (o for it in opts for o in it) + if current.startswith('-'): + for opt in opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, opts) + if completion_type: + subcommands = auto_complete_paths(current, completion_type) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + + +def auto_complete_paths(current, completion_type): + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/base_command.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..dac4b05 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,278 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import + +import logging +import logging.config +import optparse +import os +import sys + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.download import PipSession +from pip._internal.exceptions import ( + BadCommand, CommandError, InstallationError, PreviousBuildDirError, + UninstallationError, +) +from pip._internal.index import PackageFinder +from pip._internal.locations import running_under_virtualenv +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.utils.logging import setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.outdated import pip_version_check +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + hidden = False # type: bool + ignore_require_venv = False # type: bool + + def __init__(self, isolated=False): + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def _build_session(self, options, retries=None, timeout=None): + session = PipSession( + cache=( + normalize_path(os.path.join(options.cache_dir, "http")) + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + insecure_hosts=options.trusted_hosts, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + def parse_args(self, args): + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('ERROR: %s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + allow_version_check = ( + # Does this command have the index_group options? + hasattr(options, "no_index") and + # Is this command allowed to perform this check? + not (options.disable_pip_version_check or options.no_index) + ) + # Check if we're using the latest version of pip available + if allow_version_check: + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_version_check(session, options) + + # Shutdown the logging module + logging.shutdown() + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, args, options, finder, + session, name, wheel_cache): + """ + Marshal cmd line args into a requirement set. + """ + # NOTE: As a side-effect, options.require_hashes and + # requirement_set.require_hashes may be updated + + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, None, isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + # If --require-hashes was a line in a requirements file, tell + # RequirementSet about it: + requirement_set.require_hashes = options.require_hashes + + if not (args or options.editables or options.requirements): + opts = {'name': name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + def _build_package_finder(self, options, session, + platform=None, python_versions=None, + abi=None, implementation=None): + """ + Create a package finder appropriate to this requirement command. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + return PackageFinder( + find_links=options.find_links, + format_control=options.format_control, + index_urls=index_urls, + trusted_hosts=options.trusted_hosts, + allow_all_prereleases=options.pre, + process_dependency_links=options.process_dependency_links, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + prefer_binary=options.prefer_binary, + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/cmdoptions.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..29b758f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,714 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. + +""" +from __future__ import absolute_import + +import warnings +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any # noqa: F401 + + +def make_option_group(group, parser): + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-options ' + '/ --global-options / --install-options.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # gauranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Any + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Any + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Any + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Any + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Any + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) # type: Any + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Any + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Any + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Any + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Any + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # type: Any + + +def exists_action(): + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).", + ) + + +cert = partial( + Option, + '--cert', + dest='cert', + type='str', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Any + +client_cert = partial( + Option, + '--client-cert', + dest='client_cert', + type='str', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Any + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Any + + +def extra_index_url(): + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Any + + +def find_links(): + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host as trusted, even though it does not have valid " + "or any HTTPS.", + ) + + +# Remove after 1.5 +process_dependency_links = partial( + Option, + "--process-dependency-links", + dest="process_dependency_links", + action="store_true", + default=False, + help="Enable the processing of dependency links.", +) # type: Any + + +def constraints(): + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +src = partial( + Option, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Any + + +def _get_format_control(values, option): + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them. Note that some " + "packages are tricky to compile and may fail to install when " + "this option is used on them.", + ) + + +def only_binary(): + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only use wheels compatible with Python " + "interpreter version . If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), +) + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), +) + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) + + +def prefer_binary(): + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in ." +) + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="store_false", + help="Disable the cache.", +) + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Any + +build_dir = partial( + Option, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Any + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Any + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Any + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Any + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Any + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Any + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=True, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Any + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Any + + +def _merge_hash(option, opt_str, value, parser): + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Any + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Any + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + ] +} + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + process_dependency_links, + ] +} diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/main_parser.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..1774a6b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,96 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import ( + commands_dict, get_similar_commands, get_summaries, +) +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_prog + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + pip_pkg_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), "..", "..", + )) + parser.version = 'pip %s from %s (python %s)' % ( + __version__, pip_pkg_dir, sys.version[:3], + ) + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + parser.main = True # so the help formatter knows + + # create command listing for description + command_summaries = get_summaries() + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + parser.description = '\n'.join(description) + + return parser + + +def parse_command(args): + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/parser.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,261 @@ +"""Base option parser setup""" +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/status_codes.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..c7d1da3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63ad5c934d0d2cc76ef95be467c9e2bba265ba93 GIT binary patch literal 2621 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/download.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/download.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..350f2ff94116cf1a7a550a9798c003cfef042ef7 GIT binary patch literal 5014 zcmbVQTaP106+Ufye80>kJ2QJpw%KIaIApwlfP`on0*P{wmMCOa1UZUYJ>6xyy?skn z_YSsZB&0>~M#PWE1Am4eP=Y5O5aJ)?iSJam=jMb5-0pJKsZ*z_&N=m+Q{LlP-N~sK1R@{R@SUuSFqIWYO3ni`x|nD>SZ{KGdr;u9|w4!Wu;zG~OuqY82Kf zYS6e*v^OYhQq-bxt7z9LY*W;sai?fEDC|G@$XIXtyZbq-cxATSdD~ z;WkA(G~S`;1scClP&*XfplFxIyJU$9&G$&`({rr;CcW=>$?wr0u!kOr20h2pZ}EPP zhW&qIvoy5yz&%z;m}kNXqBN1&N1(O6$WPKNNMeQ7_9x9x8&^h_E4B4=RD(V96T!P{aoLH5%9H zPec>&pjoFsg0n$BzD?HJxXHao!z4{}A6rCi8=qB&onmY5R498QljyCs z={&GMUVQwa{VG&uC)rF$JBWSpJE4Ylu7Y@K%L~=oDivNZ34~Oma`127IkHok%&|>7 zm*F}6apJk*c@I=%^bm+^42gvND9MDal3aSicBMB9o-v!5APrL64OL>RJY~}>+b?&? zOXF?W_bx3EI}1Xg?!9iG%mQ!5^FIrGVMMvHEnKy*Puzu_L7>^n!gj%$gu)i_vp^;> zdk}XYi}RU;Uu;%4S980!SE{w``

De^&b9=k}vZ%em0kq5WB@`~#!jgLD4TsF1!c z=|El)R_yKn5%lPpr_N0QBOTh`KIxlb<*}aY3C{lI02CG0TsXrg9-&6_$|s_p!p5*+vH;} zwb~^;?Ov6^+T2?w0hh09^X7`gLv9%}+-7sl@36(rYGr-?A_2=!YfLnzyF(?ZYDj>% zqhar(W#zzM)(;MRp|a&x@f*Z0Bl!VfV!5|QDiBoHc!ch*&Y*$aMkF%#nJaabLAc?I ziJOO+uFXW4E?-=8LO>gi_9O5fjwJiz@Fl$gWD!!bN9v~I1aXi#j&35nI5?w9w_V@V zus&I3rjCc0lSvn{lj6aCRs&nDXTZ)>(tH{Zblm=@k1eK*_3n`LcC}z1=i;0l~Mh z2I~wwz!V@0Dn%5)s#f3v`OlHEX26&poi;fT_**e209@i!R87TJIX-JqYZa z!5ST!zs!qfJNh=wUm+g@?s0Mk>ij;viynN>V5u(2w<@f@?~;!}h%JnjM)m4f6=r_` zv1EOU<^1}S-(LMe_tEf`kDlnp3QHOaho6CI2rtxwtH)YN_D}ge6w7}+nF$*pP(Z2u z;J$ibBlQZ9PjOa^l;@%|P*$f7}MuAzUGGk5tY$p?Rx|b#%*&j}9B%WTLv1HEtPJ(QP%+F6= zw--rnN66exTr8GJ50riIfjtS`=}6ao5sFOc+EW0G?DMu?;o>$5-2jp@B+E^1ZJQN4 zE8s94_qk(m9XmTfTL(DLw*i1>d4JIL34@r_ok9>RLg*e8H5Oq zK#_^*VmZi?0|j_hlf?nUz8(OIJ>f`E;vIl=ic18p6CxFuA@-0g>)n!ABEND98|%%I zUJe$%ZWgF7{I4zBTjg57C1S)n!mDtpG~h(^`GC#}d?NZwg}$iMk^BjI0m`-5jRY_;uiKBpKxF{n^zbVd$}_ZR`QSQW$~+zwxuiNoWi@7b>nQg;c*a<802J~)m0fT>K&>7SkcpOjV1MaMG=BXRFCUQmo zj7N32V3W%>v-Hc@Se_VtqimO1xl>rx9HfhLBVXq6#*13U(8gU_EUz9W(<$7bapKAt z{wf>H+U26o1^b`gPm?r9)MYcD-%lMSGWnQ!I1`raeDdd9G`V;mh3>6v=|qVybORga zi>R*6lOWc6>XHi2JsB=g3*t$ldnQ@PQ)~$;9QNc7Sniu#{E&;cxcDg-zeJ(CWzJ$w zkbIj-t#dHYgX;_b1v50u1xejr9VFpj^Avbb9vi>=J%*6gs^gYtFI0^G!UEkeUO@n$@kT v$R3+BDJN*lPr2YM?ZPe>Fs7T23S%EKQmR`hHY;6t+opB-*|jz+gX(_)cw#}L literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d58ded0237979e3a5adefdd3c42197f334707e3 GIT binary patch literal 3020 zcmb7GPj4H?6@SYmxgk$sT&?sb3+d{@yGpQ|hTCclhSb`#4vo^^NrCpkJn|+6* zM`@2{y=LDf*{5_svq7`>NN!O&q}dSr9>sl%2NZA7F+`5&t9VH9i2eYjBNAP@a%pyl z4R|rW^B-78W2fE@k900eBZ4F?a%G+aH+Xd{gnSZ4#{xU=NuH)*76Tl8nX5E3Px8#D zTmsRZDLTscvl z4SamQDNRutKgqNSr4+GWgwaX35E>|7iPvSKL@F|){kipcIUmJZ(-kmT&R5E|2{8Fl4ttc>f`_0qVIOZnfdha zP@n55VlR}6oK+Y(oFhEjc=RX08vGo(Ai8SNvPBnwTl5zq2dJe>O9U5jM7R-az=*Pq z=>mzfkyKZ$&IW@`EoMMQ-D23bS-1mjn+$g;-nAO`EW&5GStH z7vm3~SFMSvMw7`#R@CiSXj2b2P`d7h5#J^Li$Y{^?ZsjqmeSN-Dopq$RCRlvNKvQ+ zev?$l$;>|zeyNd%DGW&pNHR$(^b|hLtKnoaPqKI-lk5Z)%5c!Y?#o|)U44dyv)|_f z*0E0h1ON0miH`l#L`qf=#xXRQym6;71PWy3O(rsrLRoj3zkxQn5`j^r__BKWY~Ga4 zn?#v1lp=cr0ip4aL+vkQeiTYSj3S}+fgk67mYbE6t3!Ft^>(Xzr&V_{fy0P3uhqdf znLJmRi3V|Q*l9$`*lZ`1?n4_n#O!zO^!;#@s~$q%>-J;y@Md#%3Hce<;u=ibxPvl){@C!3xSKKtjnbnF^w%DX!>nfHHeFHwvP;z= zoqa@Rhc3GGXQHRyKA=mF%w1aU(sGY3&?^UYpS8dK2fccQ<^)O0cfd`~?`*5udR}jB zbR@M8m+OHoy&y*&)P2tN1{`og2TCl&S=~$U0uW+a)mwHl2N4f`WClpoLl)u;#`jc* zAr~`UxeWC!RS+jidDyG>8QCq17?RY7ylKZtWE9UJYl?c8Ax?(+{!07XF}pHlv^FJ3 zb4)Z=ZpS9{o}amyK`o$YgqiS06;#mcD8;`wwms@l{Gay>%Zpoj$lpnWM{Lp5cXP z+T2ld`44VVl_r5WXe>h0CJVRoYPVnb7x*K~GcjyQFzeA!;C;07Iin|o| zSUFkexb}wqKM^zyEwdUPs3NVj2$HNUq~3wfyH#Xan8y%XcXoI0?+$G<`0D0^`@3K7 z-wE#B+`DH6d;7chckb4UJ9}{KOA*FFG_UfI{rBfW2|o&R|3LVa60!d@(Q|(^s<$UOwo7qTB~oM} z*UFzJsql5-#|8AI2z7Xniu$A^S2|2nwLI9ke8S@5Rw;{_|9w&Fq{!7H|2m&=!yk{w ziz}zWvZqiS?7xCk`}Prk49lSD|kX&L6GE$4g%AOvN!;^%Jjmxmhel7UM1OLPxr7$a?>tDsf08e zAW2Bg8{ihqWKoqv$GA$QQ{#qmri}ggDayGU1W_6)6$HQ0U)Q&FR&JL`Ia+c&`b>QK zd8|dj%6cFiEo2_1+fmayYMV(Nm(S%o!gvQmox?=d1*?mw%Hi0h zV~2ESDS+7%m#m`^J*)|~cNS|~>RPWU|1ThJsbN=c;;*J(N+cOn3Qc4j^&A8%9fJ|+ z!Yupj(@u-o3^=<E=)&S@&R^LPnekc!=L>^`WCD99ltca_W<&_{fs={<>@q!>OBB)(fm{yaE zrz%``@;RzwmZMUGWy1$gME<0vPri=`UdK1I(Rp8q|V~x literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/help.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/help.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad82322bb612a5ff4614407df1299611ab0cb2f0 GIT binary patch literal 1273 zcmZvb!EVz)5Qb-M$96*kMU<3E2w6xRa%g%%0-*{aA_QEx1O()=a^r1qvDaqT1`;I~ z%9*#|fW#B+l@qVPiGS?|6~x9f*_rjsemk???f1LeUxj$+5&fWZ12#Q?=qXf!hfzk9 zGnz7D)^;d!D0gY)o!0g!^C=H#8W4M&bSUxZGs1ilE}bGQq$HrpF#L)9 zG-T#de58x4t^`l>vQQOV!MMotSSEHlc`+V8noKb5op~QARj8Sb-V6tm2M~P^N{~eb z>D00Czy$KtqXc_{#-piEzycnafC4zn6oP5XTzDd~@@${wVDhH;5WRsXIxbW+YoWC9 ztZO;wM$NcYs$w1;o~_!Lvm$n>~mAGsVC>bWDF!5uT*8%IwTV z#dVseS*-YGX}MF&x3c&kH|2|N-qJUhJ9)e~649clqg=$YYQ1i>9}T-^P^RUGr?L`C z#@T3-N`=@~+2Wb*Q<;d5%|%e2b@*{v3Yn;mHN2A|mBue)rG+xxQXv($Jwt;%EwW=1 z6lIkb60MBYT%SuE&hmuII2WcfuZ7me&Gp;_X9(X&?P7yphX++&9)NN`mAZxiGG(rli7j_X`xeYWNFSkLJ*pIvsY;=k`KFFirX zxV?5GL_Na+Lf-IkZn~W3MN(%1^B(8#>NvCHumaALVup#=9;MdtT$n)D_^Q;xTuJA$ zP=YJ*u1@j)UdZ=q4=l~;&Z%qG=R?`b>mF1Oc)kOHZdNQ3K#uFGMkcQ8r)X~c)4(hp z9mQH~E`_om!v9`EEvs7NwM6K)uh;(0BtFhW+qtIG4Z%5H+Z<(~O?cRr=DxkE+Tw3J I+YCSVH>!$4Q2+n{ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/install.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/install.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f27b85defeee6ac079c2000fc81e394a910adcc GIT binary patch literal 13231 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 VNdXG~TP@F*=E|%8&|Yk>{V(`K??M0o literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/search.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/search.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b5afd6c63934a915bdbc999587ba781b0d13682 GIT binary patch literal 4592 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/show.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/show.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c44d87ae18514bbc888007cdb4996843dbba2643 GIT binary patch literal 6437 zcmb7I&2t<_74Mn-{_@I_EJwCuk7GN|2JbqAkfdC~*d+8Nw5yYlu}t7}Pd}XNpym$579R)eP4&!pn+oPORqQ zd0FA*MYkYU3voLqyrSrq#A+#S=Y>}m-HKSP#O;Fcs-jyHt2NO*Ay!WaLz-f{F64xG z4(cbxUAHLQlK2!nl!UB^=O8^P+_G>h)VVq(+$#UognL4K3MQwC+m%NBKRAkL7`pDP z2fjB5rQPZFeHAXDue>Ow`_NH=RA|-uJDawWfj>}f8KC22+v)kePTTQ1k+geGSE92p z?{~XS&uy4GcV~I|!Llx_{B(Z)&dN%gD5XD{q!QdmMS??v1Vy65c_1`!m=!KgkrQrK ztmcIa=@rChLTq3rng#J2%*UzIgF|*0U1^kcWo65Mny?Y=l`Z^GkJagI_^RuK9lvKe z>;53L{GPOYWp#ZeF&c!9=SkPFwnJ~5!;X`ga;Wzz^FsCEXY`dFqY?L zmZ#>#HU=uR6P95!GVYZ|bty8N8&RRz+~{~R&{2eT4ns%rLQWspg z;S9WRQD?WL*N@)gQ-+Y|#=!F|uM-|o@nP{N-o_yzhH!Bx|Kw7ZO zCmmN>PAYJVe3=}B{s%2xCQaF~o(oT;TK5ClDC)fDZ*EGZ3r`)@>-08N0qpAOKsu_u zWv5;QIc@j|9t!fJ@Bw=WR24JTc`Ax18aZ{EmKGB4Pzbz2=XM8DJ=2AB%~_hx1<6)t z)S!12m4KuzAl#afHS%WF$QWl)i|XTI##{sj*bJQrHdD6kuI~;!s#k4$ci?!*NWr#U zzm4uJb?Dq6Kq%0KU;rJ1o2kxbkL+8?-9ZQcpUB=5*0*{cT*T}Vj}1eep$=k|4VFwH zIDw*?gC&@34d!Hp$A%tF<7Ir8X!1WzAv!{QVTirUiT)SXX2k)#+7O=`q)}2ZtAB2H zLOhP08{r;)yFfN!ioM^PpBWr7Ii@0H!ft46VNID|AX{X`=j`MN22_Fl)p%pemjQnXNW1}!L2{sAd^D(2t zz>XwkQefXN92r2~Iy4aT4H74q#9x_2C24}CUXPi^ggQ_7UCIMD4~7IMj_f-eIC*4X zNO1BnL2iOza^fi-{YOfTn+HX)k3Yz4TFfQ$PVu}~%)NJbC4|F03u~9eK}qbF#CDbB zt-dmbb=qJ?%st%w%6J^sX!M{g_RC`XgxJr~b_O+YJ`7aE-bLYBP%{jsD)uX4dqV7E zOBfI0LRHM|-Zmd^VrEV3-JRJDA6{i9cg_8p*q$P$LZAljgx-H`idiDM zyK6qi1mfcNZ6pCVE?gjK_#K*?&DonJ52y`*}FDJ#j4pM=#Tp1#T2G)l1 zyJNY)Ma)s1^#SM0mi3V0hc({G(dioRgqRc{x?i(Azs>pmnuUNowi(B+mUVBK|G=Liv@cDun-?n_Ob|yXBLGdAt+&+oP#wh> z4lXasa}=EkkKFt*ZA&ytB6{OxVYoF%0`h{JsHBUIF*ilKP&7-JJC}wWA$IaYaeM%y zv*T>WyqfAdmgx+DA|=$J{9=|l6uyNCw~0W^CZ9-CP9gp2VyZt~OjUD;y$n{e>}F9( z*sCY(ZHps<(^Vw4ZRjC}rYUo->>m-KBBmBcOfBjB@}2ny%L|8S5A}9wL_3YfpzQ*6 zae_|e(lB2b*J9*i0J#7yhK+;=!+RMAOCt^r5hne!PTm+1KA#v2Fadxb#T3r=2)^T5 zX=JtO1E=-jXga&?cY5j_>@j4c4=rWcl80%PWkIkbQP6kfgfbH|bBq%;hfURwP*6tq zh^2966xl9}{T9tS%*{h|CEV!ZM|U3GUby|}c0{-?#_J>R{Ep0iz1T*~s+*v$i*Rqo zF^TBDf!m*rxc!dod>h#*@||xfx1WzViHZ+DyxY9DwD=&JkiAenv->cHFrbj8tK&Vo zbZ=?p(e3;9?<|iTSiP9&B1pSV=rj{oRZZ;vqO|3AWwTERDenxzEnmH;#{Zj=?nS!b zb=ndDJgUwUw(e|nq`G103L|Z9#aOVBS9j@Tw5$4nihET2go+PQG-ed}pRPRh)efMh z9mtRaqk5O7{D2BFZS_N%Rqh0A9lf^H(+dc6_Yj%sf0|Epb;}9t^h|nkQ-;Hq?R9#% z+*HT=;J;YgR}_DAb_2I!oojnQ!8(I!xbu*A$Lnzaaa0&Q?ZD;oPQNdEuFiN87m@(C zYUwsksLRAC*}JYV#O3%D=t6>+b%~M_*udqgIOH)GZ=WN_3Dg2JLS4E->;P@kEj_-Y zQy#M2PCL|@9r;Yr4VzsG#(RtEZ&Sh1_#$c~HoiTILf)7#PMcGvWzvPEWL#jFI%(F8 zx-o@o%q(h?8EVD#I**i5&KOm!&1FkK;e^1;#_3ERYwE^Dql{f93`MjShu0iJxdnVA z(cn)=1^}->m3x0QDGhQgU0C~-`3Y`0fSW+0eBGh@O-AehW89>hE~lgs05AX` ze4|C^0kZupekouO3qXm>5$;5ciu38x62&UaHj=G?rs8dYBY}3!@iAbicnm=F=osTK zB40l~2GkX=1D-s(ZZaLi>&(%y>2&PW@v)h7?DX-mSA;uDSUsV7hO#7`1i)f+(6i|z zP>lz0D^Ty6i5$+Qt6x37|M_(6!tpVSRk8PGI^|+Qd|_=y0C6X~zeeDmnA!aoaBQr^ zOYzFL(v_EoD*--=V=Ied8;fJD?alyr;(9Taj$b*l%j@I20KCSuKp*IOw96;vWA}9; zyi*w4>niWHJ0%_iyRJ0eh!z;w#VC{jAURp`nDoui70(%io*M(f#YYSXqD-^djG>Qs zd6IY^ZUN1~5!PCi>S3q=81Ru#86*O4KnP^bF(QK)fCQ4%-!KpDNgnpCF%vVD;)4`} zxi3R2za_^_u;#Txm;0B2%rU%)-6=?O;7-%&_tAmmKZ3U$od}k}lSPn4Q4$#=y7+$y zMa3mt+izG`f~fLwj4G+Y86v8z#J70vp;QyqK1dT7FB#>tsC=9A8Be8L6ivh(abn}y zhf-ZsxgV!GUO_o4s@_j-Biu!CHmWYi?*;*HU|zFW7EwLvcAM+Zcx3vcG~bRLB083Z zquRX$1tF{AlmueOQ*CgAqkoje`(qH*?ojG)#;N}X=a4ABNKbh;_(3MRIPdg&ei+}P z#$H562n(-1CD|Kv`HG}2fSk^(6v~gcWp-p^93kEs|Fjwiz~;*U)=_FQDWovUwz_Jd#n(oHWm6 zCyaB4ey<>z<&om1&|AaIX)e$3Gt#Va2J225igs+AqQ|0*K{&u`kFCh!fokyZMGszc z)T%PnX~h{hh6okhBwO@0mu%5p!JeTz#HKpz%;zZ@(Ub4sp%4c$$fsGQ&+K)b;XZOoQU~oV{Sb}+`2dyKaAZp Zuqv2AF@ZNVWOs9dzZtWhnYmoO_dk6xvPl2{ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cac9f1a05535553cea8aac888e6dd047c4d44a0 GIT binary patch literal 2792 zcmZuzOK&5`5w79zEphd7)-g7)8%m5U0h0pk05%N4d3c=%5-jX&3?(!cqtQ%LY-wKV z?$LvgE>VymIV6Yth8*&1a-VBXIr*MbzUm<w{`Nnl{QCyc zziI8$ME^&4&0o;O_l5i&ANs%FG(feoNJ&JReMTo(74^Sl!b?=T=5GC{$4|q~;e6Lg%=T|0T zKbIeW(J?(xgp)BAP-5!#4d9k{yci?Q%#aU0!`L z>{Z)eW(zkLXAFPh5%mQ=s})g%(Rp|(&A9It;I>dkgeQp-6tOb4v??*HU2BT2l%0v=Tsm+6cIJtR^GqJpsNnRWu*ZZs9DlGFa7mmG)yq}7%@;U}D#o;2ZpNR3e z-X+AVG9xVx*Ky@sb{pn8)Iza-J04Nfr!NwF;Rl#^y zDR_Vb+{{~}(Ty~f&rRRhT+6`fQqJFhmS^9$A~fe>nrji|*;MJ&aa-imHM+zyk&X^y z&1oBUs+K8%HQmFg>IQ+zlnsKa8>Mjor(h1& zWLh;teQK)4`4!4eF9@O}G$siCN&o%vflZ48FnP29{^&#bgO6e>bDnfB%!4dhm>fiP z`7;MAOoM*$J|qiC)J8`O5a1SQ^%~D!?$d+1``4&$@2nEseHr;J>s3-#n*In1Y&*h>)$$hZ9K2K3fEc)z*n6`v8g&n8UuXHfAzb(1e{T* znFRtx5cLwH95r!`5nL?aed_K%Bc2*5#XgsPCfaI#e^@nHq8hmS>qcd#e5F-BH=AK; z^I!q~s&gszNe-Mkpl?-=f|F7uaj@`8caZjKuyi|sKB>QlInDUco7}XyX`w->P?6PL z?zS((q?AVYd2x?tdbK5GZ>l!qR@q@sKjGzlZWycjyDYea)0zN2u0ZW9RzBvdF4q-z zww={-P=t1d%LmAU4%Y})1{9gFaS56pzq^(>_fue z7J_+&fXi-FTlhu6tn?eu&3|xjMJKtPJMqK(|)s6Wv w5N1$zBh+70!{`;=&b4u>OynTrj`k3bwLEqY>mYx^7&Tmswi|emLihOp19_GIy8r+H literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e15a86739bdb1864d60a655c71dc9dc003728d1 GIT binary patch literal 5231 zcmai2TW=&s6+Yc_zx%TGdar3hg5%&BBNRlk+Fd~|3qestvXM5K2wLsw^0;UFma1-h zJz7gBM({?&EAKq;9`R%9l_#EfLP&W)e5bm{JGLRrxXV?iPgR|B>eTmD&GlZdz4B)v z!dpatqoq$3^`GET|3cy8&!UhhvS@6P#ci8Ho5r?zhkAv^6;rQJSf!{&<65CtrLay> zgT{@bU8Ar`QH#c{qFtx3O;Lx&9g4a%?iSJpg*}S;H0~GeCWQlvR%pCZv|ALeQnW_n zwW8goaGj!SG`?1}I}~nEv`OR5qTQwNIz?MF-XcrbG`m6KCY`~XTl6!(M}D7v3!nNV zT66|iZnJ-ncLsll^R#2>fw!-cFwcY=L}?r0)XlX_A}i2F<8 z$0EBl%O}#CJT-dFj|FT!GWFgkB1$o|m}H4OL6@#E+RP~AguPpQDrH4ILPZd-GnSbb z7*WE~VzH~_BQ`bit2D0D?}-kegJzw62h9fg_-k??$4!3wc&Am)SNiRJZ4tE{e2f8( zvBmM^vQ*vM+cUC}6rK+)el-e`JrVDP zUM5twSNO8Du;{8pmZw>ggzDjgAB^5CJSoO0)VI?hb&O!!$rS>}{_XpL%G|<)7b7_0 zSteqItaJ`!5*baSV+>w|EK5ubeK_g|M}ePvVKM$9*t%vq&Hrh-InJx8Os3A~WxoH) zxxchxj!MNOI0%G%=!{0A|IuS8FLc7<2ch`34xbMN<~f=u2XoJm&rUAG|KA}@CU9oa zCH1nyZ|ifv%tao1?_7EQN|CN62C$R^c_mLr6Xdq})KGTt4Dcx1Cd%+<(Q~3R0FO=2 zQMc(2L>5G|3Y}Kyd4*=!T-Z(6ZrE$6n{9;+mDOlg=WXQ!ne3`nsAdhCHR%jP0*zmY zpmJH%z9{nBW`d5Hpi2ex@#q5#wLE&~Vn3d+dsWoCD(YVqVeHFhty~qYUKOof6|G+s z`76es)rBVr8@z%)=z8vtziwV%GXS+=UT@-cWhrvkE)L7?ZY)IH*d#8m^D54^cp*=# zWgS%FLtbT}SH`6E%LrT+G$NqNktcP< zw0v>k^+C41~|k zZG%3e^kf;5wny{9a5xQ_Y047W|h9*tPRHu)9N80MIW&u)TzX z+YZp3sdqH54Tq@|x~)Ki!p&qZ9?d^{Kc0lSFMtkWC`BkdB}%qA5@C|EgAVYY(Nm3_ zw@()F-E|m%lQ=v9YQ?^Czz+MNc%ds93U+Sl8sZ|P?4zZdt{cQb=DNCxlL9-fbldYy zjU#L)O4qSsSR`5H4y`zG_k-AzC%VIPEgC(T3sze+*I130(hb1+o>{HV1QuhRkR?ht zg&!FEbax4*m98i`(VM|E=7^MUl$)Mphp?uBQ9-&&w~DbjA-fFvQYhu_BS)Lim>_1c z?w6h2Lr)zFrB@^GsVG;~oysInbq8S*&&oy}2O1@$UI(oTnO)G_sp+Z`;eoCq#gw+6 z9?QENjCL^qM-7LVmW!!97~=kgzIm{hMd=<^WLVPl@W|R@t0f0w_z8Or4ss!Z=-Tvt3t!P>0*re z#uIZ^EYoq33X=-Yi4Rl7n|R*AqyAJ-#tbxJ0i^&c7SqPmw80nGnJ^%#lKlCC9t?BL z8U}OF2}m?0LoCp1k_;$o(X36gj_C>JFoU_xi*f*bA@3S&>y-w4Rk2I7>$9YQy3?8& zYC!4N<(S>mI%O-Sv1&>{FmMtSW-$A!zgnl5?^>zt!wK-3VY)NR{_2m`X^S#|bKNKa zpUFCH)BK5b@t!7y0s4(Lmw z&ti){eF9Qq`v;_cWAnhT^QaaKn|Z0SPN;eXr+eu^jlmTHfIU#zG<7{p zrc*?v=8OG&s;jdkh|M}k2gc|spKf&n*IKT~hb-%t6D{JnQMSu#f?LGdI3pRkbjyU; ztYW{ocDZ1lOeUdhE~s2rV=of2$(pNN@cPT2a=`~_ z`3o*gynBn_x>4c_-2fe#t8R}q&f~3XCcyGFNOk?l3v;1lomCnv=^5V2Q#cfYuNq}@ zXCU8To$Fluh!soL;mFGOSo$tYyCo%>RF`~PmT$AXb$-6mgC(YA2PFf$ZZ53V_VK>H zQ7pNMF`|%9CP?3dJPc3dTRf&I?s310%;Om<3Kt3N(jF+NW!%~2EmydIW1r?YmC1s7K}`!^ z+2I{aG7n1j+nk#=P*I#m-Co_U*YVhE_syG~J3R40p5-{dxDuoZh~cCME)_Yx4*nmV zbN|RBt4ZAP>ZLbfQ0%+ASLCC8oC=ZE<{T;cYKJtwFsyhs5ykI5ODV=D#HFbd90SeK zOpO+>#mRoz4rGnlF8a>J?vUdrgmdgOn@ew8)+u%ZZy0_1;=4S] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + summary = "Manage local and global configuration." + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = None + + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help='Use the virtualenv configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".join(sorted(handlers))) + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + file_options = { + kinds.USER: options.user_file, + kinds.GLOBAL: options.global_file, + kinds.VENV: options.venv_file + } + + if sum(file_options.values()) == 0: + if not need_value: + return None + # Default to user, unless there's a virtualenv file. + elif os.path.exists(venv_config_file): + return kinds.VENV + else: + return kinds.USER + elif sum(file_options.values()) == 1: + # There's probably a better expression for this. + return [key for key in file_options if file_options[key]][0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --venv, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + logger.info("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + logger.info("%s", value) + + def set_name_value(self, options, args): + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/download.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..b3f3c6e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,174 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + name = 'download' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + summary = 'Download packages.' + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into

."), + ) + + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + cmdoptions.check_dist_restriction(options) + + options.src_dir = os.path.abspath(options.src_dir) + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + self.name, + None + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=options.download_dir, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=None, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=False, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/freeze.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + name = 'freeze' + usage = """ + %prog [options]""" + summary = 'Output installed packages in requirements format.' + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/hash.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + + """ + name = 'hash' + usage = '%prog [options] ...' + summary = 'Compute hashes of package archives.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + logger.info('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/help.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + name = 'help' + usage = """ + %prog """ + summary = 'Show help for commands.' + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import commands_dict, get_similar_commands + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = commands_dict[cmd_name]() + command.parser.print_help() + + return SUCCESS diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/install.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..c9ed3b4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,555 @@ +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +from optparse import SUPPRESS_HELP + +from pip._vendor import pkg_resources + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.cli.status_codes import ERROR +from pip._internal.exceptions import ( + CommandError, InstallationError, PreviousBuildDirError, +) +from pip._internal.locations import distutils_scheme, virtualenv_no_global +from pip._internal.operations.check import check_install_conflicts +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet, install_given_reqs +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ( + ensure_dir, get_installed_version, + protect_pip_from_modification_on_windows, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +try: + import wheel +except ImportError: + wheel = None + +from pip._internal.locations import running_under_virtualenv + +logger = logging.getLogger(__name__) + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + name = 'install' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Install packages.' + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.) On Debian systems, this is the " + "default when running outside of a virtual environment " + "and not as root.") + + cmd_opts.add_option( + '--no-user', + dest='use_system_location', + action='store_true', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option( + '--system', + dest='use_system_location', + action='store_true', + help="Install using the system scheme (overrides --user on " + "Debian systems)") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + cmdoptions.check_dist_restriction(options, check_target=True) + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + # compute install location defaults + if (not options.use_user_site and not options.prefix_path and not + options.target_dir and not options.use_system_location): + if not running_under_virtualenv() and os.geteuid() != 0: + options.use_user_site = True + + if options.use_system_location: + options.use_user_site = False + + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if options.prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + install_options.append('--user') + install_options.append('--prefix=') + + target_temp_dir = TempDirectory(kind="target") + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir.create() + install_options.append('--home=' + target_temp_dir.path) + + global_options = options.global_options or [] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + check_supported_wheels=not options.target_dir, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + upgrade_strategy=upgrade_strategy, + force_reinstall=options.force_reinstall, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=options.ignore_installed, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + protect_pip_from_modification_on_windows( + modifying_pip=requirement_set.has_requirement("pip") + ) + + # If caching is disabled or wheel is not installed don't + # try to build wheels. + if wheel and options.cache_dir: + # build wheels before install. + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + # Ignore the result: a failed wheel will be + # installed from the sdist/vcs whatever. + wb.build( + requirement_set.requirements.values(), + session=session, autobuilding=True + ) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir.path, + prefix=options.prefix_path, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir.path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + reqs = sorted(installed, key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed = ' '.join(items) + if installed: + logger.info('Successfully installed %s', installed) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + return requirement_set + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _warn_about_conflicts(self, to_install): + package_set, _dep_info = check_install_conflicts(to_install) + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/list.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..c6eeca7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,306 @@ +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import CommandError +from pip._internal.index import PackageFinder +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(Command): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, self.parser + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls, session): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder( + find_links=options.find_links, + index_urls=index_urls, + allow_all_prereleases=options.pre, + trusted_hosts=options.trusted_hosts, + process_dependency_links=options.process_dependency_links, + session=session, + ) + + def run(self, options, args): + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + ) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + if options.not_required: + packages = self.get_not_required(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + dependency_links = [] + for dist in packages: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt'), + ) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + finder.add_dependency_links(dependency_links) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + if not all_candidates: + continue + best_candidate = max(all_candidates, + key=finder._candidate_sort_key) + remote_version = best_candidate.version + if best_candidate.location.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + logger.info("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/search.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap +from collections import OrderedDict + +from pip._vendor import pkg_resources +from pip._vendor.packaging.version import parse as parse_version +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.download import PipXmlrpcTransport +from pip._internal.exceptions import CommandError +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import get_terminal_size +from pip._internal.utils.logging import indent_log + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command): + """Search for PyPI packages whose name or summary contains .""" + name = 'search' + usage = """ + %prog [options] """ + summary = 'Search PyPI for packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + with self._build_session(options) as session: + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + logger.info(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + logger.info('INSTALLED: %s (latest)', dist.version) + else: + logger.info('INSTALLED: %s', dist.version) + logger.info('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/show.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..f92c9bc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + name = 'show' + usage = """ + %prog [options] ...""" + summary = 'Show information about installed packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + logger.info("---") + + name = dist.get('name', '') + required_by = [ + pkg.project_name for pkg in pkg_resources.working_set + if name in [required.name for required in pkg.requires()] + ] + + logger.info("Name: %s", name) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + logger.info("Required-by: %s", ', '.join(required_by)) + + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) + logger.info("Entry-points:") + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): + logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") + return results_printed diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/uninstall.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import install_req_from_line +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + + +class UninstallCommand(Command): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + name = 'uninstall' + usage = """ + %prog [options] ... + %prog [options] -r ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + with self._build_session(options) as session: + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/wheel.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..9c1f149 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + name = 'wheel' + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=options.wheel_dir, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + # build wheels + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + no_clean=options.no_clean, + ) + wheels_built_successfully = wb.build( + requirement_set.requirements.values(), session=session, + ) + if not wheels_built_successfully: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/configuration.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..fe6df9b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/configuration.py @@ -0,0 +1,387 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import locale +import logging +import os + +from pip._vendor import six +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.locations import ( + legacy_config_file, new_config_file, running_under_virtualenv, + site_config_files, venv_config_file, +) +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + VENV="venv", # Virtual Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration. + """ + self._ensure_have_load_only() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = six.next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the currentin-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) # type: ignore + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self._iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self._get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def _get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def _iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + # at the base we have any global configuration + yield kinds.GLOBAL, list(site_config_files) + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, [legacy_config_file, new_config_file] + + # finally virtualenv configuration first trumping others + if running_under_virtualenv(): + yield kinds.VENV, [venv_config_file] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/download.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/download.py new file mode 100644 index 0000000..96f3b65 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/download.py @@ -0,0 +1,921 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.requests.utils import get_netrc_auth +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote +from pip._vendor.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models.index import PyPI +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, + display_path, format_size, get_installed_version, rmtree, splitext, + unpack_file, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import DownloadProgressProvider +from pip._internal.vcs import vcs + +try: + import ssl # noqa +except ImportError: + ssl = None + +HAS_TLS = (ssl is not None) or IS_PYOPENSSL + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": pip.__version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if HAS_TLS: + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True): + self.prompting = prompting + self.passwords = {} + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Get the netloc without any embedded credentials + netloc = parsed.netloc.rsplit("@", 1)[-1] + + # Set the url of the request to the url without any credentials + req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + # Extract credentials embedded in the url if we have none stored + if username is None: + username, password = self.parse_credentials(parsed.netloc) + + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + + if username or password: + # Store the username and password + self.passwords[netloc] = (username, password) + + # Send the basic auth with this request + req = HTTPBasicAuth(username or "", password or "")(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username = six.moves.input("User for %s: " % parsed.netloc) + password = getpass.getpass("Password: ") + + # Store the new username and password to use for future requests + if username or password: + self.passwords[parsed.netloc] = (username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def parse_credentials(self, netloc): + if "@" in netloc: + userinfo = netloc.rsplit("@", 1)[0] + if ":" in userinfo: + user, pwd = userinfo.split(":", 1) + return (urllib_unquote(user), urllib_unquote(pwd)) + return urllib_unquote(userinfo), None + return None, None + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class SafeFileCache(FileCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, *args, **kwargs): + super(SafeFileCache, self).__init__(*args, **kwargs) + + # Check to ensure that the directory containing our cache directory + # is owned by the user current executing pip. If it does not exist + # we will check the parent directory until we find one that does exist. + # If it is not owned by the user executing pip then we will disable + # the cache and log a warning. + if not check_path_owner(self.directory): + logger.warning( + "The directory '%s' or its parent directory is not owned by " + "the current user and the cache has been disabled. Please " + "check the permissions and owner of that directory. If " + "executing pip with sudo, you may want sudo's -H flag.", + self.directory, + ) + + # Set our directory to None to disable the Cache + self.directory = None + + def get(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).get(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def set(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).set(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def delete(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).delete(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + +class PipSession(requests.Session): + + timeout = None + + def __init__(self, *args, **kwargs): + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + insecure_hosts = kwargs.pop("insecure_hosts", []) + + super(PipSession, self).__init__(*args, **kwargs) + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth() + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache, use_dir_lock=True), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + # We want to use a non-validating adapter for any requests which are + # deemed insecure. + for host in insecure_hosts: + self.mount("https://{}/".format(host), insecure_adapter) + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) + + +def get_file_content(url, comes_from=None, session=None): + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + + :param url: File path or url. + :param comes_from: Origin description of requirements. + :param session: Instance of pip.download.PipSession. + """ + if session is None: + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) + + match = _scheme_re.search(url) + if match: + scheme = match.group(1).lower() + if (scheme == 'file' and comes_from and + comes_from.startswith('http')): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + if scheme == 'file': + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + else: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) + + +def is_url(name): + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + # if we have a UNC path, prepend UNC share notation + if netloc: + netloc = '\\\\' + netloc + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def is_archive_file(name): + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def unpack_vcs_link(link, location): + vcs_backend = _get_used_vcs_backend(link) + vcs_backend.unpack(location) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + """Return whether a file:// Link points to a directory. + + ``link`` must not have any other scheme but file://. Call is_file_url() + first. + + """ + link_path = url_to_path(link.url_without_fragment) + return os.path.isdir(link_path) + + +def _progress_indicator(iterable, *args, **kwargs): + return iterable + + +def _download_url(resp, link, content_file, hashes, progress_bar): + try: + total_length = int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + + cached_resp = getattr(resp, "from_cache", False) + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif cached_resp: + show_progress = False + elif total_length > (40 * 1000): + show_progress = True + elif not total_length: + show_progress = True + else: + show_progress = False + + show_url = link.show_url + + def resp_read(chunk_size): + try: + # Special case for urllib3. + for chunk in resp.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = resp.raw.read(chunk_size) + if not chunk: + break + yield chunk + + def written_chunks(chunks): + for chunk in chunks: + content_file.write(chunk) + yield chunk + + progress_indicator = _progress_indicator + + if link.netloc == PyPI.netloc: + url = show_url + else: + url = link.url_without_fragment + + if show_progress: # We don't show progress on cached responses + progress_indicator = DownloadProgressProvider(progress_bar, + max=total_length) + if total_length: + logger.info("Downloading %s (%s)", url, format_size(total_length)) + else: + logger.info("Downloading %s", url) + elif cached_resp: + logger.info("Using cached %s", url) + else: + logger.info("Downloading %s", url) + + logger.debug('Downloading from URL %s', link) + + downloaded_chunks = written_chunks( + progress_indicator( + resp_read(CONTENT_CHUNK_SIZE), + CONTENT_CHUNK_SIZE + ) + ) + if hashes: + hashes.check_against_chunks(downloaded_chunks) + else: + consume(downloaded_chunks) + + +def _copy_file(filename, location, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url(link, location, download_dir=None, + session=None, hashes=None, progress_bar="on"): + if session is None: + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) + + with TempDirectory(kind="unpack") as temp_dir: + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url(link, + session, + temp_dir.path, + hashes, + progress_bar) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified; let's copy the archive there + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + if not already_downloaded_path: + os.unlink(from_path) + + +def unpack_file_url(link, location, download_dir=None, hashes=None): + """Unpack link into location. + + If download_dir is provided and link points to a file, make a copy + of the link file inside download_dir. + """ + link_path = url_to_path(link.url_without_fragment) + + # If it's a url to a local directory + if is_dir_url(link): + if os.path.isdir(location): + rmtree(location) + shutil.copytree(link_path, location, symlinks=True) + if download_dir: + logger.info('Link is a directory, ignoring download_dir') + return + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(link_path) + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified and not already downloaded + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + +def _copy_dist_from_dir(link_path, location): + """Copy distribution files in `link_path` to `location`. + + Invoked when user requests to install a local directory. E.g.: + + pip install . + pip install ~/dev/git-repos/python-prompt-toolkit + + """ + + # Note: This is currently VERY SLOW if you have a lot of data in the + # directory, because it copies everything with `shutil.copytree`. + # What it should really do is build an sdist and install that. + # See https://github.com/pypa/pip/issues/2195 + + if os.path.isdir(location): + rmtree(location) + + # build an sdist + setup_py = 'setup.py' + sdist_args = [sys.executable] + sdist_args.append('-c') + sdist_args.append(SETUPTOOLS_SHIM % setup_py) + sdist_args.append('sdist') + sdist_args += ['--dist-dir', location] + logger.info('Running setup.py sdist for %s', link_path) + + with indent_log(): + call_subprocess(sdist_args, cwd=link_path, show_stdout=False) + + # unpack sdist into `location` + sdist = os.path.join(location, os.listdir(location)[0]) + logger.info('Unpacking sdist %s into %s', sdist, location) + unpack_file(sdist, location, content_type=None, link=None) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise + + +def unpack_url(link, location, download_dir=None, + only_download=False, session=None, hashes=None, + progress_bar="on"): + """Unpack link. + If link is a VCS link: + if only_download, export into download_dir and ignore location + else unpack into location + for other types of link: + - unpack into location + - if download_dir, copy the file into download_dir + - if only_download, mark location for deletion + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if is_vcs_url(link): + unpack_vcs_link(link, location) + + # file urls + elif is_file_url(link): + unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + if session is None: + session = PipSession() + + unpack_http_url( + link, + location, + download_dir, + session, + hashes=hashes, + progress_bar=progress_bar + ) + if only_download: + write_delete_marker_file(location) + + +def _download_http_url(link, session, temp_dir, hashes, progress_bar): + """Download link url into temp_dir using provided session""" + target_url = link.url.split('#', 1)[0] + try: + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", exc.response.status_code, link, + ) + raise + + content_type = resp.headers.get('content-type', '') + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(content_type) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + file_path = os.path.join(temp_dir, filename) + with open(file_path, 'wb') as content_file: + _download_url(resp, link, content_file, hashes, progress_bar) + return file_path, content_type + + +def _check_download_dir(link, download_dir, hashes): + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + if os.path.exists(download_path): + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + return None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/exceptions.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..f1ca6f3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,268 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + + +class PipError(Exception): + """Base pip exception""" + + +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + prefix = ' or' + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/index.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/index.py new file mode 100644 index 0000000..c3861c0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/index.py @@ -0,0 +1,899 @@ +"""Routines related to PyPI, indexes""" +from __future__ import absolute_import + +import cgi +import itertools +import logging +import mimetypes +import os +import posixpath +import re +import sys +from collections import namedtuple + +from pip._vendor import html5lib, requests, six +from pip._vendor.distlib.compat import unescape +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.requests.exceptions import HTTPError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.pep425tags import get_supported +from pip._internal.utils.compat import ipaddress +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, normalize_path, + remove_auth_from_url, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.wheel import Wheel, wheel_ext + +__all__ = ['FormatControl', 'PackageFinder'] + + +SECURE_ORIGINS = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] + + +logger = logging.getLogger(__name__) + + +def _get_content_type(url, session): + """Get the Content-Type of the given url, using a HEAD request""" + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + # FIXME: some warning or something? + # assertion error? + return '' + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + return resp.headers.get("Content-Type", "") + + +def _handle_get_page_fail(link, reason, url, meth=None): + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _get_html_page(link, session=None): + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url + url = url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + logger.debug('Cannot look at %s URL %s', scheme, link) + return None + + try: + filename = link.filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + content_type = _get_content_type(url, session=session) + if content_type.lower().startswith('text/html'): + break + else: + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + logger.debug('Getting page %s', url) + + # Tack index.html onto file:// URLs that point to directories + (scheme, netloc, path, params, query, fragment) = \ + urllib_parse.urlparse(url) + if (scheme == 'file' and + os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + content_type = resp.headers.get('Content-Type', 'unknown') + if not content_type.lower().startswith("text/html"): + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + inst = HTMLPage(resp.content, resp.url, resp.headers) + except HTTPError as exc: + _handle_get_page_fail(link, exc, url) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, url, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc, url) + except requests.Timeout: + _handle_get_page_fail(link, "timed out", url) + else: + return inst + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__(self, find_links, index_urls, allow_all_prereleases=False, + trusted_hosts=None, process_dependency_links=False, + session=None, format_control=None, platform=None, + versions=None, abi=None, implementation=None, + prefer_binary=False): + """Create a PackageFinder. + + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + """ + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + self.find_links = [] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + self.find_links.append(link) + + self.index_urls = index_urls + self.dependency_links = [] + + # These are boring links that have already been logged somehow: + self.logged_links = set() + + self.format_control = format_control or FormatControl(set(), set()) + + # Domains that we won't emit warnings for when not using HTTPS + self.secure_origins = [ + ("*", host, "*") + for host in (trusted_hosts if trusted_hosts else []) + ] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # Do we process dependency links? + self.process_dependency_links = process_dependency_links + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + + # Do we prefer old, but valid, binary dist over new source dist + self.prefer_binary = prefer_binary + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not HAS_TLS: + for link in itertools.chain(self.index_urls, self.find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + def get_formatted_locations(self): + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join( + remove_auth_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + "Looking in links: {}".format(", ".join(self.find_links)) + ) + return "\n".join(lines) + + def add_dependency_links(self, links): + # FIXME: this shouldn't be global list this, it should only + # apply to requirements of the package that specifies the + # dependency_links value + # FIXME: also, we should track comes_from (i.e., use Link) + if self.process_dependency_links: + deprecated( + "Dependency Links processing has been deprecated and will be " + "removed in a future release.", + replacement="PEP 508 URL dependencies", + gone_in="18.2", + issue=4187, + ) + self.dependency_links.extend(links) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + def _candidate_sort_key(self, candidate): + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self.valid_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + support_num = len(self.valid_tags) + build_tag = tuple() + binary_preference = 0 + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + if not wheel.supported(self.valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + if self.prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(self.valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + return (binary_preference, candidate.version, build_tag, pri) + + def _validate_secure_origin(self, logger, location): + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin = (parsed.scheme, parsed.hostname, parsed.port) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + protocol = origin[0].rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in (SECURE_ORIGINS + self.secure_origins): + if protocol != secure_origin[0] and secure_origin[0] != "*": + continue + + try: + # We need to do this decode dance to ensure that we have a + # unicode object, even on Python 2.x. + addr = ipaddress.ip_address( + origin[1] + if ( + isinstance(origin[1], six.text_type) or + origin[1] is None + ) + else origin[1].decode("utf8") + ) + network = ipaddress.ip_network( + secure_origin[1] + if isinstance(secure_origin[1], six.text_type) + else secure_origin[1].decode("utf8") + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if (origin[1] and + origin[1].lower() != secure_origin[1].lower() and + secure_origin[1] != "*"): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port patches + if (origin[2] != secure_origin[2] and + secure_origin[2] != "*" and + secure_origin[2] is not None): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + parsed.hostname, + parsed.hostname, + ) + + return False + + def _get_index_urls_locations(self, project_name): + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] + + def find_all_candidates(self, project_name): + """Find all available InstallationCandidate for project_name + + This checks index_urls, find_links and dependency_links. + All versions found are returned as an InstallationCandidate list. + + See _link_package_versions for details on which files are accepted + """ + index_locations = self._get_index_urls_locations(project_name) + index_file_loc, index_url_loc = self._sort_locations(index_locations) + fl_file_loc, fl_url_loc = self._sort_locations( + self.find_links, expand_dir=True, + ) + dep_file_loc, dep_url_loc = self._sort_locations(self.dependency_links) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, dep_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links + # We explicitly do not trust links that came from dependency_links + # We want to filter out any thing which does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + (Link(url) for url in dep_url_loc), + ) + if self._validate_secure_origin(logger, link) + ] + + logger.debug('%d location(s) to search for versions of %s:', + len(url_locations), project_name) + + for location in url_locations: + logger.debug('* %s', location) + + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + search = Search(project_name, canonical_name, formats) + find_links_versions = self._package_versions( + # We trust every directly linked archive in find_links + (Link(url, '-f') for url in self.find_links), + search + ) + + page_versions = [] + for page in self._get_pages(url_locations, project_name): + logger.debug('Analyzing links from page %s', page.url) + with indent_log(): + page_versions.extend( + self._package_versions(page.iter_links(), search) + ) + + dependency_versions = self._package_versions( + (Link(url) for url in self.dependency_links), search + ) + if dependency_versions: + logger.debug( + 'dependency_links found: %s', + ', '.join([ + version.location.url for version in dependency_versions + ]) + ) + + file_versions = self._package_versions(file_locations, search) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.location.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return ( + file_versions + find_links_versions + page_versions + + dependency_versions + ) + + def find_requirement(self, req, upgrade): + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + all_candidates = self.find_all_candidates(req.name) + + # Filter out anything which doesn't match our specifier + compatible_versions = set( + req.specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + [str(c.version) for c in all_candidates], + prereleases=( + self.allow_all_prereleases + if self.allow_all_prereleases else None + ), + ) + ) + applicable_candidates = [ + # Again, converting to str to deal with debundling. + c for c in all_candidates if str(c.version) in compatible_versions + ] + + if applicable_candidates: + best_candidate = max(applicable_candidates, + key=self._candidate_sort_key) + else: + best_candidate = None + + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + else: + installed_version = None + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + ', '.join( + sorted( + {str(c.version) for c in all_candidates}, + key=parse_version, + ) + ) + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + ', '.join(sorted(compatible_versions, key=parse_version)) or + "none", + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + ', '.join(sorted(compatible_versions, key=parse_version)) + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() + for location in locations: + if location in seen: + continue + seen.add(location) + + page = self._get_page(location) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _package_versions(self, links, search): + result = [] + for link in self._sort_links(links): + v = self._link_package_versions(link, search) + if v is not None: + result.append(v) + return result + + def _log_skipped_link(self, link, reason): + if link not in self.logged_links: + logger.debug('Skipping link %s; %s', link, reason) + self.logged_links.add(link) + + def _link_package_versions(self, link, search): + """Return an InstallationCandidate or None""" + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + self._log_skipped_link(link, 'not a file') + return + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return + if "binary" not in search.formats and ext == wheel_ext: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return + if ext == wheel_ext: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return + + version = wheel.version + + # This should be up by the search.ok_binary check, but see issue 2700. + if "source" not in search.formats and ext != wheel_ext: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return + + if not version: + version = egg_info_matches(egg_info, search.supplied, link) + if version is None: + self._log_skipped_link( + link, 'Missing project version for %s' % search.supplied) + return + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + self._log_skipped_link( + link, 'Python version is incorrect') + return + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python" + "version in use. Acceptable python versions are:%s", + link, link.requires_python) + return + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + def _get_page(self, link): + return _get_html_page(link, session=self.session) + + +def egg_info_matches( + egg_info, search_name, link, + _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param search_name: The name of the package this belongs to. None to + infer the name. Note that this cannot unambiguously parse strings + like foo-2-2 which might be foo, 2-2 or foo-2, 2. + :param link: The link the string came from, for logging on failure. + """ + match = _egg_info_re.search(egg_info) + if not match: + logger.debug('Could not parse version from link: %s', link) + return None + if search_name is None: + full_match = match.group(0) + return full_match.split('-', 1)[-1] + name = match.group(0).lower() + # To match the "safe" name that pkg_resources creates: + name = name.replace('_', '-') + # project name and version must be separated by a dash + look_for = search_name.lower() + "-" + if name.startswith(look_for): + return match.group(0)[len(look_for):] + else: + return None + + +def _determine_base_url(document, page_url): + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _get_encoding_from_headers(headers): + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + +def _clean_link(url): + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + return _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + self.content = content + self.url = url + self.headers = headers + + def __str__(self): + return self.url + + def iter_links(self): + """Yields all links in the page""" + document = html5lib.parse( + self.content, + transport_encoding=_get_encoding_from_headers(self.headers), + namespaceHTMLElements=False, + ) + base_url = _determine_base_url(document, self.url) + for anchor in document.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self.url, requires_python=pyrequire) + + +Search = namedtuple('Search', 'supplied canonical formats') +"""Capture key aspects of a search. + +:attribute supplied: The user supplied package. +:attribute canonical: The canonical package name. +:attribute formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. +""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/locations.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..183aaa3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/locations.py @@ -0,0 +1,194 @@ +"""Locations where we look for configs, install stuff, etc""" +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS # type: ignore + +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def write_delete_marker_file(directory): + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) + + +def running_under_virtualenv(): + """ + Return True if we're running inside a virtualenv, False otherwise. + + """ + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + + return False + + +def virtualenv_no_global(): + """ + Return True if in a venv and no system site packages. + """ + # this mirrors the logic in virtualenv.py for locating the + # no-global-site-packages.txt file + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') + if running_under_virtualenv() and os.path.isfile(no_global_file): + return True + + +if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') +else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + +# under macOS + virtualenv sys.prefix is not properly resolved +# it is something like /path/to/python/bin/.. +# Note: using realpath due to tmp dirs on OSX being symlinks +src_prefix = os.path.abspath(src_prefix) + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE +user_dir = expanduser('~') +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.ini' + + legacy_storage_dir = os.path.join(user_dir, 'pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.conf' + + legacy_storage_dir = os.path.join(user_dir, '.pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + +site_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +venv_config_file = os.path.join(sys.prefix, config_basename) +new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) + + +def distutils_scheme(dist_name, user=False, home=None, root=None, + isolated=False, prefix=None): + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + scheme = {} + + if isolated: + extra_dist_args = {"script_args": ["--no-user-cfg"]} + else: + extra_dist_args = {} + dist_args = {'name': dist_name} + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + d.parse_config_files() + i = d.get_command_obj('install', create=True) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + i.user = user or i.user + if user: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if 'install_lib' in d.get_option_dict('install'): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python' + sys.version[:3], + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89bbab36a59a9a783cc3b6991d68b20f41728db5 GIT binary patch literal 215 zcmX|)u?oU46h%`PrBHBl&Dx>OBG^Hy{(y^{O9<^lgJ}|y=b-=N;4gLcFPwaB!3XDZ zIm3OcEK8R!fE{D(L;NqHwkKjr(K2?XOxP)(J*xxvs=28PaJ(wyjkBn(sE5f&upgNAJi!0} literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/candidate.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/candidate.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c68944d40758e9e4c3f885058bfb9d904e9c9fa GIT binary patch literal 1093 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/link.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/__pycache__/link.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3f583aec8d61a1bf5fd68068a7b6c1f2a7216b0 GIT binary patch literal 5050 zcmcInTXPf1748|0WJ#7U7;J1{VHRSrHdqFO_d;0MELm~`mxDlPFfO_^(X0vM=iZp`%HmJBrYvMtyuq~-M0&Gcc?&+odfiBhJy&Uo z$#~C=J5C%qeHCC?*1f=w<;xiJQ@@sb-@00Q_o6P)sW1ehO=gfPL#Bi`ok4(qLU=Q@gl_1DlfpZd?M^UcR(Nw6WKzf}u`?~a(@gXP zBg_kLAw!tS5Y8~dNk%v;ymJ}CsSM#0Mwn%U^TNB3AuyW? zm!T(LUeUJpyS+f#zkT$eYU8usvW5nvUovI^U){m5Z-^aulR*Nhvm!PKg83_+>(|{X2Yz*&&wT zlDG235MW1bJMKsuqDFnyl6Eih!&rKD9N9}9CEFPSiC)i7x1z4p4ryZaMnBZC8{!&V z`-{g9A8e3@;NMCz71rMiSKIBVA9`2qNZC48ez@JpZ&vbI-v>8NZ!hjd;pp|7jBK}} zFn0YA=lIqi9u3bdZ}6EP?5>Pm&y8KX?aKgkbWgT?%)OipiSLK@#&;X`jhkx?`*FwD zcGumrx8wn~y|o8J(?!b}Tgxe1Bloy5*xKsHl5QkrlH{qc#P0T08}fQmw}1n^4vDT^ zyKx}%zMSYh zeorbjM%ZP?!F{pg)UCwQGH9!DfK`o#2@I5goRpa3{8PNUwGwxGD?Pur%(e`IWmA`Hn&a+lZUH2VS2-5JT;PnA?oAU_eA|dKA*u z`e4>x%9J#;;H^bnPsCtyQQJ!#(OBc(Vx^?&Aw?wxIB4BeBvE3jo|?fV9ZnKx%yEDK z?P8%xsRE)-n)ocL^a>dU2a$X%PFX;+gx(f0vJj^%+&KsA*D#a?-51v187qUc$cpx&vU@7>`Yl93 z7$GzR8M<8w7q7vi1AoimESr?E;%AdRHL3I>?Z2dFH7Rf5`J^*RNkOH4FB$8H&-zg; zlgXcIEmiDC;de?!s$NVjW;jVHlyMNX5{s{}==c$BX1sh3?dU27VSZ|yH>Qk*Osg42 zuGJAEo;s>k=xu=vstB=OP-pOiWRHQ|>H}si=~hQ}_RF0qlv%$2;%A@ zsD68da;m)%%9MrJnLfcJbtW29^B2f1NO=5^{BOxQ5mqe!1&lz+n=;Im9S%CNEemmp?`2>6v6&+LOXdv#Hm^x2e#|9ds{|eiqF_u+zBMgzC ztd>bkD7x@Gb8M%6a3v)|^pB^N6i@;_#C9flnFXi1kjzM*((ub!t7iaQW$H^;~vR zZ?592Sfnb(Tab&N7Et;E$+$^X7D^^gUmS>R04texaC^=d(r8lB(p9Zanr@2QD(d&L zj9=`!F?QZd`nAJ1{2r`m%HqPDHA;qM3{IqWJ49tLPg3drmWR@&6-R3C|0dpobC}Fw zIn@eyOke+Nm<>f#*9rQbfV0Qm;R171(ladSvB-nfCEana?_*e9y-7bezT}_Pwa;m_ zc71if>#fzH2zR-CZTYLGKmH$Vt(Lf&&h1Qwr=+_?0$M13I3Iq13ideHD5N?x!@hQ*LOxt+?+7HtKo5 zjk&!f8`}-rwNc@3xj|5;hRAQ{*ZJ}2@r&*j${rlNNOzSw7JA-8p$r0O{69r^*yYmV~_S{d%3p!T8`%3EqC)M*;# ziK{YdM>I9@o?0Z>=$n+j>g*BAglr".format( + self.project, self.version, self.location, + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/format_control.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..2748856 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/format_control.py @@ -0,0 +1,62 @@ +from pip._vendor.packaging.utils import canonicalize_name + + +class FormatControl(object): + """A helper class for controlling formats from which packages are installed. + If a field is falsy, it isn't set. If it is {':all:'}, it should match all + packages except those listed in the other field. Only one field can be set + to {':all:'} at a time. The rest of the time exact package name matches + are listed, with any given package only showing up in one field at a time. + """ + def __init__(self, no_binary=None, only_binary=None): + self.no_binary = set() if no_binary is None else no_binary + self.only_binary = set() if only_binary is None else only_binary + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/index.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..870a315 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/index.py @@ -0,0 +1,29 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/link.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..5decb7c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/models/link.py @@ -0,0 +1,141 @@ +import posixpath +import re + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import splitext +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.wheel import wheel_ext + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL + """ + + def __init__(self, url, comes_from=None, requires_python=None): + """ + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + requires_python: + String containing the `Requires-Python` metadata field, specified + in PEP 345. This may be specified by a data-requires-python + attribute in the HTML link tag, as described in PEP 503. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self.url = url + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + + super(Link, self).__init__( + key=(self.url), + defining_class=Link + ) + + def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (self.url, self.comes_from, rp) + else: + return str(self.url) + + def __repr__(self): + return '' % self + + @property + def filename(self): + _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + return self.splitext()[1] + + @property + def url_without_fragment(self): + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + match = self._egg_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + match = self._subdirectory_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + return self.ext == wheel_ext + + @property + def is_artifact(self): + """ + Determines if this points to an actual artifact (e.g. a tarball) or if + it points to an "abstract" thing like a path or a VCS location. + """ + from pip._internal.vcs import vcs + + if self.scheme in vcs.all_schemes: + return False + + return True diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b77435703ec2c9c48affa0c1871f014735aacdd GIT binary patch literal 149 zcmWgV<>eAsnwrW01dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnFDLzy+yecA%mUra zyyB9?oE%;AR1=GolGJ>VAQ;DI=9Q!t+q4d*Ux};>+ru(Fm57DyN=VRheIYS*z`KWBzYa?ky30 zLo;6q^`D~XP!I(~E~KEqqDW9|k!z9QwoQ>uaf#eg-Y!v8rno|GC2yB0s#07dx0bgn z6xAtiklP?38>AMDmMTR}id*Ei@>w;C+7!=`J4bPc+z!R_OBhPDCkfyPhSgi-=|=Kf<-grP_RV7 zvZ+6$V1kIlke-htiPl2jA0?x(4;@$1;~{h|#{N)x{*g|V-%q_D)G2y5k7eqGBc1wDBm>i{ z!lQHESo5OKzIyqUxAUuC?0n+A`py3S-u^GScQ0S?N}ipEO2%@Oc59jav(aT%+kqng zD3V!eH|(cbZ7-F|PZO2Zem!Qbew5hIryF0%n3(n zg2CcKxM{E9;L93O0)KePD7t)+mGm$icPpxl^D7%7YmHTMD&ZIQmYV1O1s01C-BMN= zzV+3y&YFeiJq;6<*oRq(SNxsS24?>IVHv zDJAxr`jX(8i+?Zzu1mBIU+y0Mm2RrWnN>P9vu!c@s>ZBkH z0Np4l@Zd1m9DfuzN~Y&(#Bp$xB$4z-InMX{@U{8)m&*Z)=7@#+54zU=3xm|IQ0wS3 z^;~SCnYHhn^vAr^AWB?4G7z1`WpCSrlz!g3v*>dKiIPgAWl1wOTxC>VohuycJHCRVW}Tt-PCb5D?#C3 zy$4Z5CSnzQXd)Th$Po)b8j?iwPo|$))WrE8hz1ib{yhR)2!q?wm3)yX$DAIvVfdye z@;1F)I>*W%pEz$Bt_;arEIa-Hw8c~kiZ$tq6�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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1243eb8050de2d0f1fd4c61a662df24292bf2e3 GIT binary patch literal 9748 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 ZSC;{x%ho0gZ>iE=-h6#?ezUvT{9m3WlR^Lh literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/check.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/check.py new file mode 100644 index 0000000..799257a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/check.py @@ -0,0 +1,148 @@ +"""Validation of dependencies of packages +""" + +from collections import namedtuple + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.operations.prepare import make_abstract_dist +from pip._internal.utils.misc import get_installed_distributions +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from typing import ( # noqa: F401 + Any, Callable, Dict, Iterator, Optional, Set, Tuple, List + ) + + # Shorthands + PackageSet = Dict[str, 'PackageDetails'] + Missing = Tuple[str, Any] + Conflicting = Tuple[str, str, Any] + + MissingDict = Dict[str, List[Missing]] + ConflictingDict = Dict[str, List[Conflicting]] + CheckResult = Tuple[MissingDict, ConflictingDict] + +PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) + + +def create_package_set_from_installed(**kwargs): + # type: (**Any) -> PackageSet + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + package_set[name] = PackageDetails(dist.version, dist.requires()) + return package_set + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + if should_ignore is None: + def should_ignore(name): + return False + + missing = dict() + conflicting = dict() + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +# NOTE from @pradyunsg +# This required a minor update in dependency link handling logic over at +# operations.prepare.IsSDist.dist() to get it working +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + dist = make_abstract_dist(inst_req).dist(finder=None) + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/freeze.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..beb2feb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,264 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, make_vcs_requirement_url, +) + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, + find_links=None, local_only=None, user_only=None, skip_regex=None, + isolated=False, + wheel_cache=None, + exclude_editable=False, + skip=()): + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + dependency_links = [] + + for dist in pkg_resources.working_set: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt') + ) + for link in find_links: + if '#egg=' in link: + dependency_links.append(link) + for link in find_links: + yield '-f %s' % link + installations = {} + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist( + dist, + dependency_links + ) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue + if exclude_editable and req.editable: + continue + installations[req.name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = install_req_from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + elif line_req.name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but that " + "package is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[line_req.name]).rstrip() + del installations[line_req.name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if canonicalize_name(installation.name) not in skip: + yield str(installation).rstrip() + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + _rev_re = re.compile(r'-r(\d+)$') + _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') + + @classmethod + def _init_args_from_dist(cls, dist, dependency_links): + """ + Compute and return arguments (req, editable, comments) to pass to + FrozenRequirement.__init__(). + + This method is for use in FrozenRequirement.from_dist(). + """ + location = os.path.normcase(os.path.abspath(dist.location)) + comments = [] + from pip._internal.vcs import vcs, get_src_requirement + if dist_is_editable(dist) and vcs.get_backend_name(location): + editable = True + try: + req = get_src_requirement(dist, location) + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + req = None + if req is None: + logger.warning( + 'Could not determine repository location of %s', location + ) + comments.append( + '## !! Could not determine repository location' + ) + req = dist.as_requirement() + editable = False + else: + editable = False + req = dist.as_requirement() + specs = req.specs + assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ + 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ + (specs, dist) + version = specs[0][1] + ver_match = cls._rev_re.search(version) + date_match = cls._date_re.search(version) + if ver_match or date_match: + svn_backend = vcs.get_backend('svn') + if svn_backend: + svn_location = svn_backend().get_location( + dist, + dependency_links, + ) + if not svn_location: + logger.warning( + 'Warning: cannot find svn location for %s', req, + ) + comments.append( + '## FIXME: could not find svn URL in dependency_links ' + 'for this package:' + ) + else: + deprecated( + "SVN editable detection based on dependency links " + "will be dropped in the future.", + replacement=None, + gone_in="18.2", + issue=4187, + ) + comments.append( + '# Installing as editable to satisfy requirement %s:' % + req + ) + if ver_match: + rev = ver_match.group(1) + else: + rev = '{%s}' % date_match.group(1) + editable = True + egg_name = cls.egg_name(dist) + req = make_vcs_requirement_url(svn_location, rev, egg_name) + + return (req, editable, comments) + + @classmethod + def from_dist(cls, dist, dependency_links): + args = cls._init_args_from_dist(dist, dependency_links) + return cls(dist.project_name, *args) + + @staticmethod + def egg_name(dist): + name = dist.egg_name() + match = re.search(r'-py\d\.\d$', name) + if match: + name = name[:match.start()] + return name + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/prepare.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..104bea3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,355 @@ +"""Prepares a distribution for installation +""" + +import logging +import os + +from pip._vendor import pkg_resources, requests + +from pip._internal.build_env import BuildEnvironment +from pip._internal.download import ( + is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, +) +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, + PreviousBuildDirError, VcsHashUnsupported, +) +from pip._internal.utils.compat import expanduser +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + """Factory to make an abstract dist object. + + Preconditions: Either an editable req with a source_dir, or satisfied_by or + a wheel link, or a non-editable req with a source_dir. + + :return: A concrete DistAbstraction. + """ + if req.editable: + return IsSDist(req) + elif req.link and req.link.is_wheel: + return IsWheel(req) + else: + return IsSDist(req) + + +class DistAbstraction(object): + """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. + + The requirements for anything installable are as follows: + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + - we must be able to generate a list of run-time dependencies + without installing any additional packages (or we would + have to either burn time by doing temporary isolated installs + or alternatively violate pips 'don't start installing unless + all requirements are available' rule - neither of which are + desirable). + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + self.req = req + + def dist(self, finder): + """Return a setuptools Dist object.""" + raise NotImplementedError(self.dist) + + def prep_for_dist(self, finder, build_isolation): + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError(self.dist) + + +class IsWheel(DistAbstraction): + + def dist(self, finder): + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self, finder): + dist = self.req.get_dist() + # FIXME: shouldn't be globally added. + if finder and dist.has_metadata('dependency_links.txt'): + finder.add_dependency_links( + dist.get_metadata_lines('dependency_links.txt') + ) + return dist + + def prep_for_dist(self, finder, build_isolation): + # Prepare for building. We need to: + # 1. Load pyproject.toml (if it exists) + # 2. Set up the build environment + + self.req.load_pyproject_toml() + should_isolate = self.req.use_pep517 and build_isolation + + if should_isolate: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, self.req.pyproject_requires, + "Installing build dependencies" + ) + missing = [] + if self.req.requirements_to_check: + check = self.req.requirements_to_check + missing = self.req.build_env.missing_requirements(check) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and pip " + "cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + + self.req.run_egg_info() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self, finder): + return self.req.satisfied_by + + def prep_for_dist(self, finder, build_isolation): + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__(self, build_dir, download_dir, src_dir, wheel_download_dir, + progress_bar, build_isolation, req_tracker): + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + + # Where still packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + if wheel_download_dir: + wheel_download_dir = normalize_path(wheel_download_dir) + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + self.progress_bar = progress_bar + + # Is build isolation allowed? + self.build_isolation = build_isolation + + @property + def _download_should_save(self): + # TODO: Modify to reduce indentation needed + if self.download_dir: + self.download_dir = expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def prepare_linked_requirement(self, req, session, finder, + upgrade_allowed, require_hashes): + """Prepare a requirement that would be obtained from req.link + """ + # TODO: Breakup into smaller functions + if req.link and req.link.scheme == 'file': + path = url_to_path(req.link.url) + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + req.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '%s' due to a" + " pre-existing build directory (%s). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + % (req, req.source_dir) + ) + req.populate_link(finder, upgrade_allowed, require_hashes) + + # We can't hit this spot and have populate_link return None. + # req.satisfied_by is None here (because we're + # guarded) and upgrade has no impact except when satisfied_by + # is not None. + # Then inside find_requirement existing_applicable -> False + # If no new versions are found, DistributionNotFound is raised, + # otherwise a result is guaranteed. + assert req.link + link = req.link + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if is_vcs_url(link): + raise VcsHashUnsupported() + elif is_file_url(link) and is_dir_url(link): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not require_hashes) + if require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + try: + download_dir = self.download_dir + # We always delete unpacked sdists after pip ran. + autodelete_unpacked = True + if req.link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + if req.link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + unpack_url( + req.link, req.source_dir, + download_dir, autodelete_unpacked, + session=session, hashes=hashes, + progress_bar=self.progress_bar + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement %s because of HTTP ' + 'error %s for URL %s' % + (req, exc, req.link) + ) + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if req.link.scheme in vcs.all_schemes: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement(self, req, require_hashes, use_user_site, + finder): + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if require_hashes: + raise InstallationError( + 'The editable requirement %s cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.' % req + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(use_user_site) + + return abstract_dist + + def prepare_installed_requirement(self, req, require_hashes, skip_reason): + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to %r" % (req.satisfied_by,) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = Installed(req) + + return abstract_dist diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pep425tags.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 0000000..ab1a029 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pep425tags.py @@ -0,0 +1,317 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import logging +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +import pip._internal.utils.glibc +from pip._internal.utils.compat import get_extension_suffixes + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + logger.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip._internal.utils.glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_extension_suffixes(): + if suffix.startswith('.abi'): + abi3s.add(suffix.split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pyproject.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..f938a76 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,144 @@ +from __future__ import absolute_import + +import io +import os + +from pip._vendor import pytoml, six + +from pip._internal.exceptions import InstallationError + + +def _is_list_of_str(obj): + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def load_pyproject_toml(use_pep517, pyproject_toml, setup_py, req_name): + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 equalling False because that + # means the user explicitly requested --no-use-pep517 + if has_pyproject and not has_setup: + if use_pep517 is False: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is False: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend, and require wheel and a version + # of setuptools that supports that backend. + build_system = { + "requires": ["setuptools>=38.2.5", "wheel"], + "build-backend": "setuptools.build_meta", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + backend = build_system.get("build-backend") + check = [] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is neede by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # TODO: Review this - it's quite a lot of work to check for a very + # specific case. The problem is, that case is potentially quite + # common - projects that adopted PEP 518 early for the ability to + # specify requirements to execute setup.py, but never considered + # needing to mention the build tools themselves. The original PEP + # 518 code had a similar check (but implemented in a different + # way). + backend = "setuptools.build_meta" + check = ["setuptools>=38.2.5", "wheel"] + + return (requires, backend, check) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..b270498 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import + +import logging + +from .req_install import InstallRequirement +from .req_set import RequirementSet +from .req_file import parse_requirements +from pip._internal.utils.logging import indent_log + + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs(to_install, install_options, global_options=(), + *args, **kwargs): + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + with indent_log(): + for requirement in to_install: + if requirement.conflicts_with: + logger.info( + 'Found existing installation: %s', + requirement.conflicts_with, + ) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except Exception: + should_rollback = ( + requirement.conflicts_with and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.conflicts_with and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + requirement.remove_temporary_source() + + return to_install diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e51dff4e457cd0219bf3b47365403723777137e4 GIT binary patch literal 1600 zcmZV;O>Y}T^v&*izhcKG6^bYV7NH_6H4cYLtsq1k3K9}3qCrZrRE;*fV|$(59cN}X zUve&O&wTs{4*Uns9O1@cu1HAz3G~F9u{Vvxc;EQFH}CtsneARL9{j@CP6+Tf+*lss zpCibhaLe%{Py$p0#sr9=9Vi_bJCM7Odr-Pic`)|y4CxM(9jJU5`zzXqGJqgS(z1NaPMSiniq#6mH*b&!%y70AsgR6{*J2X6aZ%@}K}$Xr z9W*FRIfRd!-YQmx>9jaywNaFriw9;!2)7ZwL6BP*$r82hf&!QmQ$dV<-d5~|J$;Bd zn$H2ETzC%f<6l6||1gRVpZ*S49awf??tysLT4^~qRJMT_sSe~ma2*RKbuf%Bn>fL>?oYx_nYd81qMjy2 zov0a0Y+;kKkZKfL(T@~Qj#!dmJ6WEj6U9U_OHYkT&d=(Sr@7(RdD7I2G&@GZ*fD52 zWpZeZT)w~dXw))}rZRU9)4Xp!iP^NcNwb^S&gqHMB^F>H|z1=jrt+oFBUs4A4+#;eIs8CA?&-&9;s$s3We zVWeY>t2NtiZEdk4%kJ6I1w3mvh)c*0A{olB8o%OBjFj-C)shUZqbYISRQ|9zK zpx&CXitBavM9=gQUq`rwAop>D&?i1|$vbXLdL*)V?8Jx-9M@7Vo^CijCnB-ylbD2V zL?XvvZ#u()jwziqsu7G*Vfv{9Q*vyNHi5TE+c!rChJz8?X9x?3)TAic>MeR3=Vx?1 zJEKMwr5vqot$G$vinoSR9Zi|~dezvFQZuaRe1OhvZa4C^b8C{;;af=l}o! literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/constructors.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/constructors.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c84ac0c067e828b6dccda2791c2bb3fd671a97a9 GIT binary patch literal 7574 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_install.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_install.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84c48b45577623d5554b7ee07e6d741969d3193e GIT binary patch literal 24955 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72ecbf59df302940656f53cc3e80ae911b2aa886 GIT binary patch literal 3093 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\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.constraints, + cmdoptions.editable, + cmdoptions.requirements, + cmdoptions.no_index, + cmdoptions.index_url, + cmdoptions.find_links, + cmdoptions.extra_index_url, + cmdoptions.always_unzip, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.pre, + cmdoptions.process_dependency_links, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [o().dest for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements(filename, finder=None, comes_from=None, options=None, + session=None, constraint=False, wheel_cache=None): + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param session: Instance of pip.download.PipSession. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + """ + if session is None: + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) + + _, content = get_file_content( + filename, comes_from=comes_from, session=session + ) + + lines_enum = preprocess(content, options) + + for line_number, line in lines_enum: + req_iter = process_line(line, filename, line_number, finder, + comes_from, options, session, wheel_cache, + constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = skip_regex(lines_enum, options) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def process_line(line, filename, line_number, finder=None, comes_from=None, + options=None, session=None, wheel_cache=None, + constraint=False): + """Process a single requirements line; This can result in creating/yielding + requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + + :param constraint: If True, parsing a constraints file. + :param options: OptionParser options that we may update + """ + parser = build_parser(line) + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + # `finder.format_control` will be updated during parsing + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + if sys.version_info < (2, 7, 3): + # Prior to 2.7.3, shlex cannot deal with unicode entries + options_str = options_str.encode('utf8') + opts, _ = parser.parse_args(shlex.split(options_str), defaults) + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if constraint else '-r', filename, line_number, + ) + + # yield a line requirement + if args_str: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in opts.__dict__ and opts.__dict__[dest]: + req_options[dest] = opts.__dict__[dest] + yield install_req_from_line( + args_str, line_comes_from, constraint=constraint, + isolated=isolated, options=req_options, wheel_cache=wheel_cache + ) + + # yield an editable requirement + elif opts.editables: + isolated = options.isolated_mode if options else False + yield install_req_from_editable( + opts.editables[0], comes_from=line_comes_from, + constraint=constraint, isolated=isolated, wheel_cache=wheel_cache + ) + + # parse a nested requirements file + elif opts.requirements or opts.constraints: + if opts.requirements: + req_path = opts.requirements[0] + nested_constraint = False + else: + req_path = opts.constraints[0] + nested_constraint = True + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join(os.path.dirname(filename), req_path) + # TODO: Why not use `comes_from='-r {} (line {})'` here as well? + parser = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parser: + yield req + + # percolate hash-checking option upward + elif opts.require_hashes: + options.require_hashes = opts.require_hashes + + # set finder options + elif finder: + if opts.index_url: + finder.index_urls = [opts.index_url] + if opts.no_index is True: + finder.index_urls = [] + if opts.extra_index_urls: + finder.index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + finder.find_links.append(value) + if opts.pre: + finder.allow_all_prereleases = True + if opts.process_dependency_links: + finder.process_dependency_links = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) + + +def build_parser(line): + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, msg) + raise RequirementsFileParseError(msg) + parser.exit = parser_exit + + return parser + + +def join_lines(lines_enum): + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, options): + """ + Skip lines that match '--skip-requirements-regex' pattern + + Note: the regex pattern is only built once + """ + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + pattern = re.compile(skip_regex) + lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) + return lines_enum + + +def expand_env_variables(lines_enum): + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discusssion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_install.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..c2624fe --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,860 @@ +from __future__ import absolute_import + +import logging +import os +import shutil +import sys +import sysconfig +import zipfile +from distutils.util import change_root + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pep517.wrappers import Pep517HookCaller + +from pip._internal import wheel +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, +) +from pip._internal.models.link import Link +from pip._internal.pyproject import load_pyproject_toml +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.compat import native_str +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + _make_build_dir, ask_path_exists, backup_dir, call_subprocess, + display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, + get_installed_version, rmtree, +) +from pip._internal.utils.packaging import get_metadata +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import open_spinner +from pip._internal.vcs import vcs +from pip._internal.wheel import move_wheel_files + +logger = logging.getLogger(__name__) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relavant requirement and also contains logic for + installing the said requirement. + """ + + def __init__(self, req, comes_from, source_dir=None, editable=False, + link=None, update=True, markers=None, + isolated=False, options=None, wheel_cache=None, + constraint=False, extras=()): + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + if source_dir is not None: + self.source_dir = os.path.normpath(os.path.abspath(source_dir)) + else: + self.source_dir = None + self.editable = editable + + self._wheel_cache = wheel_cache + if link is not None: + self.link = self.original_link = link + else: + self.link = self.original_link = req and req.url and Link(req.url) + + if extras: + self.extras = extras + elif req: + self.extras = { + pkg_resources.safe_extra(extra) for extra in req.extras + } + else: + self.extras = set() + if markers is not None: + self.markers = markers + else: + self.markers = req and req.marker + self._egg_info_path = None + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None + # This hold the pkg_resources.Distribution object if this requirement + # conflicts with another installed distribution: + self.conflicts_with = None + # Temporary build location + self._temp_build_dir = TempDirectory(kind="req-build") + # Used to store the global directory where the _temp_build_dir should + # have been created. Cf _correct_build_location method. + self._ideal_build_dir = None + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None + # UninstallPathSet of uninstalled distribution (for possible rollback) + self.uninstalled_pathset = None + self.options = options if options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + self.is_direct = False + + self.isolated = isolated + self.build_env = NoOpBuildEnvironment() + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None + + # Build requirements that we will check are available + # TODO: We don't do this for --no-build-isolation. Should we? + self.requirements_to_check = [] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = None + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % self.link.url + elif self.link: + s = self.link.url + else: + s = '' + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If require_hashes is True, don't use the wheel cache, because cached + wheels, always built locally, have different hashes than the files + downloaded from the index server and thus throw false hash mismatches. + Furthermore, cached wheels at present have undeterministic contents due + to file modification times. + """ + if self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + self.link = self._wheel_cache.get(self.link, self.name) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + return self.req.specifier + + @property + def is_pinned(self): + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in {'==', '==='}) + + @property + def installed_version(self): + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + @property + def has_hash_options(self): + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.options.get('hashes', {})) + + def hashes(self, trust_internet=True): + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.options.get('hashes', {}).copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self): + """Format a nice indicator to show where this "comes from" + """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def build_location(self, build_dir): + assert build_dir is not None + if self._temp_build_dir.path is not None: + return self._temp_build_dir.path + if self.req is None: + # for requirement via a path to a directory: the name of the + # package is not available yet so we create a temp directory + # Once run_egg_info will have run, we'll be able + # to fix it via _correct_build_location + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir.create() + self._ideal_build_dir = build_dir + + return self._temp_build_dir.path + if self.editable: + name = self.name.lower() + else: + name = self.name + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + _make_build_dir(build_dir) + return os.path.join(build_dir, name) + + def _correct_build_location(self): + """Move self._temp_build_dir to self._ideal_build_dir/self.req.name + + For some requirements (e.g. a path to a directory), the name of the + package is not available until we run egg_info, so the build_location + will return a temporary directory and store the _ideal_build_dir. + + This is only called by self.run_egg_info to fix the temporary build + directory. + """ + if self.source_dir is not None: + return + assert self.req is not None + assert self._temp_build_dir.path + assert self._ideal_build_dir.path + old_location = self._temp_build_dir.path + self._temp_build_dir.path = None + + new_location = self.build_location(self._ideal_build_dir) + if os.path.exists(new_location): + raise InstallationError( + 'A package already exists in %s; please remove it to continue' + % display_path(new_location)) + logger.debug( + 'Moving package %s from %s to new location %s', + self, display_path(old_location), display_path(new_location), + ) + shutil.move(old_location, new_location) + self._temp_build_dir.path = new_location + self._ideal_build_dir = None + self.source_dir = os.path.normpath(os.path.abspath(new_location)) + self._egg_info_path = None + + def remove_temporary_source(self): + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and os.path.exists( + os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + self._temp_build_dir.cleanup() + self.build_env.cleanup() + + def check_if_exists(self, use_user_site): + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately. + """ + if self.req is None: + return False + try: + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.conflicts_with = existing_dist + return True + + # Things valid for wheels + @property + def is_wheel(self): + return self.link and self.link.is_wheel + + def move_wheel_files(self, wheeldir, root=None, home=None, prefix=None, + warn_script_location=True, use_user_site=False, + pycompile=True): + move_wheel_files( + self.name, self.req, wheeldir, + user=use_user_site, + home=home, + root=root, + prefix=prefix, + pycompile=pycompile, + isolated=self.isolated, + warn_script_location=warn_script_location, + ) + + # Things valid for sdists + @property + def setup_py_dir(self): + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + assert self.source_dir, "No source dir for %s" % self + + setup_py = os.path.join(self.setup_py_dir, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml(self): + assert self.source_dir, "No source dir for %s" % self + + pp_toml = os.path.join(self.setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(pp_toml, six.text_type): + pp_toml = pp_toml.encode(sys.getfilesystemencoding()) + + return pp_toml + + def load_pyproject_toml(self): + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pep517_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml, + self.setup_py, + str(self) + ) + + if pep517_data is None: + self.use_pep517 = False + else: + self.use_pep517 = True + requires, backend, check = pep517_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) + + def run_egg_info(self): + assert self.source_dir + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + + with indent_log(): + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + with self.build_env: + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + show_stdout=False, + command_desc='python setup.py egg_info') + + if not self.req: + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + logger.warning( + 'Running setup.py (path:%s) egg_info for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.setup_py, self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + @property + def egg_info_path(self): + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.setup_py_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv + # environment + if ( + os.path.lexists( + os.path.join(root, dir, 'bin', 'python') + ) or + os.path.exists( + os.path.join( + root, dir, 'Scripts', 'Python.exe' + ) + )): + dirs.remove(dir) + # Also don't search through tests + elif dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError( + "Files/directories not found in %s" % base + ) + # if we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort( + key=lambda x: x.count(os.path.sep) + + (os.path.altsep and x.count(os.path.altsep) or 0) + ) + self._egg_info_path = os.path.join(base, filenames[0]) + return self._egg_info_path + + @property + def metadata(self): + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + """Return a pkg_resources.Distribution built from self.egg_info_path""" + egg_info = self.egg_info_path.rstrip(os.path.sep) + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + return pkg_resources.Distribution( + os.path.dirname(egg_info), + project_name=dist_name, + metadata=metadata, + ) + + def assert_source_matches_version(self): + assert self.source_dir + version = self.metadata['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir(self, parent_dir): + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.build_location(parent_dir) + return self.source_dir + + # For editable installations + def install_editable(self, install_options, + global_options=(), prefix=None): + logger.info('Running setup.py develop for %s', self.name) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + if prefix: + prefix_param = ['--prefix={}'.format(prefix)] + install_options = list(install_options) + prefix_param + + with indent_log(): + # FIXME: should we do --install-headers here too? + with self.build_env: + call_subprocess( + [ + sys.executable, + '-c', + SETUPTOOLS_SHIM % self.setup_py + ] + + list(global_options) + + ['develop', '--no-deps'] + + list(install_options), + + cwd=self.setup_py_dir, + show_stdout=False, + ) + + self.install_succeeded = True + + def update_editable(self, obtain=True): + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, "bad url: %r" % self.link.url + if not self.update: + return + vc_type, url = self.link.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False, + use_user_site=False): + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + if not self.check_if_exists(use_user_site): + logger.warning("Skipping %s as it is not installed.", self.name) + return + dist = self.satisfied_by or self.conflicts_with + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _clean_zip_name(self, name, prefix): # only used by archive. + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + # TODO: Investigate if this should be kept in InstallRequirement + # Seems to be used only when VCS + downloads + def archive(self, build_dir): + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + if create_archive: + zip = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, + allowZip64=True + ) + dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dirname = os.path.join(dirpath, dirname) + name = self._clean_zip_name(dirname, dir) + zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + filename = os.path.join(dirpath, filename) + name = self._clean_zip_name(filename, dir) + zip.write(filename, self.name + '/' + name) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def install(self, install_options, global_options=None, root=None, + home=None, prefix=None, warn_script_location=True, + use_user_site=False, pycompile=True): + global_options = global_options if global_options is not None else [] + if self.editable: + self.install_editable( + install_options, global_options, prefix=prefix, + ) + return + if self.is_wheel: + version = wheel.wheel_version(self.source_dir) + wheel.check_compatibility(version, self.name) + + self.move_wheel_files( + self.source_dir, root=root, prefix=prefix, home=home, + warn_script_location=warn_script_location, + use_user_site=use_user_site, pycompile=pycompile, + ) + self.install_succeeded = True + return + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + \ + self.options.get('global_options', []) + install_options = list(install_options) + \ + self.options.get('install_options', []) + + if self.isolated: + global_options = global_options + ["--no-user-cfg"] + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = self.get_install_args( + global_options, record_filename, root, prefix, pycompile, + ) + msg = 'Running setup.py install for %s' % (self.name,) + with open_spinner(msg) as spinner: + with indent_log(): + with self.build_env: + call_subprocess( + install_args + install_options, + cwd=self.setup_py_dir, + show_stdout=False, + spinner=spinner, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + self.install_succeeded = True + + def prepend_root(path): + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + with open(record_filename) as f: + for line in f: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + logger.warning( + 'Could not find .egg-info directory in install record' + ' for %s', + self, + ) + # FIXME: put the record somewhere + # FIXME: should this be an error? + return + new_lines = [] + with open(record_filename) as f: + for line in f: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') + + def get_install_args(self, global_options, record_filename, root, prefix, + pycompile): + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_set.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..b198317 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,181 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.wheel import Wheel + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False, check_supported_wheels=True): + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() + self.require_hashes = require_hashes + self.check_supported_wheels = check_supported_wheels + + # Mapping of alias: real_name + self.requirement_aliases = {} + self.unnamed_requirements = [] + self.successfully_downloaded = [] + self.reqs_to_cleanup = [] + + def __str__(self): + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def __repr__(self): + reqs = [req for req in self.requirements.values()] + reqs.sort(key=lambda req: req.name.lower()) + reqs_str = ', '.join([str(req.req) for req in reqs]) + return ('<%s object; %d requirement(s): %s>' + % (self.__class__.__name__, len(reqs), reqs_str)) + + def add_requirement(self, install_req, parent_req_name=None, + extras_requested=None): + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + name = install_req.name + + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if self.check_supported_wheels and not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_req, name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + # We'd want to rescan this requirements later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple(sorted( + set(existing_req.extras) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, project_name): + name = project_name.lower() + if (name in self.requirements and + not self.requirements[name].constraint or + name in self.requirement_aliases and + not self.requirements[self.requirement_aliases[name]].constraint): + return True + return False + + @property + def has_requirements(self): + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + def get_requirement(self, project_name): + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def cleanup_files(self): + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_tracker.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..0a86f4c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class RequirementTracker(object): + + def __init__(self): + self._root = os.environ.get('PIP_REQ_TRACKER') + if self._root is None: + self._temp_dir = TempDirectory(delete=False, kind='req-tracker') + self._temp_dir.create() + self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path + logger.debug('Created requirements tracker %r', self._root) + else: + self._temp_dir = None + logger.debug('Re-using requirements tracker %r', self._root) + self._entries = set() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.cleanup() + + def _entry_path(self, link): + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + link = req.link + info = str(req) + entry_path = self._entry_path(link) + try: + with open(entry_path) as fp: + # Error, these's already a build in progress. + raise LookupError('%s is already being built: %s' + % (link, fp.read())) + except IOError as e: + if e.errno != errno.ENOENT: + raise + assert req not in self._entries + with open(entry_path, 'w') as fp: + fp.write(info) + self._entries.add(req) + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + link = req.link + self._entries.remove(req) + os.unlink(self._entry_path(link)) + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + for req in set(self._entries): + self.remove(req) + remove = self._temp_dir is not None + if remove: + self._temp_dir.cleanup() + logger.debug('%s build tracker %r', + 'Removed' if remove else 'Cleaned', + self._root) + + @contextlib.contextmanager + def track(self, req): + self.add(req) + yield + self.remove(req) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_uninstall.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..a7d8230 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,460 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, + normalize_path, renames, +) +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + path = os.path.join(dn, base + '.pyo') + yield path + + +def compact(paths): + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() + for path in sorted(paths, key=len): + should_add = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_add: + short_paths.add(path) + return short_paths + + +def compress_for_output_listing(paths): + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = list(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + _normcased_files = set(map(os.path.normcase, files)) + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_files): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self.save_dir = TempDirectory(kind="uninstall") + self._moved_paths = [] + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def _stash(self, path): + return os.path.join( + self.save_dir.path, os.path.splitdrive(path)[1].lstrip(os.path.sep) + ) + + def remove(self, auto_confirm=False, verbose=False): + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + self.save_dir.create() + + for path in sorted(compact(self.paths)): + new_path = self._stash(path) + logger.debug('Removing file or directory %s', path) + self._moved_paths.append(path) + renames(path, new_path) + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = list(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + """Rollback the changes previously made by remove().""" + if self.save_dir.path is None: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return False + logger.info('Rolling back uninstall of %s', self.dist.project_name) + for path in self._moved_paths: + tmp_path = self._stash(path) + logger.debug('Replacing %s', path) + renames(tmp_path, path) + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + self.save_dir.cleanup() + self._moved_paths = [] + + @classmethod + def from_dist(cls, dist): + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() + self._saved_lines = None + + def add(self, entry): + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/resolve.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/resolve.py new file mode 100644 index 0000000..2d9f1c5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/resolve.py @@ -0,0 +1,353 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +import logging +from collections import defaultdict +from itertools import chain + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, + UnsupportedPythonVersion, +) +from pip._internal.req.constructors import install_req_from_req +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, ensure_dir +from pip._internal.utils.packaging import check_dist_requires_python + +logger = logging.getLogger(__name__) + + +class Resolver(object): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__(self, preparer, session, finder, wheel_cache, use_user_site, + ignore_dependencies, ignore_installed, ignore_requires_python, + force_reinstall, isolated, upgrade_strategy): + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + self.preparer = preparer + self.finder = finder + self.session = session + + # NOTE: This would eventually be replaced with a cache that can give + # information about both sdist and wheels transparently. + self.wheel_cache = wheel_cache + + self.require_hashes = None # This is set in resolve + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.isolated = isolated + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + + self._discovered_dependencies = defaultdict(list) + + def resolve(self, requirement_set): + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + # make the wheelhouse + if self.preparer.wheel_download_dir: + ensure_dir(self.preparer.wheel_download_dir) + + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + self.require_hashes = ( + requirement_set.require_hashes or + any(req.has_hash_options for req in root_reqs) + ) + + # Display where finder is looking for packages + locations = self.finder.get_formatted_locations() + if locations: + logger.info(locations) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend( + self._resolve_one(requirement_set, req) + ) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.is_direct + + def _set_req_to_reinstall(self, req): + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.conflicts_with = req.satisfied_by + req.satisfied_by = None + + # XXX: Stop passing requirement_set for options + def _check_skip_installed(self, req_to_install): + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'already satisfied, skipping upgrade' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _get_abstract_dist_for(self, req): + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + assert self.require_hashes is not None, ( + "require_hashes should have been set in Resolver.resolve()" + ) + + if req.editable: + return self.preparer.prepare_editable_requirement( + req, self.require_hashes, self.use_user_site, self.finder, + ) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, self.require_hashes, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + abstract_dist = self.preparer.prepare_linked_requirement( + req, self.session, self.finder, upgrade_allowed, + self.require_hashes + ) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one(self, requirement_set, req_to_install): + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.dist(self.finder) + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] + + def add_req(subreq, extras_requested): + sub_install_req = install_req_from_req( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + req_to_install.is_direct = True + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + return more_reqs + + def get_installation_order(self, req_set): + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..403fb05b2405a755f107bb5937ab984fe0660a33 GIT binary patch literal 144 zcmWgV<>eAsnwrW01dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnFI)YR+yecA%mUra zyyB9?oE%;AR1=GolGJ>VAQ;DI=9Q!tcCVgK&WO~IlBt!~j<+lukVcVaY}v8BilALCNm+~~lF>+}#f&j(PS*^Z z?CBm?b(6Almdr5xpb@zNQlr03w zAwWjzW_NYftEyM;{odCP78a_Df2q`;zazxIimBf@JpUAz`8V7gA$D=Mgp(7VB?dXM zn-dnj=Y^LSyLtYG=YrTR@N+?UMKLIe-I5rT#cnz2T@>D&7*xb=MGUH9w~E%1aLVH6 zpnpy{bHb?zrz(DKiQReOpau5@eq9jGdEwN!Cmt4sv&7Fe;am{TMSflssv`8ih|#5N zIZI-9NvK7!dqM2@mqkHc6o*xz|5;d;rE1jt)VIVJ&TGP1W)gVFi&p*8iBo;N?;6<+ z93_uzBSZU8`Ld^jf!q(np}E~`_T6wl+G})!L35=Wx?ihSXosq44~LGcjkJA74g$yR zxyq@Afi#gD${^Bm80lePlxb97fVHA-#Wj1+1YQ)Xjyo6zI^3-1;{5j0TX7{+$6+TN z4Ha6-I~$v8TRW||s*Z=C9vP*(7LmX&hpT{V6_@!3+(IGrt_Ur0kP`=a5%RG-w*>xw zYl*NZ^iM=s65rstES~51b&g)s4#~g@wS0r4&xz-G8t6Y0VO1R9X!7C^qkbVmoKfNI zQ6Ni0Zt^m4f<^9JqRz>uba~kW9I@aiYsK9!E@*^w94$AflU-wBQkk6XRnegX!V_8sB_?cr`4v#i;n-F^^Y z)$Q@5ZC*vffh}LARCw=!?~Ndt{k}59Ch7Xz{IIpQDV?Be5+2#1^oXQ1Dhyq}Z)88< zMWx-Jt+qDS9&{dTt*$)itZZ+utvp_NMrXmS8Z{*A64>oJ$`6^P$r&;cKk#qrz#f1w zoq=?)1wP1YbUG;$q-H5lj@%o`XSC%G_3L1gXZ41}&J7cTt`L3fY8ZvtnGrz~4AjxS z(n?;Bd`Ic)ywN_?*5}FSQ$x1Ui|MFidoc8rnH+GV(P%#mPF&Bk+xM`wUU1yr)Hk6iy`@wAM_=OJ>P)s@xz>z(^s57$rT zGO?_m*F^wIoC{1`AO(!){6G)*sn+SMumggfUf_YN8cHkTs%u=|gtp&Rnm{SOz+GrW zCk#4!qfmj=LE!pv-i%BRkd&<$q0(2Of}U>v^>QmC%>)=T~={;b7Pt zy2G11iRaz?Sbg}36RLn3`RcfSNJ`-~qtNwChRKcLC_c}!!}>C5HLL@IWa0Gr~v>D`bh`G9l%+xhdRDaI`>( z`wc*p@fCndP?s0}FA0MW${CveO*U{YdjN97Br?7xqd-Cb@k_tL$W0(01B*1{WV)+U zU$L;NfcYi*umB9nZw^Gw{_7c@UY9H5YOd zs=)+g2&poRNc4clT}grEioCWL1fH_}8)HPdXM0A~ff2skQv_}Dv5pj}8AOEVNRg5` zK-B0rg;d#gCnyJ?9AFNzD|jR>khB>|+MMC;3^iYcM}a=1*`py3$mkDKXt@De*c#DE zknsozgayx#F(bcw)uCy;pzr#?F*V!a4mmCGSwhv_$DECU+tq;ydLg?n%D)+zrkC2R zZujGlKKk&JA79&PHQs-(-muN^cw)GS2edJQXw!|1A*h1&bd8C~r{Q(Y7|t0seW%?d z+SzY{Pe9Dfj7vZ$IY<*rIm3o*?DSt3OADnsc1>t*NQEP3dmH#Yw|@qiX}dg424Ki0 zuxa*T_9p|W&pQ(QaQ*LH%DaTHWE&Y^Z%8Z+*3I?dA7)cQ;^Y_G@|qunnWWXp+{4I->^O<;-t<(}vn}4!2V@est(|^%tnxSjtFN{5f@#t(FsWkE$h|(*qgWZo;UCekR zuehp@<(b@hWoKw+i$v^bhgV8A4@ zD`&+ZIkCrt7YrRY$ic~+o+~dCyDQ1Ccp)+Msn4a$FiECig3R(y&}81kO}tsME?C#CTH%6Kv99JSxX$mXz@z^+% z>oE?24)8+8`3 zSar0Q#R0;kTxL}9kb|i#+T{7Xnw3o0&Q9n52|GzvamGxt;UqgrD3#jEv04#Iq;@ky zF!E$)i~vUjnZTcAE6=3%|F&{E#w0#xKSL2Lk`yy4H0I%Vn6wlD&c^@iS$vvJgTH6b z^xwq5)ve8Y8=tZ<{9Y71z0wo_HDLrJUR>k&WkT|#GKRQ%C4n%)iwRsMh(221<_#|!-gp1#dOh6KF2nM==rHPf@jpO92T?gxPYM;vhM^$}Ew}oz+ zF}caEl7k!?`C5c`hCRpsjoi$5itkU(jB_*74#$7-E1PGkPg8|ma`xDSr{cS|@u>AX z?w1pnu*thr$oxo-%3tOho+dJ$F>$^U?R&YywSq9<2}Ku__8B|KFLMFWKI`hW$J2d| z)3Z}uzjn`dy|*2$#%`6XK#%mWS56`|C%PH6;!N~cMW*enZlmN9S%&) zT|8t1P71Vv`uu6nZQ``C4>$JQ*jtN>267a}Wy;eSHH=HJ+sHtrUL1RENY&sY%@fza zp6PWYyG*yiF5TkkrTz)+gEA^&v1DDgkZ7^q$X~EZxtjHQzLa0cY2xgd=fohoR&kl9 zxKY6Y1qgr=R~`~vOHj<26E2u9#OnlDI1KjpfUKw}q{xRx^uT|lVRE7kI4p>7fv*Ml zZ`G4OWr@oYmA335iMVHX4<(1p?pMeRz+>4%p0pu1t`6AuF%i;$t~d zXgleoej9Hm=U0Ql07{cJQUGwWkOW|9+sRK`i1UvSwYDE-QGYx2(AujJ*5QYr14aF6j!^(b-WHI@NUxDmkg0jQ-$0f=MO=v0^5)zQQ{(3JCe9ytPAn4 zok}xys1Vc182$I4ZOD#`(tN&Tl@KD7bNm-(Sbv1}vqg%Ga3WH0^~b`Li4h7Ttky|# zjJ$uma@cSHdkXD`3}QS71J8@7WK}4mcYKxPYwgP)k#teck5hN3X&n}X-l3WnI&FWo zBX-CV|LyD?sE;Iba83|(DAa&mM|zGs<2g0QbCB8jL?T}N5ZhpBc<~NBkqEpXx5%Yv zh(+h#i~qp;<9a17b*Y$S;^nSZC{}eM-=z{)XD{mYl#WX{Wyka4G9T0jx8lXt{ZCbx z$iX%=e<#id+KJ~5kzG|DIxOLHYab~Y`bydFow&$WuU^vcW77CsA_M>|U`8JE#0&ej z>Fm4x{Z1FTl-TOV1vK9}edceRKJz2g+d9em{}Ggp#7!jUjPtHpKPr^01q6#FtB9*+ zy#-*=8|X7WeS%PeKn9c*JRIMqC~xh{TZAa1CBhE`jyT!ps6p*~RTc$AkBAj}@U>7k z{DkU;Ptp7Zt{rr4)eH77p`7bJ7Yb9Y;wlyNJU}RqOm{7H2uhF$5XY^;b>@cl0L~8Hb40AqYv(;%-HBjMXaPnC7`;}THV;-r9J%F zY73~0*>0r!;}i=@amaYW*>dS!64k~G#PF(GD zdJ#&Qs?*UViHSczHh8y&!bPKlQj`@YI literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de73e79413f93663dcf2e4b9f18f24f75e25499f GIT binary patch literal 6455 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 RA$7bf!If60we!Ys@HadO$n^jK literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c15c19504ba8b495a46fab349e55378e443da13 GIT binary patch literal 1194 zcmZuuO-~a+7=HJo+fPKmsOV+Ym{3h2P=k#TLx5sTuo$Z$DKyP?XG*sWyX(v}Py#3P z;{Wi#PjV7Zo;Z8+y8_KT(Vj(9S&UD-L9Z9gshhVG67)k@|nuHpxp!)1^FYwa5Bm~dji zi3!Ijf&s^drpmM0l^9H1r255#>462urcO6MWnt@Zm~2UO!x+|}Xu52z-GUP=wX||5 zn2w=VdnWKU$P5e|oztiM>khJTitlA72ce)?aY^g%xoz0eJS~tp7@+JqT@`-^S%5)N zZ%4OT&L4eU?Nfix_1x}AQsD~8Q69G!aSW|&zIA2f`Vr^Umu%z`DiOG{PhA>bC|M}D zIMzMJx*qnyau)d>qqDnI#+>#j?j>pQ4Au!+c3H4T-6*EvOxcY>_uWYLqp;c#`V|W2 zCR(oHxi-JFd89I)@PlBzTv9gDYN~>e9+%=EkbPw_8Y+iSWQ6Z8VirhMtT$FS*WNT< zciz{PBdEvyzH)YXG>nCEE;y=N|0Ag^F%oJLQ-t=sA(JWlvaM|5Nl#hbXkX>hu(DYY z(lg-GNc8v8oZOG+;vlXBAyQvB!JNo(Bt1CS3UPyhe` literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db98ee8174f34cac3b2da851a4e91cec356605ba GIT binary patch literal 673 zcmYjOy>1gh5dLQO>`RP|PeBS�$8H-5`+y1tbIwQc@g}A&qsqTkysA$L<or;Nr%n zYg?cYC?zf=D3izneCE8s7sR8^AFjsPh+O}jva=?!^Vu@bQu1y-JQa6Xp0Su;tSn#h zwOavm51ByB!#9MhZ&(9s!a_p-^huWjm(n}81pT%31lTe_iG_gvgjEFF*(GcQrqv+= z+r^>>Z9zl~HGWeOUa!TjDE4hbU*e5D4bY>9n8aG`L~UH)xx27XSGlo9d*a&f*oEiubFFLbx=ETU!rDw+^k%b&Q-ej|2p-@O6ic>nj=<_LkdKfhIAkfq@;)jv`;;8D0IZp zQAc<9+CiGj>D~g@iYjT9mI#a%xWW}G_Oi!MuH}&`Pea7c#K_RNMHbt7{zza;0$2dhg0-; zaK_+8u?vCmVbKM34;W*(YW%8T@RBwKaLOQR(0C4T=7DL#DUK~T_vqeeAGx>)*rU&J z=%3twE={cp&1YG9DEMosbXpc%8avgz(|aerg-ejeq11Th>#Od`8S|`#4qwCJU>8 zEW7=@E=-!s7b~~*G3B-~Q)OL+f!fB@*li_$ty3kFXa(Cx*fg*6$iZ8dJ3d##4sCc- z%%xaFS2+3zCp5u9>kZaq9k#^+c8jSG&?89p)QA$I#?ca@fr2@AB0(7-O^Y_DcS&?( z!$=uO3dsoh2))tMa7D6%41IMA_pA45pkuGc_|`mrEhEZgY|_I_uA;q*D>c;-V1zx4 zP<@EDAO|&uonm$IeTK$5J`BUXRqOZy7-Nl~Yl`BfXv4FstowvEtZZt5zNyqvC8uK8^&`n`?zLw-C@#T)^rah(~$mU(5Co7E01Ex3sF>a46R z7j?y_F)C^3W=9r~YElxWj^lOQ5HhC~d=C3p7`&dr_C|u=QdjOv_}0Jr5^P?Bj-|5 zr?f%+2Bl5vHz{pVzh%~Hlq^x&rhXgm_@qPVqdG+mI&i3ejXsT<6t(Cj&TElarVGrj zV0MY3ww`U1SkbfBS)<)<=f6;wx>mUy?yEeR79xn#NiK`+u2VMSLP)e!l?@(_#i=S= zJo+k3rb0oay%nm_A7hn<#b8t}Rc|WJ4$A9KGgX915*BfuJ&`h(IA%$TFbW2vX*O1+ zr$*tu4}PuxfA!IQ{r|!H_Xe!e{Bbb&7)_<<1TmaIlW_#J4jU1ncj+ZwU5aXq2+Rkj z1{WR!qd6>nfHemL2uDEhnwE#aGDRzT+%ni)FFm$Ls9E^PKbGNSBBWo8!ouI5#!007 zbea_LBoY2di}_f|vw`r#Eb<2GQyURaH*)#(57*VM8rJM>#zd&zo4#Lgk-5sMYc8%~u%ICLa$z%xkiT}j)^^vH9@aHT7_(LK zHg_C8uk@9y)o;*D7+AATrG~-d%?ICrJaY!egT9*nARzN$*hu0rh_Zhu z2F3qH3fOXoEoh>v>?&Q}`8C7J)vG|V$is!5-faDiaI@6HW(Jy%(O|!e0fVj6C6NBd zO-=%gf{t>we-F_AdFKo50DHT%hFk6=EJl(k@gpj;++&C-7aduv z)(21Zf^k6CSsN;Ak2q)k-}GqI?hpk|}M7#Q~xHCGYZx z6_M=xOU}{&aI{MXn8Q%5pliFHwOnuCYCG*l+ikmgb%2G%<5VMcAA|3g8-FJnf?vAm z_!}w2K#aSX%n@sg%Aqw^;; z#n(sM^Q=`*Bi3EzI2uloJP=2ct&=y=^_Nj_^@6WN7Ui<1;uC$hnj2bQxj)hC^J1*G zpoKCQl(w2L=<+o|UA6VV+ksB@8kw@Q`)ud4?N7D8p6r&Mxk+@S8NV)!dgZyY@z8|- Y?>Ob?P+hUx_HFyNv*LQSWoPZdcVE^X*8l(j literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/logging.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/logging.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..369f9675b4528f7d61201923c2c3305688969099 GIT binary patch literal 5712 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 bFQmq-QVPmhH7yHn!egt-T|yMzZW#Yg?_pcV=4C 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 XwN7y+qQOw6+3q`8E%6=86A<6 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71e882e595fee426c721659adadab34a4d3963b6 GIT binary patch literal 4222 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 Jwb$%b=RW~4$k+e? literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/typing.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/typing.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7c0c3d4a93f5f897950c3a87811950d16452f9a GIT binary patch literal 1292 zcmZWpO>fgc6m(Mr$Wo<>3kNPw;(#i}HvJHwfDou6r9wniDTnrwZ0whKg}rNb*9rbX z9QaGU@-H|syGcu1tYl?-cjwKUnf2qXt$6zYd{Npj##k~Rn_(XRaok_Drm~SA#EHNBpjI*ebt_4;Yk&~C0Al%CTxk4 zl*H1J$eksDA1R&a=I+KqgQ?PvO0n=zorg^Vu3oSyS)gtgqaQg}VE5hXbf8@nZ{?DmfCzHVKn3oyZb>}f{J>%GV99qpr6+s2vaU4HV7Ju z%5u`hx>;G}=K+saLcN*MwUA&=B+Rx0I*r+3=D;wq2f9U zR--Vei#P|iZhTGZ<($>k!rnmk1e1391KK%IM@YDG8>u7X5I$CX) zGx~pO5Rk9YZzH8?O7s)~`Yr}EJb1nv$EQ3SQ0ZJ_2U#|ku570%9L$=K$IKtfOj_Hr z&Gz?pU&O=FPVe%;cwFdwJidJNKY?G7*~I5441Zo{u5L24m`H^$PE{o@`QTOISo@dZ df8Bc)de2sj)26$8_-1AD+b8}T*TZnX_ZL>9vhM%@ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/ui.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/__pycache__/ui.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e340f4f7dabf14808ee8e4de3c566c48147ef9c8 GIT binary patch literal 12680 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 z z$Q|UZ-onn2_q6YNuyV?046u&1l9?X z!Nw`JPY3nsEVDdC53-PMuo`)NJ|a=y$5-lmC?XF(OnaS2VHVlkps@qJFe|4cuQ7r- zd_iI~diw`alpYCw=-J1Q1Fi(W0qRPc1t^o?vWGdx)V>|u;Hi1R5au1zqII#7+v&|p zH1Qda{W%wXiIf^|6zaPuuEa|!8|4fv5W|{yk{@pa*YWtbQS25$EqqA3J;C)72x4*` z3R%Q9TNJrO^r3TZkWo4KS*nzyb5fnWjtuN#FLUmb$LHA!;`euNGN3u}ewNSz@?u?h&4fF|Pe5tbv#-Vx1U zg)?kJpkv&%%=1ZHEn8DBYa;t(ipi{uA|)PW?^LoSgjqgxw}rCdXk9@Y>#kNu93|-k z3foc;UQ!QGgd>QmplW)@|CGTjKVh!^$gzUe!Oc#LO<2<1alY;&fv}C&!e*9)x0uZw z3KO=PGSsVxt*)4wNS%xiskSkquWur9{23lrP2s>MDxd{WF2j()!TABqh1R(g9bg8a zQ36k9kA6kN4Bmv4{btEG8te^8jR~B5ontOYS}ITA7QYDT(~Dmk1??9U)h_{+aNnCg zPD}a5#{yqOP(K1t{Q?(EzA%jg014&QFEWhvAy#=rq>Z49$dqp?bk_&egh|IVXBXom zrXCx4GRD)R#_`lRs5cs)IPIXEe6h_AFztkH>HfYUP;ASPtM+h`%j=DN7xnAht1ky)NPibFco(q?Afk43j|FKeZ8HN2 zcQ{DY>-pczK%`2-9IRv<7iw?_t-2oWnyg^oK@w5cBz8^g0pmE_3MiIu80uX{;Lz|T z?6LzaVZsk~?uOvc^fx#~JmASXgp6P6xmzje+OM2#f0-g$H=ONSp1bkI639rodZATY#Nl8(?@ zY6dq2n+>mtiwqXxOx{GpjMee%%4pw_(J67(7uDn9J6r&D5*sLlkq9Q-|4wveExAJ= zL=KA!8%-P6;&3rDrGxc63mHQ69gGgkIPmer4MO9uG7k=69?G9G#!_X(O5Pc4E;{uZS(t4qvBvN9Nsx5 z(0=Z6NXB!bJCRkn6ItcEYmGpka~vMlAqrWw7pa%BV~95H$m!$Wp)=qTD9nwTVia=G z%QRlp3>SaE;37ihcO`1pafnFC8Ez@m`IG^vzcANXUc(JHxy~W?9pw05j^yM(L-P9y z7K7BcxM*;(%mu5Lq(T+;Q&KH1R=9Y`1?LaKeG!k_4G(AMN(50{?g8OsAsLV~vF_sL z6|U*qE3ZS+$X6()A!hNvBXIYsnIpzH{>nexUKmfMjRSB6M^a + Unix: ~/.cache/ (XDG default) + Windows: C:\Users\\AppData\Local\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go + in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the + non-roaming app data dir (the default returned by `user_data_dir`). Apps + typically put cache data somewhere *under* the given dir here. Some + examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + """ + if WINDOWS: + # Get the base path + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + + # Add our app name and Cache directory to it + path = os.path.join(path, appname, "Cache") + elif sys.platform == "darwin": + # Get the base path + path = expanduser("~/Library/Caches") + + # Add our app name to it + path = os.path.join(path, appname) + else: + # Get the base path + path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) + + # Add our app name to it + path = os.path.join(path, appname) + + return path + + +def user_data_dir(appname, roaming=False): + r""" + Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/ + if it exists, else ~/.config/ + Unix: ~/.local/share/ # or in + $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\ ... + ...Application Data\ + Win XP (roaming): C:\Documents and Settings\\Local ... + ...Settings\Application Data\ + Win 7 (not roaming): C:\\Users\\AppData\Local\ + Win 7 (roaming): C:\\Users\\AppData\Roaming\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if WINDOWS: + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) + elif sys.platform == "darwin": + path = os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) if os.path.isdir(os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) + ) else os.path.join( + expanduser('~/.config/'), + appname, + ) + else: + path = os.path.join( + os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), + appname, + ) + + return path + + +def user_config_dir(appname, roaming=True): + """Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default True) can be set False to not use the + Windows roaming appdata directory. That means that for users on a + Windows network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/ + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if WINDOWS: + path = user_data_dir(appname, roaming=roaming) + elif sys.platform == "darwin": + path = user_data_dir(appname) + else: + path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) + path = os.path.join(path, appname) + + return path + + +# for the discussion regarding site_config_dirs locations +# see +def site_config_dirs(appname): + r"""Return a list of potential user-shared config dirs for this application. + + "appname" is the name of application. + + Typical user config directories are: + macOS: /Library/Application Support// + Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in + $XDG_CONFIG_DIRS + Win XP: C:\Documents and Settings\All Users\Application ... + ...Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory + on Vista.) + Win 7: Hidden, but writeable on Win 7: + C:\ProgramData\\ + """ + if WINDOWS: + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + pathlist = [os.path.join(path, appname)] + elif sys.platform == 'darwin': + pathlist = [os.path.join('/Library/Application Support', appname)] + else: + # try looking in $XDG_CONFIG_DIRS + xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + if xdg_config_dirs: + pathlist = [ + os.path.join(expanduser(x), appname) + for x in xdg_config_dirs.split(os.pathsep) + ] + else: + pathlist = [] + + # always look in /etc directly as well + pathlist.append('/etc') + + return pathlist + + +# -- Windows support functions -- + +def _get_win_folder_from_registry(csidl_name): + """ + This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + directory, _type = _winreg.QueryValueEx(key, shell_folder_name) + return directory + + +def _get_win_folder_with_ctypes(csidl_name): + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + + +if WINDOWS: + try: + import ctypes + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + . + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..3114f2d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,248 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import text_type + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress + ipaddress.ip_network = ipaddress.IPNetwork + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", + "get_extension_suffixes", +] + + +logger = logging.getLogger(__name__) + +if sys.version_info >= (3, 4): + uses_pycache = True + from importlib.util import cache_from_source +else: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None + + +if sys.version_info >= (3, 5): + backslashreplace_decode = "backslashreplace" +else: + # In version 3.4 and older, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + if sys.version_info[0] == 2: + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(u"\\x%x" % c for c in raw_bytes), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" + + +def console_to_str(data): + """Return a string, safe for output, of subprocess output. + + We assume the data is in the locale preferred encoding. + If it won't decode properly, we warn the user but decode as + best we can. + + We also ensure that the output can be safely written to + standard output without encoding errors. + """ + + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + s = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + s = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + s = s.encode(output_encoding, errors="backslashreplace") + s = s.decode(output_encoding) + + return s + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # Replace is ignored -- unicode to UTF-8 can't fail + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +def get_path_uid(path): + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +if sys.version_info >= (3, 4): + from importlib.machinery import EXTENSION_SUFFIXES + + def get_extension_suffixes(): + return EXTENSION_SUFFIXES +else: + from imp import get_suffixes + + def get_extension_suffixes(): + return [suffix[0] for suffix in get_suffixes()] + + +def expanduser(path): + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) +else: + def get_terminal_size(): + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/deprecation.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..bd744cf --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,89 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is purposely eagerly formatted as we want it to appear as if someone + # typed this entire message out. + message = "DEPRECATION: " + reason + if replacement is not None: + message += " A possible replacement is {}.".format(replacement) + if issue is not None: + url = "https://github.com/pypa/pip/issues/" + str(issue) + message += " You can find discussion regarding this at {}.".format(url) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/encoding.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..56f6036 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,33 @@ +import codecs +import locale +import re +import sys + +BOMS = [ + (codecs.BOM_UTF8, 'utf8'), + (codecs.BOM_UTF16, 'utf16'), + (codecs.BOM_UTF16_BE, 'utf16-be'), + (codecs.BOM_UTF16_LE, 'utf16-le'), + (codecs.BOM_UTF32, 'utf32'), + (codecs.BOM_UTF32_BE, 'utf32-be'), + (codecs.BOM_UTF32_LE, 'utf32-le'), +] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/filesystem.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e9cebd --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,28 @@ +import os +import os.path + +from pip._internal.utils.compat import get_path_uid + + +def check_path_owner(path): + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if not hasattr(os, "geteuid"): + return True + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/glibc.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..ebcfc5b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import + +import ctypes +import re +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/hashes.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..8b909ba --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, HashMissing, InstallationError, +) +from pip._internal.utils.misc import read_chunks + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + def check_against_chunks(self, chunks): + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/logging.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..d9b9541 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,225 @@ +from __future__ import absolute_import + +import contextlib +import logging +import logging.handlers +import os + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.misc import ensure_dir + +try: + import threading +except ImportError: + import dummy_threading as threading # type: ignore + + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + + +_log_state = threading.local() +_log_state.indentation = 0 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = logging.Formatter.format(self, record) + formatted = "".join([ + (" " * get_indentation()) + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(colorama.Fore.RED)), + (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ANSI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(logging.Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent", + }, + }, + "root": { + "level": root_level, + "handlers": ["console", "console_errors"] + ( + ["user_log"] if include_user_log else [] + ), + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/misc.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..e9e552e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,958 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +import locale +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import os +import posixpath +import re +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 +from pip._vendor.six.moves import input +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) +from pip._internal.utils.compat import ( + WINDOWS, console_to_str, expanduser, stdlib_pkgs, +) + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = std_logging.getLogger(__name__) + +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', '.whl') +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def import_or_raise(pkg_or_module_string, ExceptionType, *args, **kwargs): + try: + return __import__(pkg_or_module_string) + except ImportError: + raise ExceptionType(*args, **kwargs) + + +def ensure_dir(path): + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + # if file type currently read only + if os.stat(path).st_mode & stat.S_IREAD: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def display_path(path): + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def format_size(bytes): + if bytes > 1000 * 1000: + return '%.1fMB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%ikB' % (bytes / 1000) + elif bytes > 1000: + return '%.1fkB' % (bytes / 1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def is_svn_page(html): + """ + Returns true if the page appears to be the index page of an svn repository + """ + return (re.search(r'[^<]*Revision \d+:', html) and + re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + with open(filename, 'rb') as fp: + return fp.read().decode('utf-8') + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def split_leading_dir(path): + path = path.lstrip('/').lstrip('\\') + if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return path, '' + + +def has_leading_dir(paths): + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def normalize_path(path, resolve_symlinks=True): + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + """ + Return True if this is a path pip is allowed to modify. + + If we're in a virtualenv, sys.prefix points to the virtualenv's + prefix; only sys.prefix is considered local. + + If we're not in a virtualenv, in general we can modify anything. + However, if the OS vendor has configured distutils to install + somewhere other than sys.prefix (which could be a subdirectory of + sys.prefix, e.g. /usr/local), we consider sys.prefix itself nonlocal + and the domain of the OS vendor. (In other words, everything _other + than_ sys.prefix is considered local.) + + """ + + path = normalize_path(path) + prefix = normalize_path(sys.prefix) + + if running_under_virtualenv(): + return path.startswith(normalize_path(sys.prefix)) + else: + from pip._internal.locations import distutils_scheme + if path.startswith(prefix): + for local_path in distutils_scheme("").values(): + if path.startswith(normalize_path(local_path)): + return True + return False + else: + return True + + +def dist_is_local(dist): + """ + Return True if given Distribution object is installed somewhere pip + is allowed to modify. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + """ + Return True if given Distribution is installed in user site. + """ + norm_path = normalize_path(dist_location(dist)) + return norm_path.startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return normalize_path( + dist_location(dist) + ).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + """Is distribution an editable install?""" + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions(local_only=True, + skip=stdlib_pkgs, + include_editables=True, + editables_only=False, + user_only=False): + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + """ + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + return [d for d in pkg_resources.working_set + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + + +def dist_location(dist): + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def unzip_file(filename, location, flatten=True): + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + data = zip.read(name) + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + fp = open(fn, 'wb') + try: + fp.write(data) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + # note: python<=2.5 doesn't seem to know about pax headers, filter them + leading = has_leading_dir([ + member.name for member in tar.getmembers() + if member.name != 'pax_global_header' + ]) + for member in tar.getmembers(): + fn = member.name + if fn == 'pax_global_header': + continue + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file(filename, location, content_type, link): + filename = os.path.realpath(filename) + if (content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename)): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif (content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): + untar_file(filename, location) + elif (content_type and content_type.startswith('text/html') and + is_svn_page(file_contents(filename))): + # We don't really care about this + from pip._internal.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of %s' % location + ) + + +def call_subprocess(cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, unset_environ=None, spinner=None): + """ + Args: + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + """ + if unset_environ is None: + unset_environ = [] + # This function's handling of subprocess output is confusing and I + # previously broke it terribly, so as penance I will write a long comment + # explaining things. + # + # The obvious thing that affects output is the show_stdout= + # kwarg. show_stdout=True means, let the subprocess write directly to our + # stdout. Even though it is nominally the default, it is almost never used + # inside pip (and should not be used in new code without a very good + # reason); as of 2016-02-22 it is only used in a few places inside the VCS + # wrapper code. Ideally we should get rid of it entirely, because it + # creates a lot of complexity here for a rarely used feature. + # + # Most places in pip set show_stdout=False. What this means is: + # - We connect the child stdout to a pipe, which we read. + # - By default, we hide the output but show a spinner -- unless the + # subprocess exits with an error, in which case we show the output. + # - If the --verbose option was passed (= loglevel is DEBUG), then we show + # the output unconditionally. (But in this case we don't want to show + # the output a second time if it turns out that there was an error.) + # + # stderr is always merged with stdout (even if show_stdout=True). + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + logger.debug("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=stdout, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + if stdout is not None: + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if logger.getEffectiveLevel() <= std_logging.DEBUG: + # Show the line immediately + logger.debug(line) + else: + # Update the spinner + if spinner is not None: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + if spinner is not None: + if proc.returncode: + spinner.finish("error") + else: + spinner.finish("done") + if proc.returncode: + if on_returncode == 'raise': + if (logger.getEffectiveLevel() > std_logging.DEBUG and + not show_stdout): + logger.info( + 'Complete output from command %s:', command_desc, + ) + logger.info( + ''.join(all_output) + + '\n----------------------------------------' + ) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + if not show_stdout: + return ''.join(all_output) + + +def read_text_file(filename): + """Return the contents of *filename*. + + Try to decode the file contents with utf-8, the preferred system encoding + (e.g., cp1252 on some Windows machines), and latin1, in that order. + Decoding a byte string with latin1 will never raise an error. In the worst + case, the returned string will contain some garbage characters. + + """ + with open(filename, 'rb') as fp: + data = fp.read() + + encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] + for enc in encodings: + try: + data = data.decode(enc) + except UnicodeDecodeError: + continue + break + + assert type(data) != bytes # Latin1 should have worked. + return data + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) + + +def make_vcs_requirement_url(repo_url, rev, egg_project_name, subdir=None): + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + """ + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = tuple(auth.split(':', 1)) + else: + user_pass = auth, None + + return netloc, user_pass + + +def remove_auth_from_url(url): + # Return a copy of url with 'username:password@' removed. + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + + # parsed url + purl = urllib_parse.urlsplit(url) + netloc, user_pass = split_auth_from_netloc(purl.netloc) + + # stripped url + url_pieces = ( + purl.scheme, netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def protect_pip_from_modification_on_windows(modifying_pip): + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/models.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,40 @@ +"""Utilities for defining models +""" + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparision capabilities that is based on a key + """ + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/outdated.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..5bfbfe1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/outdated.py @@ -0,0 +1,154 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile, pkg_resources +from pip._vendor.packaging import version as packaging_version + +from pip._internal.index import PackageFinder +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class SelfCheckState(object): + def __init__(self, cache_dir): + self.state = {} + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join(cache_dir, "selfcheck.json") + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + def save(self, pypi_version, current_time): + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + # Attempt to write out our version check file + with lockfile.LockFile(self.statefile_path): + if os.path.exists(self.statefile_path): + with open(self.statefile_path) as statefile: + state = json.load(statefile) + else: + state = {} + + state[sys.prefix] = { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + with open(self.statefile_path, "w") as statefile: + json.dump(state, statefile, sort_keys=True, + separators=(",", ":")) + + +def was_installed_by_pip(pkg): + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return (dist.has_metadata('INSTALLER') and + 'pip' in dist.get_metadata_lines('INSTALLER')) + except pkg_resources.DistributionNotFound: + return False + + +def pip_version_check(session, options): + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + finder = PackageFinder( + find_links=options.find_links, + index_urls=[options.index_url] + options.extra_index_urls, + allow_all_prereleases=False, # Explicitly set to False + trusted_hosts=options.trusted_hosts, + process_dependency_links=options.process_dependency_links, + session=session, + ) + all_candidates = finder.find_all_candidates("pip") + if not all_candidates: + return + pypi_version = str( + max(all_candidates, key=lambda c: c.version).version + ) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + # Determine if our pypi_version is older + if (pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip')): + # Advise "python -m pip" on Windows to avoid issues + # with overwriting pip.exe. + if WINDOWS: + pip_cmd = "python -m pip" + else: + pip_cmd = "pip" + logger.warning( + "You are using pip version %s, however version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/packaging.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..c43142f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,75 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal import exceptions +from pip._internal.utils.misc import display_path + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + metadata = dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + feed_parser = FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + +def check_dist_requires_python(dist): + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s", + dist.project_name, requires_python, e, + ) + return + + +def get_installer(dist): + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/setuptools_build.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/temp_dir.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..edc506b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,82 @@ +from __future__ import absolute_import + +import logging +import os.path +import tempfile + +from pip._internal.utils.misc import rmtree + +logger = logging.getLogger(__name__) + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory or None + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + create() + Creates a temporary directory and stores its path in the path + attribute. + cleanup() + Deletes the temporary directory and sets path attribute to None + + When used as a context manager, a temporary directory is created on + entering the context and, if the delete attribute is True, on exiting the + context the created directory is deleted. + """ + + def __init__(self, path=None, delete=None, kind="temp"): + super(TempDirectory, self).__init__() + + if path is None and delete is None: + # If we were not given an explicit directory, and we were not given + # an explicit delete option, then we'll default to deleting. + delete = True + + self.path = path + self.delete = delete + self.kind = kind + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + self.create() + return self + + def __exit__(self, exc, value, tb): + if self.delete: + self.cleanup() + + def create(self): + """Create a temporary directory and store it's path in self.path + """ + if self.path is not None: + logger.debug( + "Skipped creation of temporary directory: {}".format(self.path) + ) + return + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) + + def cleanup(self): + """Remove the temporary directory created and reset state + """ + if self.path is not None and os.path.exists(self.path): + rmtree(self.path) + self.path = None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/typing.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..e085cdf --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... # noqa: F401 + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/ui.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/ui.py new file mode 100644 index 0000000..6bab904 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/utils/ui.py @@ -0,0 +1,421 @@ +from __future__ import absolute_import, division + +import contextlib +import itertools +import logging +import sys +import time +from signal import SIGINT, default_int_handler, signal + +from pip._vendor import six +from pip._vendor.progress.bar import ( + Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, + ShadyBar, +) +from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin +from pip._vendor.progress.spinner import Spinner + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation +from pip._internal.utils.misc import format_size +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any # noqa: F401 + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + + def update(self): + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it, n=1): + for x in it: + yield x + self.next(n) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call neds to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + +# NOTE: The "type: ignore" comments on the following classes are there to +# work around https://github.com/python/typing/issues/241 + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): # type: ignore + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore + IncrementalBar): + pass + + +class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore + ChargingBar): + pass + + +class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore + pass + + +class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore + FillingSquaresBar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, WritelnMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 + + def ready(self): + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + self._last_update = time.time() + + +class InteractiveSpinner(object): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(object): + def __init__(self, message, min_update_interval_seconds=60): + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..794b35d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,509 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Optional, Tuple # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +__all__ = ['vcs', 'get_src_requirement'] + + +logger = logging.getLogger(__name__) + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__(self, vcs, rev=None, extra_args=None): + """ + Args: + vcs: a VersionControl object. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vcs = vcs + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vcs.name, self.rev) + + @property + def arg_rev(self): + if self.rev is None: + return self.vcs.default_arg_rev + + return self.rev + + def to_args(self): + """ + Return the VCS-specific command arguments. + """ + args = [] + rev = self.arg_rev + if rev is not None: + args += self.vcs.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vcs.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, Command] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + return list(self._registry.values()) + + @property + def dirnames(self): + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + schemes = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, cls=None, name=None): + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warning('Cannot unregister because no class or name given') + + def get_backend_name(self, location): + """ + Return the name of the version control backend if found at given + location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + if vc_type.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vc_type.name) + return vc_type.name + return None + + def get_backend(self, name): + name = name.lower() + if name in self._registry: + return self._registry[name] + + def get_backend_from_location(self, location): + vc_type = self.get_backend_name(location) + if vc_type: + return self.get_backend(vc_type) + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + def get_base_rev_args(self, rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def make_rev_options(self, rev=None, extra_args=None): + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(self, rev, extra_args=extra_args) + + def _is_local_repository(self, repo): + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or drive + + def export(self, location): + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + """ + raise NotImplementedError + + def get_netloc_and_auth(self, netloc, scheme): + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + def get_url_rev_and_auth(self, url): + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + def make_rev_args(self, username, password): + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + url, rev, user_pass = self.get_url_rev_and_auth(url) + username, password = user_pass + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return url, rev_options + + def normalize_url(self, url): + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def is_commit_id_equal(self, dest, name): + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest): + """ + Install or update in editable mode the package represented by this + VersionControl object. + + Args: + dest: the repository directory in which to install or update. + """ + url, rev_options = self.get_url_rev_options(self.url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_url(dest) + if self.compare_urls(existing_url, url): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) + + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) + + if response == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location): + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + def get_src_requirement(self, dist, location): + """ + Return a string representing the requirement needed to + redownload the files currently present in location, something + like: + {repository_url}@{revision}#egg={project_name}-{version_identifier} + """ + raise NotImplementedError + + def get_url(self, location): + """ + Return the url used at location + """ + raise NotImplementedError + + def get_revision(self, location): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + def run_command(self, cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, spinner=None): + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = [self.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode, + command_desc, extra_environ, + unset_environ=self.unset_environ, + spinner=spinner) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (self.name, self.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def controls_location(cls, location): + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For example, + the Git override checks that Git is actually available. + """ + return cls.is_repository_directory(location) + + +def get_src_requirement(dist, location): + version_control = vcs.get_backend_from_location(location) + if version_control: + try: + return version_control().get_src_requirement(dist, + location) + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + version_control.name, + ) + return dist.as_requirement() + logger.warning( + 'cannot determine version of editable source in %s (is not SVN ' + 'checkout, Git clone, Mercurial clone or Bazaar branch)', + location, + ) + return dist.as_requirement() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c1161eee7d1ce14e92ae30f4f93d2a249da7112 GIT binary patch literal 16427 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ba8ef2f89bcffae5cd61e8775b22e6f7854fc0 GIT binary patch literal 4095 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 Vww<=yaXa|E&~Y~0WpCpT{{^xvp+f)w literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/git.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/git.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db3b4ea5b64e58eed877e04afed80ceacdc37b54 GIT binary patch literal 9963 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24909a2ba30cfca2ab1881edbca89c1db97ac4fe GIT binary patch literal 4058 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 R@STp+K{~_Zth!s@{tpeBtbzal literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e12fa107e0adc31b92271e1f2af25d1a4bbddfde GIT binary patch literal 6955 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/bazaar.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..3cc66c9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,112 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # This is only needed for python <2.7.5 + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['export', location], + cwd=temp_dir.path, show_stdout=False, + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, url, rev_options): + cmd_args = ['pull', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + def get_url(self, location): + urls = self.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if self._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + def get_revision(self, location): + revision = self.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + current_rev = self.get_revision(location) + egg_project_name = dist.egg_name().split('-', 1)[0] + return make_vcs_requirement_url(repo, current_rev, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/git.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..9778539 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,346 @@ +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.compat import samefile +from pip._internal.utils.misc import display_path, make_vcs_requirement_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +HASH_REGEX = re.compile('[a-fA-F0-9]{40}') + + +def looks_like_hash(sha): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') + default_arg_rev = 'HEAD' + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + super(Git, self).__init__(url, *args, **kwargs) + + def get_base_rev_args(self, rev): + return [rev] + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version becasue + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + def get_branch(self, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + args = ['rev-parse', '--abbrev-ref', 'HEAD'] + output = self.run_command(args, show_stdout=False, cwd=location) + branch = output.strip() + + if branch == 'HEAD': + return None + + return branch + + def export(self, location): + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + def get_revision_sha(self, dest, rev): + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = self.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + def resolve_revision(self, dest, url, rev_options): + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + sha, is_branch = self.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + self.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = self.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + def is_commit_id_equal(self, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return self.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', url, rev_display, display_path(dest), + ) + self.run_command(['clone', '-q', url, dest]) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + elif self.get_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest, url, rev_options): + self.run_command(['config', 'remote.origin.url', url], cwd=dest) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + def get_url(self, location): + """Return URL of the first remote encountered.""" + remotes = self.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + show_stdout=False, cwd=location, + ) + remotes = remotes.splitlines() + found_remote = remotes[0] + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + def get_revision(self, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = self.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + def _get_subdirectory(self, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = self.run_command(['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + root_dir = os.path.join(git_dir, '..') + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + # relative path of setup.py to repo root + if samefile(root_dir, location): + return None + return os.path.relpath(location, root_dir) + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + current_rev = self.get_revision(location) + egg_project_name = dist.egg_name().split('-', 1)[0] + subdir = self._get_subdirectory(location) + req = make_vcs_requirement_url(repo, current_rev, egg_project_name, + subdir=subdir) + + return req + + def get_url_rev_and_auth(self, url): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + + return url, rev, user_pass + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + self.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls().run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore') + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/mercurial.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..17cfb67 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,101 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path, make_vcs_requirement_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + def get_base_rev_args(self, rev): + return [rev] + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def get_url(self, location): + url = self.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if self._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + def get_revision(self, location): + current_revision = self.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + def get_revision_hash(self, location): + current_rev_hash = self.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + current_rev_hash = self.get_revision_hash(location) + egg_project_name = dist.egg_name().split('-', 1)[0] + return make_vcs_requirement_url(repo, current_rev_hash, + egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/subversion.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..6f7cb5d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.models.link import Link +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, +) +from pip._internal.vcs import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(self.url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = ['export'] + rev_options.to_args() + [url, location] + self.run_command(cmd_args, show_stdout=False) + + def fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + cmd_args = ['switch'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + cmd_args = ['update'] + rev_options.to_args() + [dest] + self.run_command(cmd_args) + + def get_location(self, dist, dependency_links): + for url in dependency_links: + egg_fragment = Link(url).egg_fragment + if not egg_fragment: + continue + if '-' in egg_fragment: + # FIXME: will this work when a package has - in the name? + key = '-'.join(egg_fragment.split('-')[:-1]).lower() + else: + key = egg_fragment + if key == dist.key: + return url.split('#', 1)[0] + return None + + def get_revision(self, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if self.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(self.dirname) + entries_fn = os.path.join(base, self.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = self._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + def get_netloc_and_auth(self, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, self).get_netloc_and_auth( + netloc, scheme) + + return split_auth_from_netloc(netloc) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + def make_rev_args(self, username, password): + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + def get_url(self, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return self._get_svn_url_rev(location)[0] + + def _get_svn_url_rev(self, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, self.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = self.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if repo is None: + return None + repo = 'svn+' + repo + rev = self.get_revision(location) + # FIXME: why not project name? + egg_project_name = dist.egg_name().split('-', 1)[0] + return make_vcs_requirement_url(repo, rev, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/wheel.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/wheel.py new file mode 100644 index 0000000..5ce890e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_internal/wheel.py @@ -0,0 +1,831 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import collections +import compileall +import csv +import hashlib +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from email.parser import Parser + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six import StringIO + +from pip._internal import pep425tags +from pip._internal.download import path_to_url, unpack_url +from pip._internal.exceptions import ( + InstallationError, InvalidWheelFilename, UnsupportedWheel, +) +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, distutils_scheme, +) +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + call_subprocess, captured_stdout, ensure_dir, read_chunks, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import Dict, List, Optional # noqa: F401 + +wheel_ext = '.whl' + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def rehash(path, blocksize=1 << 20): + """Return (hash, length) for path using hashlib.sha256()""" + h = hashlib.sha256() + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + return (digest, length) + + +def open_for_csv(name, mode): + if sys.version_info[0] < 3: + nl = {} + bin = 'b' + else: + nl = {'newline': ''} + bin = '' + return open(name, mode + bin, **nl) + + +def fix_script(path): + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + + +def get_entrypoints(filename): + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + """get the string representation of EntryPoint, remove space and split + on '='""" + return str(s).replace(" ", "").split("=") + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (List[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) for i in + os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, scripts in warn_for.items(): + scripts = sorted(scripts) + if len(scripts) == 1: + start_text = "script {} is".format(scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(scripts[:-1]) + " and " + scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, + pycompile=True, scheme=None, isolated=False, prefix=None, + warn_script_location=True): + """Install a wheel""" + + if not scheme: + scheme = distutils_scheme( + name, user=user, home=home, root=root, isolated=isolated, + prefix=prefix, + ) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} + changed = set() + generated = [] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None, filter=None): + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base and + s.endswith('.dist-info') and + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) + info_dir.append(destsubdir) + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # copyfile (called below) truncates the destination if it + # exists and then writes the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(destfile): + os.unlink(destfile) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + # Get the defined entry points + ep_file = os.path.join(info_dir[0], 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = ScriptMaker(None, scheme['scripts']) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Simplify the script and fix the fact that the default script swallows + # every single stack trace. + # See https://bitbucket.org/pypa/distlib/issue/34/ + # See https://bitbucket.org/pypa/distlib/issue/33/ + def _get_script_text(entry): + if entry.suffix is None: + raise InstallationError( + "Invalid script entry point: %s for req: %s - A callable " + "suffix is required. Cf https://packaging.python.org/en/" + "latest/distributing.html#console-scripts for more " + "information." % (entry, req) + ) + return maker.script_template % { + "module": entry.prefix, + "import_name": entry.suffix.split(".")[0], + "func": entry.suffix, + } + + maker._get_script_text = _get_script_text + maker.script_template = r"""# -*- coding: utf-8 -*- +import re +import sys + +from %(module)s import %(import_name)s + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +""" + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'pip = ' + pip_script + generated.extend(maker.make(spec)) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + spec = 'pip%s = %s' % (sys.version[:1], pip_script) + generated.extend(maker.make(spec)) + + spec = 'pip%s = %s' % (sys.version[:3], pip_script) + generated.extend(maker.make(spec)) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'easy_install = ' + easy_install_script + generated.extend(maker.make(spec)) + + spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) + generated.extend(maker.make(spec)) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + if len(console) > 0: + generated_console_scripts = maker.make_multiple( + ['%s = %s' % kv for kv in console.items()] + ) + generated.extend(generated_console_scripts) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + if len(gui) > 0: + generated.extend( + maker.make_multiple( + ['%s = %s' % kv for kv in gui.items()], + {'gui': True} + ) + ) + + # Record pip as the installer + installer = os.path.join(info_dir[0], 'INSTALLER') + temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + writer = csv.writer(record_out) + outrows = [] + for row in reader: + row[0] = installed.pop(row[0], row[0]) + if row[0] in changed: + row[1], row[2] = rehash(row[0]) + outrows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + outrows.append((normpath(f, lib_dir), digest, length)) + for f in installed: + outrows.append((installed[f], '', '')) + for row in sorted(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return False if we couldn't parse / extract it. + """ + try: + dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] + + wheel_data = dist.get_metadata('WHEEL') + wheel_data = Parser().parsestr(wheel_data) + + version = wheel_data['Wheel-Version'].strip() + version = tuple(map(int, version.split('.'))) + return version + except Exception: + return False + + +def check_compatibility(version, name): + """ + Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if not version: + raise UnsupportedWheel( + "%s is in an unsupported or invalid wheel" % name + ) + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) + + +class Wheel(object): + """A wheel file""" + + # TODO: maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) + ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + (x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def support_index_min(self, tags=None): + """ + Return the lowest index that one of the wheel's file_tag combinations + achieves in the supported_tags list e.g. if there are 8 supported tags, + and one of the file tags is first in the list, then return 0. Returns + None is the wheel is not supported. + """ + if tags is None: # for mock + tags = pep425tags.get_supported() + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.get_supported() + return bool(set(tags).intersection(self.file_tags)) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__(self, finder, preparer, wheel_cache, + build_options=None, global_options=None, no_clean=False): + self.finder = finder + self.preparer = preparer + self.wheel_cache = wheel_cache + + self._wheel_dir = preparer.wheel_download_dir + + self.build_options = build_options or [] + self.global_options = global_options or [] + self.no_clean = no_clean + + def _build_one(self, req, output_dir, python_tag=None): + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return self._build_one_inside_env(req, output_dir, + python_tag=python_tag) + + def _build_one_inside_env(self, req, output_dir, python_tag=None): + with TempDirectory(kind="wheel") as temp_dir: + if self.__build_one(req, temp_dir.path, python_tag=python_tag): + try: + wheel_name = os.listdir(temp_dir.path)[0] + wheel_path = os.path.join(output_dir, wheel_name) + shutil.move( + os.path.join(temp_dir.path, wheel_name), wheel_path + ) + logger.info('Stored in directory: %s', output_dir) + return wheel_path + except Exception: + pass + # Ignore return, we can't do anything else useful. + self._clean_one(req) + return None + + def _base_setup_args(self, req): + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + return [ + sys.executable, '-u', '-c', + SETUPTOOLS_SHIM % req.setup_py + ] + list(self.global_options) + + def __build_one(self, req, tempd, python_tag=None): + base_args = self._base_setup_args(req) + + spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ + + self.build_options + + if python_tag is not None: + wheel_args += ["--python-tag", python_tag] + + try: + call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + return True + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return False + + def _clean_one(self, req): + base_args = self._base_setup_args(req) + + logger.info('Running setup.py clean for %s', req.name) + clean_args = base_args + ['clean', '--all'] + try: + call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build(self, requirements, session, autobuilding=False): + """Build wheels. + + :param unpack: If True, replace the sdist we built from with the + newly built wheel, in preparation for installation. + :return: True if all the wheels built correctly. + """ + from pip._internal import index + from pip._internal.models.link import Link + + building_is_possible = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert building_is_possible + + buildset = [] + format_control = self.finder.format_control + for req in requirements: + if req.constraint: + continue + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + elif autobuilding and req.editable: + pass + elif autobuilding and not req.source_dir: + pass + elif autobuilding and req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + buildset.append((req, True)) + else: + ephem_cache = False + if autobuilding: + link = req.link + base, ext = link.splitext() + if index.egg_info_matches(base, None, link) is None: + # E.g. local directory. Build wheel just for this run. + ephem_cache = True + if "binary" not in format_control.get_allowed_formats( + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + continue + buildset.append((req, ephem_cache)) + + if not buildset: + return True + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join([req.name for (req, _) in buildset]), + ) + _cache = self.wheel_cache # shorter name + with indent_log(): + build_success, build_failure = [], [] + for req, ephem in buildset: + python_tag = None + if autobuilding: + python_tag = pep425tags.implementation_tag + if ephem: + output_dir = _cache.get_ephem_path_for_link(req.link) + else: + output_dir = _cache.get_path_for_link(req.link) + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning("Building wheel for %s failed: %s", + req.name, e) + build_failure.append(req) + continue + else: + output_dir = self._wheel_dir + wheel_file = self._build_one( + req, output_dir, + python_tag=python_tag, + ) + if wheel_file: + build_success.append(req) + if autobuilding: + # XXX: This is mildly duplicative with prepare_files, + # but not close enough to pull out to a single common + # method. + # The code below assumes temporary source dirs - + # prevent it doing bad things. + if req.source_dir and not os.path.exists(os.path.join( + req.source_dir, PIP_DELETE_MARKER_FILENAME)): + raise AssertionError( + "bad source dir - missing marker") + # Delete the source we built the wheel from + req.remove_temporary_source() + # set the build directory again - name is known from + # the work prepare_files did. + req.source_dir = req.build_location( + self.preparer.build_dir + ) + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + assert req.link.is_wheel + # extract the wheel into the dir + unpack_url( + req.link, req.source_dir, None, False, + session=session, + ) + else: + build_failure.append(req) + + # notify success/failure + if build_success: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_success]), + ) + if build_failure: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failure]), + ) + # Return True if all builds were successful + return len(build_failure) == 0 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..07db110 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,114 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = True + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.join(sys.prefix, 'share', 'python-wheels')) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(vendored_name, globals(), locals(), level=0) + except ImportError: + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("lockfile") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pkg_resources") + vendored("progress") + vendored("pytoml") + vendored("retrying") + vendored("requests") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + try: + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + except ImportError: + # Debian already unbundles these from requests. + pass + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("urllib3") diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ef2bfe1b62210ee9ae8bd4f036e00bca4f279da GIT binary patch literal 3046 zcmbW3-E!PC6vvP3U3+(vZIgbbDYUrX-Ih503hhOQVIX1X(CGz*X`5lj<Jd~piEJ53 zn`YhiDsT@oyaE?I2sb=}hC8nM3S4pI-G~g3O{cqS`Df{`BUw7<Xy>}!&de{Ao;eQi zC+z!7A%B9G{Mi9W0amdjkUGE!<PNMlK+LlX%!O6AZbNRsYIBc0SoI*q8XssAHe0aS z-h&QM4>qSDMX?9FF6<Imorcthv<2VeU|pa-h#wv5!lt{g7i!wD>lnSU(1N+q4d;Qs z9~^i<yO4HFJ25n6Y1&fP(h*BXEzMY(wRFtVaZ4vGowRhy(wwE!mgX&;vGks$_br{Z zbk5QTmI6!XEnTp5(b6SLmn~hfbhW18X)ud)%~tnndRiQV20a2>9T2WV2zg!*cxIH> zt@4JY4=pWN3N0;Kx@qZ_rQ4S7Sh{Oz$<jxb?$v~Q{iJul`lC~3Wf*PKBIP2;WU!96 z(Nk7z1Su`Cg%(LhWx&@16bFh2rJ$%$K|yJ1WTWcNNFDGZkUXcVZ<^?iqN0dd*y((p zF|?8uGE3>$m>pU6`GBRt8VwR&3j|GrEYAljUSl+fi!>NZc)^CK>kP^?Rw%;hY*QgK z>=vvGo(F?cDna8s?7T6-*dzLAye2stC>mvX$%T6SwQkCOENIm&hpNwug%^EFnM{c3 zfS(3l7|rk*Uh;P=FitlC6oFS@V&^r1VF1d3R|FJ>9yT>hiLs6Ay6Y11wD<`cs#!b0 zZ-5Rk)}!(OJvz)-zisr-i!b4s!T|NnnDb*I@BoLzpv9zsk&jdP7H5M$7gQU@A_wMQ z;j`_F$zkMwn1i15yvLRQ^5*OC<*nDc$#5T;Ft4pi_{Q9O9qpkH<gwDNC@SKdMv?AB z<CR19HyB@wnbaQRiMdZbtQU1f2rjfMhf@1FPY1Zy+7q&5nbN+bDppGL8oD!TGlq3{ z<Y+Xl$I*?oSW?~S(>VPV#7UgYUrUQBFBj3h7SL@}%-F&`diQ>+C^wb$HTK;_oMMrw zC<@D=ZtWR9i$>%rEPxzyToRBjsmpfLIYCYnF^4Tx^LqHA&-8Q>Cw+?UrvzuZm2k#I zoX6TvGpSg%rac3K>sDXoY{}HLa0#~7(XH{lvz@AqMVRw#Dytcb;Xp9dR;T`56PB^S z_idMPvK4P&tW>iW!?8<OC;q9DB~7yR41Ha9%dL$_P{{`(!DVihf^Xm>E;#x#&vEvG zDltTxhQ1q6sbn>~M>wz<5obC7pQ`a}?^IU~YziY>8b%XkLaw@Wunw297|E(@Z=)(X zXVv+MN+ob5uOBK23&qeW(cF#0wdIgwl9Q56dKbEr&~o&~!NDeRcUUT`3zHO#mRzby z8oND<2iw`xgj}Q)b7hofiJG)&wu5ohrMEDQ3ld=#NcvG9=WF7%T6w2#p~)SL=6GPl zW(BLu6U^YA<#B<|DJFTs*ubPk#BeClKWTOD;L!#uV^wc*d$`YwC&Yv?74A*z>LDiW z+$IFi*dRu6b@32$W~U}?eQio*Ipu?iepl--TWNokvhMVbYCnono{Wxw^?@1)JPri@ zodw-6=YaOP#B`$i+Tl`kO?`WL<<oB-FF#sY){VNw$J4il#wO1SOi_ZaXFIz6^oy01 zN73@buj(u;rm=IK^!F7ebL-ZF(UI}7k55uz;gK0<n&7wTc~`yZvz~j~?T~l>y4d#! N={ikg!})(Ze*+aBc`^V1 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..8beedea --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__init__.py @@ -0,0 +1,4 @@ +"""Wrappers to build Python packages using PEP 517 hooks +""" + +__version__ = '0.2' diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..829bdf3aa33dc2e7fc493a148ce6b36dd0226ced GIT binary patch literal 237 zcmX|+v1$TA5QgXOK!ZWBOS`RwUJQw*kYJNG99jfyhSOc{7SEmGb}yjsW8o`Zo3}`n zISU8Ak6~cuXP$<`!RTVl8UTKUdqvW%1V0jKfUP)!Z3H@o%{V#Fzw4aY)LsQryT(>p zWv5V*Q=IP)d11V2ymf`jJ~Q<;Td0!g;0NdAdHV7-j@v$>rafZ&i1;ICEIGt0)QQC1 z^tVjIkyExjvCfCQswNBb`mTeaZg@jBou)cv!xE7qT4w{|luzx$@<_U=%tzck(Ww{z E1LZ3~-v9sr literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57a9b3d93e3726c519a11e64c798f8d6ef63e45b GIT binary patch literal 5650 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 Dk9t>> literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a96c055bc3f9ae81c49e0282c18e02ec59bb0bd GIT binary patch literal 5119 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5618b3230715c62b90417cdf126737611c9b2a1a GIT binary patch literal 3102 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72764a8c3950903d23ceae39c9315de546c6d752 GIT binary patch literal 1033 zcmaJ<OK;Oa5T0E-&Vz)OmnfWkH6jh~MyNtaNC*K6kAOhASWb4+I8D6P+G&(3J%uak zui(I6+AF921y0O3O%p=tN;5m-UGIL6y;-T0Hh)Mt<^aE7Wnd4_F_Io80nozCKyVl^ zXkjt0IkY%P4t<Nh+!7Y-=Rm&&VS~uQH~b9?2Sh%ra}aHTD6A|MmrHnb(<>eBz6v5S zkgk@22%|k0J9n(Zl<L>bcMUg;+|Qq0R_k|N6}j&xX%DA|*|rDUCx{gqCl=-o5ujmX zT*7#Rkvzea0!$YK5b%t%<J)j#LCT=dVT!93OgVh#z`h{y4<El`ZhCgZu(2t~sG|tj zVQ!Rmt98#Zwu)tB?0%v!i_tLlY-6c*-`H`G_KdSX4)k7PSobIBGT#6DX)PVbwK$Bc zVU(o7U{KwWkLn_oiauuHAIL~3U5jP>`2J3<qlS3ac04g9(n9)lS)K?HJ78N(U>^ zsKY_rix@93l6#nl^TNPW&e!3HEjTlnF=(!{)tXK}BdT-QX$O<B2PzOA*K~&_aWi7` zRG|$;vM)nPt4owuu=~py+WoIHGY-e@x+nNR5PIeeTX%+!+y4WrNhi<N1)S!9OH`eM zI@6F4p5ndA&KL9!ZaEW_pk6E`Zy2uIp0(6ZZ{i6T$fpU!ja49?WAeT)RLA${4p_+~ yG35iPlTbx|7<E;KKKpaU40>-mbEL34RAMxc&*+UL^jaKNW@Ubjm+cLwZ2tkO2*1Dp literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..785ccf60d90d797dc3b27386b8ab7ea33d20bbda GIT binary patch literal 4450 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61ffe2cb2a97102f20ffc5ba5f3d724039e18910 GIT binary patch literal 4920 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/_in_process.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..baa14d3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/_in_process.py @@ -0,0 +1,182 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +from glob import glob +from importlib import import_module +import os +from os.path import join as pjoin +import re +import shutil +import sys + +# This is run as a script, not a module, so it can't do a relative import +import compat + +def _build_backend(): + """Find and load the build backend""" + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + obj = import_module(mod_path) + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + return _get_wheel_metadata_from_wheel(backend, metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + +def _get_wheel_metadata_from_wheel(backend, metadata_directory, config_settings): + """Build a wheel and extract the metadata from it. + + Fallback for when the build backend does not define the 'get_wheel_metadata' + hook. + """ + from zipfile import ZipFile + whl_basename = backend.build_wheel(metadata_directory, config_settings) + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_sdist', + 'build_sdist', +} + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = compat.read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except GotUnsupportedOperation: + json_out['unsupported'] = True + + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + +if __name__ == '__main__': + main() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/check.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..c65d51c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/check.py @@ -0,0 +1,194 @@ +"""Check a project and backend by attempting to build using PEP 517 hooks. +""" +import argparse +import logging +import os +from os.path import isfile, join as pjoin +from pip._vendor.pytoml import TomlError, load as toml_load +import shutil +from subprocess import CalledProcessError +import sys +import tarfile +from tempfile import mkdtemp +import zipfile + +from .colorlog import enable_colourful_output +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + +def check_build_sdist(hooks): + with BuildEnvironment() as env: + try: + env.pip_install(hooks.build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_sdist({}) + log.info('Got build requires: %s', reqs) + except: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build sdist in %s', td) + try: + try: + filename = hooks.build_sdist(td, {}) + log.info('build_sdist returned %r', filename) + except: + log.info('Failure in build_sdist', exc_info=True) + return False + + if not filename.endswith('.tar.gz'): + log.error("Filename %s doesn't have .tar.gz extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if tarfile.is_tarfile(path): + log.info("Output file is a tar file") + else: + log.error("Output file is not a tar file") + return False + + finally: + shutil.rmtree(td) + + return True + +def check_build_wheel(hooks): + with BuildEnvironment() as env: + try: + env.pip_install(hooks.build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_wheel({}) + log.info('Got build requires: %s', reqs) + except: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build wheel in %s', td) + try: + try: + filename = hooks.build_wheel(td, {}) + log.info('build_wheel returned %r', filename) + except: + log.info('Failure in build_wheel', exc_info=True) + return False + + if not filename.endswith('.whl'): + log.error("Filename %s doesn't have .whl extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if zipfile.is_zipfile(path): + log.info("Output file is a zip file") + else: + log.error("Output file is not a zip file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check(source_dir): + pyproject = pjoin(source_dir, 'pyproject.toml') + if isfile(pyproject): + log.info('Found pyproject.toml') + else: + log.error('Missing pyproject.toml') + return False + + try: + with open(pyproject) as f: + pyproject_data = toml_load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + log.info('Loaded pyproject.toml') + except (TomlError, KeyError): + log.error("Invalid pyproject.toml", exc_info=True) + return False + + hooks = Pep517HookCaller(source_dir, backend) + + sdist_ok = check_build_sdist(hooks) + wheel_ok = check_build_wheel(hooks) + + if not sdist_ok: + log.warning('Sdist checks failed; scroll up to see') + if not wheel_ok: + log.warning('Wheel checks failed') + + return sdist_ok + + +def main(argv=None): + ap = argparse.ArgumentParser() + ap.add_argument('source_dir', + help="A directory containing pyproject.toml") + args = ap.parse_args(argv) + + enable_colourful_output() + + ok = check(args.source_dir) + + if ok: + print(ansi('Checks passed', 'green')) + else: + print(ansi('Checks failed', 'red')) + sys.exit(1) + +ansi_codes = { + 'reset': '\x1b[0m', + 'bold': '\x1b[1m', + 'red': '\x1b[31m', + 'green': '\x1b[32m', +} +def ansi(s, attr): + if os.name != 'nt' and sys.stdout.isatty(): + return ansi_codes[attr] + str(s) + ansi_codes['reset'] + else: + return str(s) + +if __name__ == '__main__': + main() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/colorlog.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..26cf748 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/colorlog.py @@ -0,0 +1,110 @@ +"""Nicer log formatting with colours. + +Code copied from Tornado, Apache licensed. +""" +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging +import sys + +try: + import curses +except ImportError: + curses = None + +def _stderr_supports_color(): + color = False + if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + +class LogFormatter(logging.Formatter): + """Log formatter with colour support + """ + DEFAULT_COLORS = { + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red + logging.CRITICAL: 1, + } + + def __init__(self, color=True, datefmt=None): + r""" + :arg bool color: Enables color support. + :arg string fmt: Log message format. + It will be applied to the attributes dict of log records. The + text between ``%(color)s`` and ``%(end_color)s`` will be colored + depending on the level if color support is on. + :arg dict colors: color mappings from logging level to terminal color + code + :arg string datefmt: Datetime format. + Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. + .. versionchanged:: 3.2 + Added ``fmt`` and ``datefmt`` arguments. + """ + logging.Formatter.__init__(self, datefmt=datefmt) + self._colors = {} + if color and _stderr_supports_color(): + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or + curses.tigetstr("setf") or "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = str(fg_color, "ascii") + + for levelno, code in self.DEFAULT_COLORS.items(): + self._colors[levelno] = str(curses.tparm(fg_color, code), "ascii") + self._normal = str(curses.tigetstr("sgr0"), "ascii") + + scr = curses.initscr() + self.termwidth = scr.getmaxyx()[1] + curses.endwin() + else: + self._normal = '' + # Default width is usually 80, but too wide is worse than too narrow + self.termwidth = 70 + + def formatMessage(self, record): + l = len(record.message) + right_text = '{initial}-{name}'.format(initial=record.levelname[0], + name=record.name) + if l + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (l + len(right_text))) + else: + space = ' ' + + if record.levelno in self._colors: + start_color = self._colors[record.levelno] + end_color = self._normal + else: + start_color = end_color = '' + + return record.message + space + start_color + right_text + end_color + +def enable_colourful_output(level=logging.INFO): + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + logging.root.addHandler(handler) + logging.root.setLevel(level) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/compat.py @@ -0,0 +1,23 @@ +"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" +import json +import sys + +if sys.version_info[0] >= 3: + # Python 3 + def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + def read_json(path): + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + +else: + # Python 2 + def write_json(obj, path, **kwargs): + with open(path, 'wb') as f: + json.dump(obj, f, encoding='utf-8', **kwargs) + + def read_json(path): + with open(path, 'rb') as f: + return json.load(f) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/envbuild.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..c264f46 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/envbuild.py @@ -0,0 +1,150 @@ +"""Build wheels/sdists by installing build deps to a temporary environment. +""" + +import os +import logging +from pip._vendor import pytoml +import shutil +from subprocess import check_call +import sys +from sysconfig import get_paths +from tempfile import mkdtemp + +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + +def _load_pyproject(source_dir): + with open(os.path.join(source_dir, 'pyproject.toml')) as f: + pyproject_data = pytoml.load(f) + buildsys = pyproject_data['build-system'] + return buildsys['requires'], buildsys['build-backend'] + + +class BuildEnvironment(object): + """Context manager to install build deps in a simple temporary environment + + Based on code I wrote for pip, which is MIT licensed. + """ + # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) + # + # Permission is hereby granted, free of charge, to any person obtaining + # a copy of this software and associated documentation files (the + # "Software"), to deal in the Software without restriction, including + # without limitation the rights to use, copy, modify, merge, publish, + # distribute, sublicense, and/or sell copies of the Software, and to + # permit persons to whom the Software is furnished to do so, subject to + # the following conditions: + # + # The above copyright notice and this permission notice shall be + # included in all copies or substantial portions of the Software. + # + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + path = None + + def __init__(self, cleanup=True): + self._cleanup = cleanup + + def __enter__(self): + self.path = mkdtemp(prefix='pep517-build-env-') + log.info('Temporary build environment: %s', self.path) + + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + + install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' + install_dirs = get_paths(install_scheme, vars={ + 'base': self.path, + 'platbase': self.path, + }) + + scripts = install_dirs['scripts'] + if self.save_path: + os.environ['PATH'] = scripts + os.pathsep + self.save_path + else: + os.environ['PATH'] = scripts + os.pathsep + os.defpath + + if install_dirs['purelib'] == install_dirs['platlib']: + lib_dirs = install_dirs['purelib'] + else: + lib_dirs = install_dirs['purelib'] + os.pathsep + \ + install_dirs['platlib'] + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + return self + + def pip_install(self, reqs): + """Install dependencies into this env by calling pip in a subprocess""" + if not reqs: + return + log.info('Calling pip to install %s', reqs) + check_call([sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', self.path] + list(reqs)) + + def __exit__(self, exc_type, exc_val, exc_tb): + if self._cleanup and (self.path is not None) and os.path.isdir(self.path): + shutil.rmtree(self.path) + + if self.save_path is None: + os.environ.pop('PATH', None) + else: + os.environ['PATH'] = self.save_path + + if self.save_pythonpath is None: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = self.save_pythonpath + +def build_wheel(source_dir, wheel_dir, config_settings=None): + """Build a wheel from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str wheel_dir: Target directory to create wheel in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_wheel(config_settings) + env.pip_install(reqs) + return hooks.build_wheel(wheel_dir, config_settings) + + +def build_sdist(source_dir, sdist_dir, config_settings=None): + """Build an sdist from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str sdist_dir: Target directory to place sdist in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_sdist(config_settings) + env.pip_install(reqs) + return hooks.build_sdist(sdist_dir, config_settings) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/wrappers.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..28260f3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pip/_vendor/pep517/wrappers.py @@ -0,0 +1,134 @@ +from contextlib import contextmanager +import os +from os.path import dirname, abspath, join as pjoin +import shutil +from subprocess import check_call +import sys +from tempfile import mkdtemp + +from . import compat + +_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') + +@contextmanager +def tempdir(): + td = mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + +class Pep517HookCaller(object): + """A wrapper around a source directory to be built with a PEP 517 backend. + + source_dir : The path to the source directory, containing pyproject.toml. + backend : The build backend spec, as per PEP 517, from pyproject.toml. + """ + def __init__(self, source_dir, build_backend): + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + + def get_requires_for_build_wheel(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["wheel >= 0.25", "setuptools"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel(self, metadata_directory, config_settings=None): + """Prepare a *.dist-info folder with metadata for this project. + + Returns the name of the newly created folder. + + If the build backend defines a hook with this name, it will be called + in a subprocess. If not, the backend will be asked to build a wheel, + and the dist-info extracted from that. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + }) + + def build_wheel(self, wheel_directory, config_settings=None, metadata_directory=None): + """Build a wheel from this project. + + Returns the name of the newly created file. + + In general, this will call the 'build_wheel' hook in the backend. + However, if that was previously called by + 'prepare_metadata_for_build_wheel', and the same metadata_directory is + used, the previously built wheel will be copied to wheel_directory. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["setuptools >= 26"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + Returns the name of the newly created file. + + This calls the 'build_sdist' backend hook in a subprocess. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + + def _call_hook(self, hook_name, kwargs): + env = os.environ.copy() + + # On Python 2, pytoml returns Unicode values (which is correct) but the + # environment passed to check_call needs to contain string values. We + # convert here by encoding using ASCII (the backend can only contain + # letters, digits and _, . and : characters, and will be used as a + # Python identifier, so non-ASCII content is wrong on Python 2 in + # any case). + if sys.version_info[0] == 2: + build_backend = self.build_backend.encode('ASCII') + else: + build_backend = self.build_backend + + env['PEP517_BUILD_BACKEND'] = build_backend + with tempdir() as td: + compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), + indent=2) + + # Run the hook in a subprocess + check_call([sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, env=env) + + data = compat.read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation + return data['return_val'] + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/DESCRIPTION.rst b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..e118723 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/METADATA b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/METADATA new file mode 100644 index 0000000..7a50487 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/METADATA @@ -0,0 +1,13 @@ +Metadata-Version: 2.0 +Name: pkg_resources +Version: 0.0.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Platform: UNKNOWN + +UNKNOWN + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/RECORD b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/RECORD new file mode 100644 index 0000000..daffabb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/RECORD @@ -0,0 +1,36 @@ +pkg_resources-0.0.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +pkg_resources-0.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pkg_resources-0.0.0.dist-info/METADATA,sha256=FOYDX6cmnDUkWo-yhqWQYtjKIMZR2IW2G1GFZhA6gUQ,177 +pkg_resources-0.0.0.dist-info/RECORD,, +pkg_resources-0.0.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +pkg_resources-0.0.0.dist-info/metadata.json,sha256=8ZVRFU96pY_wnWouockCkvXw981Y0iDB5nQFFGq8ZiY,221 +pkg_resources/__init__.py,sha256=qasrGUKwGQ8dGJP5SOEhLJoWRizj5HinbD2bXfrOH28,103308 +pkg_resources/__pycache__/__init__.cpython-35.pyc,, +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/__pycache__/__init__.cpython-35.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-35.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-35.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-35.pyc,, +pkg_resources/_vendor/appdirs.py,sha256=tgGaL0m4Jo2VeuGfoOOifLv7a7oUEJu2n1vRkqoPw-0,22374 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-35.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-35.pyc,, +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/_vendor/pyparsing.py,sha256=PifeLY3-WhIcBVzLtv0U4T_pwDtPruBhBCkg5vLqa28,229867 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/extern/__init__.py,sha256=JUtlHHvlxHSNuB4pWqNjcx7n6kG-fwXg7qmJ2zNJlIY,2487 +pkg_resources/extern/__pycache__/__init__.cpython-35.pyc,, diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/WHEEL b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/metadata.json b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/metadata.json new file mode 100644 index 0000000..f7d360a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources-0.0.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"extensions": {"python.details": {"document_names": {"description": "DESCRIPTION.rst"}}}, "generator": "bdist_wheel (0.29.0)", "metadata_version": "2.0", "name": "pkg_resources", "summary": "UNKNOWN", "version": "0.0.0"} \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__init__.py new file mode 100644 index 0000000..4c9868c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__init__.py @@ -0,0 +1,3053 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import tempfile +import textwrap +import itertools +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +from pkg_resources.extern import six +from pkg_resources.extern.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from pkg_resources.extern import appdirs +from pkg_resources.extern import packaging +__import__('pkg_resources.extern.packaging.version') +__import__('pkg_resources.extern.packaging.specifiers') +__import__('pkg_resources.extern.packaging.requirements') +__import__('pkg_resources.extern.packaging.markers') + +if (3, 0) < sys.version_info < (3, 3): + raise RuntimeError("Python 3.3 or later is required") + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +class _SetuptoolsVersionMixin(object): + def __hash__(self): + return super(_SetuptoolsVersionMixin, self).__hash__() + + def __lt__(self, other): + if isinstance(other, tuple): + return tuple(self) < other + else: + return super(_SetuptoolsVersionMixin, self).__lt__(other) + + def __le__(self, other): + if isinstance(other, tuple): + return tuple(self) <= other + else: + return super(_SetuptoolsVersionMixin, self).__le__(other) + + def __eq__(self, other): + if isinstance(other, tuple): + return tuple(self) == other + else: + return super(_SetuptoolsVersionMixin, self).__eq__(other) + + def __ge__(self, other): + if isinstance(other, tuple): + return tuple(self) >= other + else: + return super(_SetuptoolsVersionMixin, self).__ge__(other) + + def __gt__(self, other): + if isinstance(other, tuple): + return tuple(self) > other + else: + return super(_SetuptoolsVersionMixin, self).__gt__(other) + + def __ne__(self, other): + if isinstance(other, tuple): + return tuple(self) != other + else: + return super(_SetuptoolsVersionMixin, self).__ne__(other) + + def __getitem__(self, key): + return tuple(self)[key] + + def __iter__(self): + component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) + replace = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + }.get + + def _parse_version_parts(s): + for part in component_re.split(s): + part = replace(part, part) + if not part or part == '.': + continue + if part[:1] in '0123456789': + # pad for numeric comparison + yield part.zfill(8) + else: + yield '*' + part + + # ensure that alpha/beta/candidate are before final + yield '*final' + + def old_parse_version(s): + parts = [] + for part in _parse_version_parts(s.lower()): + if part.startswith('*'): + # remove '-' before a prerelease tag + if part < '*final': + while parts and parts[-1] == '*final-': + parts.pop() + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == '00000000': + parts.pop() + parts.append(part) + return tuple(parts) + + # Warn for use of this function + warnings.warn( + "You have iterated over the result of " + "pkg_resources.parse_version. This is a legacy behavior which is " + "inconsistent with the new version class introduced in setuptools " + "8.0. In most cases, conversion to a tuple is unnecessary. For " + "comparison of versions, sort the Version instances directly. If " + "you have another use case requiring the tuple, please file a " + "bug with the setuptools project describing that need.", + RuntimeWarning, + stacklevel=1, + ) + + for part in old_parse_version(str(self)): + yield part + + +class SetuptoolsVersion(_SetuptoolsVersionMixin, packaging.version.Version): + pass + + +class SetuptoolsLegacyVersion(_SetuptoolsVersionMixin, + packaging.version.LegacyVersion): + pass + + +def parse_version(v): + try: + return SetuptoolsVersion(v) + except packaging.version.InvalidVersion: + return SetuptoolsLegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + try: + # Python 2.7 or >=3.2 + from sysconfig import get_platform + except ImportError: + from distutils.util import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]), + _macosx_arch(machine)) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet(object): + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + for dist in self: + entries = dist.get_entry_map(group) + if name is None: + for ep in entries.values(): + yield ep + elif name in entries: + yield entries[name] + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match(req, ws, installer) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins(self, plugin_env, full_env=None, installer=None, + fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (None,) + ) + return not req.marker or any(extra_evals) + + +class Environment(object): + """Searchable snapshot of distributions on a search path""" + + def __init__(self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.3'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + return (self.python is None or dist.py_version is None + or dist.py_version == self.python) \ + and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match(self, req, working_set, installer=None): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + dist = working_set.find(req) + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) to the Python egg + cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? You can + change the cache directory by setting the PYTHON_EGG_CACHE environment + variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ("%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError("No script named %r" % script_name) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_unpacked_egg(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_cls = getattr(importlib_machinery, 'SourceFileLoader', + type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + _isdir = _has = lambda self, path: False + _get = lambda self, path: '' + _listdir = lambda self, path: [] + module_path = None + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with ContextualZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ContextualZipFile(zipfile.ZipFile): + """ + Supplement ZipFile class to support context manager for Python 2.6 + """ + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + + def __new__(cls, *args, **kwargs): + """ + Construct a ZipFile or ContextualZipFile as appropriate + """ + if hasattr(zipfile.ZipFile, '__exit__'): + return zipfile.ZipFile(*args, **kwargs) + return super(ContextualZipFile, cls).__new__(cls) + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path)) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.6 and 3.2 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir('/'): + if _is_unpacked_egg(subitem): + subpath = os.path.join(path_item, subitem) + for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath): + yield dist + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if os.path.isdir(path_item) and os.access(path_item, os.R_OK): + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + else: + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(os.listdir(path_item)) + for entry in path_item_entries: + lower = entry.lower() + if lower.endswith('.egg-info') or lower.endswith('.dist-info'): + fullpath = os.path.join(path_item, entry) + if os.path.isdir(fullpath): + # egg-info directory, allow getting metadata + if len(os.listdir(fullpath)) == 0: + # Empty egg directory, skip. + continue + metadata = PathMetadata(path_item, fullpath) + else: + metadata = FileMetadata(fullpath) + yield Distribution.from_location( + path_item, entry, metadata, precedence=DEVELOP_DIST + ) + elif not only and _is_unpacked_egg(entry): + dists = find_distributions(os.path.join(path_item, entry)) + for dist in dists: + yield dist + elif not only and lower.endswith('.egg-link'): + with open(os.path.join(path_item, entry)) as entry_file: + entry_lines = entry_file.readlines() + for line in entry_lines: + if not line.strip(): + continue + path = os.path.join(path_item, line.rstrip()) + dists = find_distributions(path) + for item in dists: + yield item + break + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + loader = importer.find_module(packageName) + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + if not isinstance(orig_path, list): + # Is this behavior useful when module.__path__ is not a list? + return + + orig_path.sort(key=position_in_sys_path) + module.__path__[:] = [_normalize_cached(p) for p in orig_path] + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path, parent = sys.path, None + if '.' in packageName: + parent = '.'.join(packageName.split('.')[:-1]) + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(filename)) + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + path.lower().endswith('.egg') + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint(object): + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + DeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + is_version_line = lambda line: line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution(object): + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__(self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + dm = self.__dep_map = {None: []} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + if extra: + if ':' in extra: + extra, marker = extra.split(':', 1) + if invalid_marker(marker): + # XXX warn + reqs = [] + elif not evaluate_marker(marker): + reqs = [] + extra = safe_extra(extra) or None + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """Wrap an actual or potential sys.path entry w/metadata, .dist-info style""" + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, + } + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + line += next(lines) + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _get_mro(cls): + """Get an mro for a type or classic class""" + if not isinstance(cls, type): + + class cls(cls, object): + pass + + return cls.__mro__[1:] + return cls.__mro__ + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + for t in _get_mro(getattr(ob, '__class__', type(ob))): + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + mkdir(dirname, 0o755) + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener(lambda dist: dist.activate(replace=True), existing=False) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5393a48b8f77a17286a1eeef565814966ec56297 GIT binary patch literal 101907 zcmd44378zmb>|sX)i=7)xCjs=NEX2ZXo_f(A}NU?MS%oB2@=_W0Fa<sf~pIZ)j$E= zRgJ7}0$m~{+n_F6wk+TF*s^6=KF9XR_h@`jBOl{)Y|Z#8kFW9AGxChbv*Y=8z53Sn z{{AmABeSX-hxG04w*^#oR%T@6ix=;T_g+Non3x#b^vQbt!(U%;f8lbUcX7U-Z~Ijn zoQs^B<ydf0(Jd6*V$sbOT|vJ~ZlUC6OLmX*0XI94o)5a&!SsB{%?_pK!)|ssJs)wi zBkB35n;lKh$K32#dcMKUZb;9^-RyXJKH+93(({dOc4K-z>1HR>^G$AcQ+mGH&2CQ5 zx479Y>G@VSyDdGx!Oh-~o^N-v+tc$MZgz*A54eSmZt+Gpd!s9?hN^eE*`4lW^Hw)d zzsa2+bMaFJJ_&wq*3Gv!3+{Pc7<3D}+~O^6_7;!8A-8a=TfEK9-sTp|Zno?eZ+Ek| z`+LJe=;CfSyPKEYZSNnkOLw^0JKW-(ZuU;Mc$b^Ki{fDKZa}y(fbdxZ0Yu)Ny?lc` zy~oY&^)DEA3sY|K9yfcBTYQz9eHE{{DQ)t-?%X~%JMHSz?%aK@kgxjIqFP74PiIw6 zSiA0bv-kU|H`?z9-0TCcP=B?HCf((NKid?}Hixq<b{1{b%jb)(UUKIibOWXH&b7X} zsLNY*nV-#~D;DC973&YVXqz7T3M0bVhee9BuW@gR=)djmWvF$#tH0J==IZOXO7Goh zS8sInN9^kBxw_LuH`&#jT>bT~{(w98s5|$Vy9^n>f!jB`XqVmImAn18-F~BsZgJ7A zx;wkyH8?)uqT5_lwkuD%=yn(Fw(|ony2C|x+WA2j-Q}XY?fj67_PA)Toj>KGDHq*i z=WlY+t6X%ioxj;d`&=}w^MTpJZuTuMy3a-T+r78C=m8gj*#}(&GC;s<T=ZHOz0O6C zxajpRdelXax#$fpdfY{TyWd5C2xI^R9K4>l@-p6W*hSP#g-^Ta85hmC=!lDs3WL$x z)X3<Vi;lbKgo~ba(Q__3>7wUd^mZ4`y67D)dZ&v{x#(Rks<>#*MO7D_c2Uhmk&Egs zns?C|7oBxc!$s#@blyb^E?RU^(?u;8ExG7|i((hGU9{}ZJmqGe2JtHbMSb|Rt3PAC zHN({x1f8xv<LWbZ^$1rly6BQ!z2xdg?CMdjuBsU-JCl}u8&^AOnXVp5uO73$J8l#Q z!b+mF_Z8jFSsIIApuO*Qvo!fdH%qGvZkC3>=r+vK_?HAdmCb^M_oy3m{tkDB>fh_4 zFLN(b8q|Ebi@w5cfuqYVdfCq3<?6%k9Qb;lXn1xm{rP_TS#|Yyxml3-0byL#g3S-A zvvnT1dgNxo?1$9xx&n&7QWT(ba7`n=O4J|#!25?q7P{2{17EG4;RnadNbz%A`Wp3= zE>ZD0L*RL?eniBft8YpfW`V0;>!Od^)sMRRqLpoO_3K1SD*IGgw&m(AH@n2WuNNih z-cbk7iXAU-^&3QYy831VgZ}?UktA1UA%t%d#p!(6Mc*va(>XNpEuuS}LkZt10@OME z|81f~onNxX|1(jg8o$b$zFkzuJ&tN{$JJ*AWWA%Gg*QdtA(GVn^L7pR-px}V6P4=f zf~&vVpnlQSUv%eQa+jT+`c6@_?w?JcdXKBWM>l8R%j4hWqL16{kEdw*GOm8Ni#}mj zKjG?MW|e+9SHH(apR}u=boEhp?knuZWo~@0*hKGGOksH0fFE<`-skEsC-8rtm`tVW z1_1ECpJ%^ce5b4P0$W)B09SuNtf;GJ?0K$!(AAL$Kj@+#5+7WaSpVl@O$yCIUSlr$ zVaW_36AI(!kGSYZ?dMmy`iETI!}3)Ii*El57k$cZf7ot==MVdPKjxwzw^|`U%Ke0k ze$vW)jg{Nz&V9tyzs8Ezzg8+I`YHX0ziLEpK?6Z=$!!nsPp9xE@c&HuJNlQBD}o=Y z{IrYym7PO{KkK5OvvX+g=OqzU2C9QwenCP=ZG`Y%anWb&);GKQ*SWff?3+Dg{Pqn_ ze&->5cvQtbr2cmFuU+(6tLj^<Dv<Fl9vQzVfvMMjtDug4$wj|xuZNC*#YO+dZb8Jq z>Y`t>b7=V2C3yA7cch}?HzX>~eay{%XL{u~?c}@c_;L3n_|xt0rsIE0(w(O{Cfe^4 zF8a4F`faNc3j7@xea_B5N$GzljiAzp)6(C|)qn4z-?gj1>+0WYB=vn<{XG}`zFqzO z^eUwH2Re`b(A6Q%uB(5)Yd~rc-ygZ?KiFG-kSG7xMSo&X{)wyqkktp}{i!sLn)$<& z_%o>`!SNPT%|GJK{iv1uQ5XHWi~ggPgW&$cMgPgpKjosols3}y(A!_R=s(-}kGtr< zNNMRhg!g$D{k5I{q^oam=YGmX|J6nR&DCG$qQ7z2QI`wFLiFEV^tV>%r(K=@KO@$T z{)dbHH+7Um_P^Bi=zqHC?^H}zAhwb_KJ~w<*v4+`Xtj2}dZu2E>+RM`T&tI#IC^+& z-#VYMu_v-Zjdr<OUTB?Z)T#^R`Nl%MTx&I#tBqzoDqn0YpKUa`zvQdFx7>=e(qrwF z(@`U?*OpuHYI*r=J+8Orr_1FNXY1($*=vBMT)(tL;dXYhSzWBR$Cg{=v(*>ss-Y3{ z<nmb#G3DBI{#KV0K+1D-_sz}STfV2+TE3@z@hmr9sK<H=@Bx0zo=lzr&PE$p4z|h^ zFR!%g<yL#zO0<^hRN81Y+hyLoSZy|zRu-r%fHh`dl~30j%`-sKZUaE0Nm;#$c1(|r zU9pK^Gpe^6XM{bTxY&x%8y0~gUQ7_&UTrVe7gH3q?;V@2pE+ZwZ{J(4Hly-NQ~0Ka z>;_Fayj-qT>5PSTQm^&QLSwOE7^<$?i^irqjU`{1)uk>h*H+rgt;O=uLr2RG-v4UQ zRgLN~%?F3&_R7*yD_*w7&CQ*uFIS@Ka&_<2+}zk=efexFnjZT+gEBW&=uTEow_6J< z%k@fQQP0e9ZCp?IpY@pErFP@eRH-|(5-%(?PIpU-)urwbWVLK}2UnIGi*@b~E}n;U zx<heY$fkI6q0u~l;wfqvpo5xI#qMCEts;Z%rG>^a*N3Z1OI&DkI_l|>{^{JkbpA{w zrTF%A{Sq%~($QiC?oUG^ZTh-1b&YauNV75DpmgU|*C-m-FRVcJi}mJm`<m}xtj6c5 z^z$W9*tzZKDj02+ADn(roFu9fokDq5BNkHbQ{a3*-}ZJ6bp%Pl2E|3Q2~i<MIKR}L zpi>`u=>C({xG8j0$I5)370F&aTW_jY<GNk}<uuyumAa?KYB|A+zz9t@R;jfXmljq< z`XU{xPISXNrtQbf)IfKnQc<^6D&4V4Ww8~lEa-f^Qn|2FT}bW>S1M7fR;m1ei+9if zJAC1Z`<54%?ptas?Q1mK%hiR2eXp%Q^tx!d-ntK@?+g8?Us<o-SE)3bjpa&ZdTBM@ zLS@ehEr>ifK48Cl@Fq;_)Bau#dAxnVxp{EN|Dt<8_$;~P3dkI=D+B43K^G0#mBIAN zu!~0Q%20Y`RAz<h8BVWkaM8G38A-29xM-tYq41=OHko|K7}@NiEq1;^C67;S?e3@? zuP?7GEw@?=?dLqrKGV3=Xx2mq`slBkrf+*Ihh_d3+>2-ev~E$_;`mfyM!W?}*W-96 zWz<t=tL?LuiWsY1Uziv7R4TOv#9F1|d*((8#y4}21IEzm3Z3#5;F(S<tO@`6=x+e* z5q<#Jiv__3VDW7!kbqjyaQgUi(Jhx!xCe9<Rdzf|z#r_6HQGiT&04)X2uc>}@lDj~ z+cQ+DEI<fT#dsIjx`Qnd_*5ajMJ0^RtTknRR{6GvIJm-OVN<bl>y=xiD!;V$0QoiA z6W<C1pn*egGhmsd8S(AhUE7G=TxDo?-Ho8aFRc+sk}t6l^$XW(#2qwX@%kH~3cs{Q z41URtICIUOxKj<d{zj<6FRc*+UwR`luDAj@-9-adzlcVB$vlBc`X!Q6^O`+zHw}32 z^*2Hl_Vk2=)d4-fk%I)48Pdq0ohCdB#;B=uDV?vcX38s;Wa)0GRIqq3xfUyx_o*Ti zgN4o=SC%fJe30c5mt%az9PRJq03_#3HR%LdUUVNaHHCSPYSPg(QiK-bd_-f0#-KY_ zavv(X4;0)7it<%zl)FLN=0h&kKjSW%(3O{v#{=#hm27m&Ly0cBj8FB_Z6>RS6GR}1 z51!iKUMjj5i|)C?g%7)vCYU$Rbhht(XY{J_i{*Dz_jOL`<ek$mmiJ9{OG|ORTc~x1 z`TIhne(?*1eH{$GW_4j-w;0#DrKtYG7Yh4B+l8+Iz7MMHmpEKna37@AX<r;X^$vmi zLDLsf4n_UsWW2pef6(9O(JPO-3;rjAq@wxHz|8p}7oS!kA#*@_g*I#w^0>Cc&QC@| zT(m|F&vXmZpO;?kj@|#js~>#m;n%$Ob&q_0L>CJ8bcXJ+RzM7*mF{2%D|P|9w9xJj zXnexyxQwM%6GISVr8^wgmlmqEdZvfE+bWc7*DHy&rC-bKucJEJ!l$qu)wH!xDr_%q zE>4s>k6)RHptu+V=rJ4Wv>%^dui}7X(U-n56WX8PfEodbm%dh*hU7u^Wh4B9r(R4t z+mjy{i$AEo2dC)jxauz5Dcr?#hWa756SNBb_S;(>g$r+RCzE0yuwug$8?<8fJ1rKu zlj<6DKNOB<{sI9EsFG{^IzBZr6F&r~Dc<7;^kdj}!oKdv{mJL^|HLPLjGI$~-NA*{ z#d_Qw!<GcGGFYL<79$SE3iW2>xw#a-hSJ?ZLw@{PJz0of&!1dJZEh_@y(s-I3beOz zaD}15&cbAIoa4qK-@@iX=h5r$sWmlMzX_UqduzpydeyNu#%)0)HVVTEURhW!x8}<| zRxpE_94SpR%*L#jWnW&XpQ+YX8L%>pZeY+~Jlm+9)h*0NhPe%fo6Ti!_-hE;tX~Y~ zzZrrW-Nsn)H5=$M>`o2Q^6RGWpDrJ6mKR%XjXv9TMyOPo4jvfcR?B9h>1`{`X1!K# zx2y5$bonXZ5O-ALMw<~2jY%G&hITsMe9jxXyq^xl-ed4={)7c8I6PloO>tCZ43C{> z!+1fF445=XQG*PEd&^jgx@SI&YWehvAHi6OT$7gK);YWo8m8Cc#%W&%<KSk!9!(o1 z)y^;ASy(UvoEkxh!P;sHzLD<mbBB&SdF1$^ZV9R09l7X-T}T9-bvGVcX=;F*jK&xY zFUM0QGgad!p(G<dqdKk{1-?#KWi)&3g1PP)9X@q!nYgZSLvaWS)W6Bn4I8&i4i!qn zLxthe&Z`>fzM84=STZ0M9mhB5AUi)U>#$pgJ9LnF6U#h^rC#H`Iy|jI7`UazsTtQA zSe)Y9)=+G`u%)zRDEl{FGDE$_t?-eE-OtyAUVcP|EI*DI-MnV#!!V{F@BmB3wed4l z`U|R9N@cuYzrUzA@5tW#v@uaak=ObD8D9I@@cv?~-$4kg)f@O8PytDuRdjEv<&K|h z?sfx=kr0kZL<MkP?eK+59-3r6?!&j~sK}ZYOKEh66GrN8JluSty3mLcnC<Nh?+Pzu z{pP7^qDON48^JTe!J&9IqJH9IoCmOlO6ljf@@?<q0L+)oJn@3MfNh7eU<h~4WVgWe z^4ydvBhbO_@R^0yX&hDfb(ZiZ)v=mjaQsFuAi}x>QKJU$%*U-o46HT;FwFJk)unp3 zc>ZEP@Ea>p9Vr#peHEV*Sc1<LHWlJo{)P_MRecTNqF+4SFQxEH{k=wGQLl{-p4#i) ziDkim^pRN=FP7Ynot&bbcA}7I7iW)M*oD?oFBE6GLzT9?UC`!nYLB1gfR_qWu#Hb- z&|26noaq+M$8Xd9jAG4l#67~(9uJk@r$AdKptQ><nx$Mor{=mr4H@KXjd=?vz8lnx z*P9AQYdVazd;6O~_oxLlg%jTzT1GskaAA8-Q;><FDevS3)}E<>Sgak(6%bc+xI$BS zI%&$EQYxV*HRR3$CRnZ^Vgr4xA!;$$^!A6hxVr<j*3v3;TY{MTaW>{LE`s?h9!-qx z7#ZSfB@X)NuZY%OAn``4{R;{@GZfID-sXcm@hsNR6mfilvh?L1{&b72)4t(-ody8H zlK}W@$|aOHR*28?EAY&<+Gt&i42^iGzlr0%iLKMpN`I?&s4=b(L%mmM<Yw;pM$*Um zrg_vSZHnbPShrEUQjPMj{5wjeuLNxwJEe_!lM09&fnHr^4Ujvj8lP$Rw`SzAh3ewz zsQUQ-p{Mw|c!5JrXZomZK`6eL9|>7=Vyp>q&>(N{%hDfp@w*dQBa;-%^WARsK^q0x zc!t5uWgvrr2W=3*!@>;XByLz@$96=($>tV>?TCrlj>N19S7Ym8i=7<9<cZ}i#f-s* zU!KQXzo$)b;8J68Wzicl%Z<|nM-t&n3_y<72-^ym_CkAF$7xB2^zpq@iO+vw6>~-I zayi`V<wabXsxzs`s=+#Xrdlf>IbMFAG8iKlTPq6@23_zBE0}N(QH*;CqF~L*r46L1 z(RO;Z51MlM$rWm`s&M&MW&X(>TsvE@otMdDrWq}2;9Fmn@kagUo2`oi(dtUTli}6} zTD^=gF5eSl?orb{3ix0KE?|jcpDF$%!_~)&e2Bs7Blfe<s5O=i8|LjUS7nJ})vfcY zd&?KW6j2Kw?&yK6wh|LHSk6BtydF88^a+Ne^&@s_)KHwK+^X?RyG*Cz245|ETQcpZ zeup?wmBw=0U=Bqv<7g_Dt5rO|(yUp%?Xzh&S*Jvp&(&J36-N}tgta=*8c{XA*l2df z7pt{a`_jI<+We32hxR`&ZivOrQ={E2BA(ML4UIz*3hZvNN1pRm@^J%#$Vqj%#xRE{ zQg<Yj95~l%H1WXuci4EdJ9s8;tt@rNo~tgb)DOjRD@OJW=#g$=v7d3b>-9-2sGfoF z1%UHo)rnEYsyAaYJXn}04i@4LcQoX+zU+=c4iy>HOUpha1Z}?1Aj;I;q>9BS7~3#O ztJ&S8_)~>0j8`j5fW6$EP#J$g@uH2{&qi~;)!l5yZ0><}cQOqXU=^rudN0(gi`~tk zga!l_W!e-jEdY;#OIbDbOI&JqH-;iU`m{MUK2$*)vc{HCP>)wukfGfj)hMb|A%_<% zq*zhK^(M{Ug7YBiX?MH3RZ<sHiS<CM$#|3T>SigU=E_nQ?&xkdl-1{}3<E2*Dooqm zaH#o0BW^Vnbn1?s^bi~efXQP?wD*~66XuJ%;|KG&-f%1nR&~b?3Fk)*<@Ox0Jm4_W z=uReNcA(Xqhf|lk+wv97w3eT0tu&+V__IxMWAl)j(VetE)*4^S7H?|iLuB32c6GjP z0i*7?ohA&Q5K2ny+ftcCFe#<$c6Y;SqYg_D9jwzk77GON_Qp1&HPvhw?QU3ZRYFg1 zY<SZceo*+WJ6XrLSdj&qT-byRUBRaG<4xk%-Hkp%+vxCi^~=biH@&HH@bK{y-3?D3 zo_XTf+mj#1k34(qz#;!*;=r2^9eC@JXHWQ_;|C8tcj)OONBytOho7l0R~1Y>n)1Tt z!)b4YOXE*LooT`D_)%URer-5(=1ll8acFUAc{Mz@v96z$z-Hq!D+>$ZuAU4(CJ%a2 z3KuraHkQH<Sm2C^HU@i5G3-s@LZEqKNX>{iOm|zj=VQnfv)XT*Z(M?av*M}vk4q8~ zBa#h^WE6C_Kk-7fu~0>i=4q=PtOH7$g|MH$?cE&u28+u2#Wz)QFB5jdFN(W-YB2sL z3U;QSIE^HLvC5~-34pAR>hb~Ao47{A)t=bPM8;ZiyC&;KAN>`S2l%#S{CV?KBOL5! zOjT@We1~SM4)`$BR!VgT(CKlEk4(;_UHs`6s0`&*q*6J^D-r{%bEEn{$8|*0d?7|n z{R3WwePfMob2XcFYJ+e!`U%x6%WS+bRO~^bTC|^U`*{xQA`$e}aR-}!8En!<(xr99 z9L>oU%qWX{3f<;(#>K32qL~{&{doM%RNwhQQ*=)#H6gB7qt!IFi#kkIJG$6}N;~sH zNkr74yHF@m-^YVeRm``+0JlRKOJk6lPvXX0%9D_#I_P$&)nLjAKd+5D558ML(CG+@ zf605u7{x3sP#wyt>~B(s-BVq-qoN*Kk;*n&krnG{1?!XOL2)J)EkO-eAqs}R?d4;E zAc~!BeNxvTyY3f0aLpH%XvA~5_igQeANSXPov1v|3zwby>cksSB81GSS3;W94cW?= z6hq!KeFbhH(L*LMIShdpwyy<6MMAhnG#s#fr=Tfl$P7%!JzV@Ip1*@JJYxq&LLWBp zI?LAevd*yt(>|=6HY>N;YVI?^c`tX&<j-Y7%;Wi7knxBCjz#QKDO3+CaTz5;ZbLuF z;Z;Nl)a~7!S1ik@Y?n%G$bn?f<k;K$2}J7^I7aV0C4`x?W^kx5fXkz^s~?7Z@tLWy zb;ZcP)|*F`V&y(9ug0(NGyaSYzodgaLOCchAtUyFvmhAfWPE6-I8@v+uw`JpRO5H} zsH67tZ9mLmt+1*4z*EufU~)#C;8R}aAYKUEP7TGs%(I>Mc}Y_4YohNGOzZj*gQ%*k z@HkSA7&aM-OJ;dpUTcj!IJHU=EL)O}e?G;#m0n+rBtl|)8EOf#z+?dQ^V0f!vW^^R z(w3{rf%sP_u@rcr*tzS9WHX(D4Foe&BkT6Ax+zu{$G@tBDqpudh2yh&>kud714G4$ zqTzl0-jp+7ZEvD~uTynMnWWm|GU{cG0wGyO%7m!p1SGIA{uW-?x%-JshTHHu9X2qE zZCirUyzJ1<@e}m<p3q4z?YT-}(++TSipn+J8@Dx#xc&|Xhu7%f&rsssxemTDudPyJ zT77%nM0IUhKbo{JZofD8=3B4yX3=$@Ar!>zEr9QZY?~A&y!3RtJZau_C$D{JrZXwF zBhbcZ!3IB_;=N_$;IHv)j9ceQhS5X-Q%Hw0k_4CHC<3mt`|9B8k@Zn_HGSoo<Ff+n z7q1AI$wI>JK|$So1yD>&QO-X4tM386=Fm-Wl&H#r)p`Y`NQxZIsZ>6kd+DxqUz!x0 zncA?f0LXa%Gl1cH;Ma9#;{7*tW<otXm<=h0ThY4};Fb+JRFZh#GSnyF)xQ0FubPP% ze=8+AkLSTJN3D9hxo6o2I>|uXZ9}#4e7%b9t?y3cb@@!=1$<K)K9F3vZUZyG?aZLp z`@S~C9Kjz+U5nWT3qs^v;%j}QHexYAnDo$NqUot(b&}_gCF7s+9Qx6G7L|F%5sV4v ze1h<K(wUPx-ib7q8~n_9M_|t-^QXZZ8XPIX(g#^lPSuctJ2&UkCK&)El~u@XHqE6B z;B`QeMN$r~CmAV3JbiL<wS14S?Vhst>H3Pig~Mab^4#2-k>}i;ImFD`Nno+pE2(#D z7*{5!Xw(&^*^p~@cT<X!6k9nGv;O%s2>)2xKW;d1t$IZEg!RfdaN@fJ8;&><Q830` z$`P<J$<hPLTUjQ5!+s(x%-CMttSlD1yj<Riv-o6lD)@Js7DgLQo+$K`Gq>+DHYD}f zIP!8yA)w_AZh2f5Bmi)Ww;Z1u=)5s;3WL5i$V*U1EFGea2#+fTR$ZOQHklnZ98iL6 z+QBnZ6FwPGjgG&PLw7)9Zd}^@eya|#E)M(ZaPPgfzUtj7)Z%ljNwXcsJ5*g>j=K{! zVz1z0Si%a5f0Jj){@mc7J`x|RU+50`A2QCB^4;G>xW?W0tBVxLb;ZfT9r*V)7bXg0 zg)RIGT{gg7b(?h=X10*qepwxdQn+mXcXfkDtDN*rS$V>&^`!!Z7O3DleMy%va#v^b z(|4oYB@%}*NU%z2JWZYO)9U3tBdYxz15fko(?tbf@FTBbKl19j&i(ftx7_;so^G6u zNkh2rKr5~vug5Pm$Sp|jCAQ@>YOB56MQ2u{qjtLSsJYXZlLF?U#hg|UgD$Do<Wwb2 zWZ6IXhlUc5;V}8N)*U!wsgb1j_>Xub-mim%4za-@@5PIc@RK|gd)<Wn@peAMl1VsY zo)t>|q<ThP0L2J5k$*BopG@*^yf9YWUWipDbP;8<;O8!WfE!Qa92<0lbs9JW?@;$l zclfAMXO12qVP>h;owQ$-XR0;LbZDPNV=3-~EKt*#1d?Pm1@W8tnyYc`>@NjAFT{T> zu=v_Xlq1b-l=EAhtZqvnTOco#NDqzkp>U!*1i@b??)9KE%R4EMMr)uns0@LiL^j9- z3i>r83r|p_i1B;%gj*gKQHuOVL^7O<kj`OfQjmKV^d*Z9zK1SFM9@?6W7PjZ9F!yo z=1Xonv3iA%CJew|&B8|#6JwoUyh7{<&5o1U1V!r2+?Qn9*LrN#w$~ufKmUCBfDdgD zBe6h(!ZI4!AY;lHzjJdD1a`%6ljg?AiP7)_VCAzgg{H-`XNksm&GmGnxpK+OVS3u) zO@7Fex-LFO55<cdI_h>sD?YCt{6eAJEmS&_$+f$p>ANBYG0Z02h=X^v&3JXbaVAy; z-3^CrdWaWY8+(B^5ob&lKdzUFh~q!eQ-doKrj`uTEh!^OgcM)ofKgz8UD5^dQ2cov z`dFsLwO<t-iu&D9skjY6b^})BZ3wl|!mh$Cu+Kz^(1l8NZcG}Zw8p7-PTQY-d#CT2 z>fGi7Hv95-@&#(LEA$!WEA$v~Kh3MXNIE~_+IN~TB!KD9x#iOq_lhZxd%@{d4P*)t z#&0ep7fsPADWT-rzh?r}>~3iBCB*1}i$7=S^Du!WhH_oEU<ebk;UabFe9(xv=(fK! z<X$w_p19_x+>6Eu=LcQ;x9mExQLcZ^u8%sdb1q16_#Fq5{%Vak&I93=LUMP5UX;Al z&bb?JFX(w?`}-;k8p`QP4nD4&r(p-Jbo$n*@y;I|K=;;K5jkC`R<S~A7e#X+Ok2jg zTqek8w-fc7yZuJbU7ktdr<f@)jrnpN9}A(!lrv?q&CSh_$|){NUY6d(f+FCFGqAdl z_$bAzGsa(O%)-Y}Exg*#X-Vo@vvFw^j;ptmxZnw&;5c|!dm2uX@%nkuQ)l3T`==j_ zA52dldddd~2je9!#TPhqw|W9i6xDGPH1Yq`?H4#q4V$M&mTZLYJ#k`cs?`OUUU|B$ z7j!bFlY<tU?2bezHwBfuK1!MV>SwX<q<SUHw(sG@4c}QDC{0>k+R%Xh-cZ<GxRHMY zT)(w&Yhj>tkDUjG>9HebsKV1c5*QL7F~{=)6tGhaV73FoTO`I0E<c9smkL9*l@REb z*2^6PdI9n$7SP%MG*bbY%O{}|JO?H>D-ynQCi_G&#CXedK458qi@CD@VZGwVAT-p? z;F>a{Y*fiR^YS=#N9QX^ep5V85pTW$7IJEKR4=wybvNW{?-rZb4JP0Eq?VrBfk5%e zK*cSXUiw$l%k|OU5?_-s@8SfM@r=)wpy4F@C#hIoaD)P|D0d&rjAvAB@+>A)(Y0r# zCqcasTGXNzoG>Qp>`(1prVaW?dk-@G2*WtCTE@mqr^4AxG9$&#zC$+A6T{dm!F%)N zjJ*!#x(BD$t+Xo^aS$N1DlD$lj=w>dl(*Zi$Ff!9uh)gq6O5}&xnQNdqRV|aeGk{} z6i#J+IdJNYCLL?Sr9S!_@G2wA<3@A{CQOup6~aE9g9$$7)O~Yh3qzMJZmsd_oCVqa zSjy;Z&V~Wi2AQZiHHcqCP{m4l!4v$7&c&>;I=CNx6}nIGo1!V!><`!US6`zASyg>7 z1H1r!L$FAYTIkW$1X@Dt)@=#MLC(z+IZO&tB!%?LsGsv!_~Rk%L$dBa1T-m-Up!(T z%fXpNrjsFT9@1BN)EmI5lup6?a=^GILRILI9IX5dA0c!<-}OReh@6-4P%;qV|A3vF zPQ{MY^_+uKYYo|iKwXEeY$~A6@p^ji<`46Z9<CN=TTc#f0w0R^9zBT1#8g=lLL~{Q zhx-&3Ad+fDlCftJWPW3sn6(~Bb;lW{RPdHtJo=471uu1-Ti3*>r}G7`3Gbd0DCJ%_ z7y>8L&oNo6i3GShY)W@XVSDmwu;mM06SmL2U6}({gHGcx@vx#orx&Wt^LB<x*YLe; zDF@zqAO`d_<3!o>^3D)vM&I*;MEhl*6(R#dqKjz<QCXR-<vPPAtHaOf_O&UR#K)qU zb8~mhp^tob&oi-^9P|K4?JUua8pC?CJzC81CQ>?mRWw=xQHn;NFmWg#^Uk#$okylG zeod4<e%M3X*W*=aG+74Vjpg#*g$5q8xw&M%{j??0Xg>MWRl(mFK(`0p8bB|v1--ZE zHNk%4(@96C&lyo@dW7*&06q`8XoDNqhI><5spbCg$V`BI_f;TI>hF>5>q&$+9J*Am zG37qT@!qaTp;yk<LIbK(r&xv(y<zz=I6xAN7vq0~+q<KoNWaFB74o(K_pY^YXX#xt zQ=|PZ+5rHM2Xz?IVOWO|9aL@ZRi;7Ay&+-vxZWp6;CNxY#6P^weST*Oxcz+F@8Ym- zC<?hOA&XEpxvX;=<S@$DIYQZ@PC7>@+x$44bJ1qT=^UxO5!pK#{|GPXJop5I2}{KV z;lzOxCnu7O=wln|Z>717LC&?W*@scEsBHM5ETymp1gkS>a5I-mO>c|_u~VL7fePhy z&G~dlQbK#(xk=g=YS9p_WcuWZE`b&=iLK6DKd1}3H;Dg3i8OQS`9K7F);K*ay>-nK z*KB<wv|he8CI8qIoqZ-Ia@OSkb0~<%M0^``=rvlpTYDOfz$R1hRA};D*J!dYf6WFj zh6a0MmLaSuZD|aRQuPxB(>C)l;8VPr1QVnpzUY4cA{q@Kr@xp+Q~sJV_TGNWC2e(1 zaHVa{OqKQe$V`>A=$QcLt!q0+rb=4yngI6duJkc1lpy}EPj{^YGE*k;PzOlYh6@Pv zCY)%x?V7L#g_S<{r7EoTfPFu}vYcjO0q$Ol*7T)8p<N-VWLyk3p~FTU6iYKq#Ck)H z^D?n75&NuOt$~>Wj^l&&uV3&Fa(h2t+)Gy${D}OQNh|PqY$o*)=a)ksTR!!G^I)7K z`-5@LMO&dmdI05skHIg}K_!$4i*%qXwrcH16{9@GZm^XKci0M#EHt&zE^>XlOBQ(K zB2}5wLWOU(WgWT5WaL}YMI5Q0TerE06&!ivmfQ-CyzY*41xFm_ccm*hQeK17J@H4u zPUqkgFd4~frtKw7lvm6`O8F53Ql?o(+xWGQ_M&R4<u+>uF{29Ww7onv6XaQmI`usu z%)f)f8FMvMY$6q^yi(ANDxDP5TR3JcB!`<5$F29w<D$QGv#uXJwbeX2@CMFD3-J^# z>}N)~AM3pF0MZx3CP}BZ1Rk@T1(sT4t2Jo=OZ2h4H}XlWZ%ErRHG`vTIJw;&)5&T@ z^U1nHr|qOW%A!yUr{(+hPUk<RN!?K;Y+K<ZAuHYljdcg@QjTa%M`}8zEj&XUD@lXL zpKSjK$BY&y3Z1Q4E;g}TUpnx&u&HsnVN`B)kayXF82w=oJXj~2+leyxFv!D-GJrxq z3y^Rp=L(8?B%W;EMoA`O6EHbzB|$OHFuUs?(X&&f&I4o8CHfpC0Z(pBDWJuw@_qA& z_dZFLOCkYU%qMXjvQEs@kQS0r3a{3T5ug7pjq#4JZ|1CfV={9={g*yxsaFIfOEo3} z7B4bYNDuZY<cZ`#57L(l&D*HZ4UXcp$AMoQE%}J#mSX3|JgWUn3IAB2;2wwkH&PAw zhKLag3I_4hJIlRq5g$)U{&hO!GOot~quK#awT4U~+&tEW3lA~FeP2S~2T$#G@}?V2 zL)qttHFXZ;D;{mp$-;$anQ6y`p)^=!Ou{0ck8xGw{I`XEc~Ubz%GG>l`0-;E12c23 z$$2@A8|`AO5ociNtlyLy_RrK6Ovxa{7zggx>Q@PJ#MJ>Et?Oby33iS9>uiMcD| zoAr~d<_qoapae+UyMAt1+iCGmu6<+Zs$uMRT)z{A&81Cv*fy88vl_<Qu3AGHq1Q_4 zZ@vfkwoh=N*9cd7Kb*P`=Flbc2m3B8T)Ic7<p;uq`v*_$Oht`#oo>*xn)LV}0!NGF z4OIUau%C#8Y?CaSxG8&nZf-h}BJ%w!ATL8r6NT2uQ9^5><L2hp&hXf4Qsmz938D-P zc;yse&X%nNr^3AzhMJf$M4z#aguNJu#G^s@t$P0f*H+CJK!@T9z(BNj=^de>>cYk9 zDnk`p`@p}pw{c8s$MZdp^IM=L>Dr8O>TN2^Xld_>WNCrZ^;%U+=grNfQkO<)5xTq^ z%EFVHUV&gC+z#~BW&o+htp3n|9#l)htD!x0XJk`OCRh13h59TC)AP*qRJeKKDY@%6 zi;%}i2Te4FC;I)+Rjky7_*U+xvfrrt6<zI>OU5HVBoepW+p(==-a^*fGWe#09tm_z z@ytD|N%DC**0f`DEE8vwllBqOi27nqRA!_iY^<ZfZG5P31!Gao5e0UcMHZj8$*Z_R zcc}@l=+N5^iSeYb5aXX#g9N23c6Q{Nk}nflBd*lfxN<)yYg?0qYy33L$0P#bJBdT0 z4kly8tUk10Vz2t!!2OgMK~}d0M}9^a3W+Ig;<~)ZV?1~vHy}D}<N|$(a+zze*3>aX z35lx3Pc2AL<|pn2I*Bdy8~+c}3)`%QD0a7Bi*;r-8&xI&upWTYb@G@i;OARPUmBFK z<C81oW6_<w|GHpIAfqWPF6kros!kbm$qJVO#&d`ek%#177~nY{uRD-Ttnk7Hza-)& zW8^%}noQFC;&6sf!2+TIZ(!b|F8>at?Df*4%?e35>@!f#dXyRe4mW;2<FFeFH<EwU znaq);L}pDSsLv2zo!9ubBMz5Ni6Rf4de&y}6JHMM-2&n01sSDpa+e-Z)ZFJO+1f@Z zh(WCj^sqa50gVmOVo8y4#JN4WlY7Idm0H~j$$Ce!$=fvWV=f{hz4G*?A)r9TbA4lZ zy1`!(?Fy&&mRIGQmIzKGFBVWTmt<O<)lGqb{yfVB=jBB|6;ReQ@extqMTMSPO_E4> zljbmc-U`*6rc{90k_`=9Q!WM;nqx1n(fsR(X^}oQl~ESc=;JS=7rH|x`P;}{lR;Tb z>lN;L+q%d!s9v!Ye+4&xOPy~Ky5R}zhH+M+kR{RCl_P;Q6F&nz$Y2mX9N^o28;51H z7-SCkP%;9Dpp8Pw^eW^*JXE1%`@!YMB+mF@<uMR;dIOr0NUSuP{Koa7$%(tpY_oP2 zQ2ru<$?^XMyzxKiFt3B<{{asx8u>XQvdR=!ZJXaV{wEb$FHopw{#a-n<3xc@A3W~d zkV9eSxvfFU_8H(P{24F7H?~j)qc-Cxejhw_ED6O6NnWJy)p}c(UTa#wqN6*tgoe*k zNu>U3EShX)wP6>|0<Un>Yv8m^aFmolsq-_Qo$}=6QzjJsh*<AY>ExDjD{Z$Pp=U<e z38cNztS3<MmlS|es~qHhB_v&vwb$O0nN=E7lK<u>i%9aCT_t-^rE^@B(Y&PwXk{3U z7|qNu!H4|Y1rD{mX1&=R(2Gnh_tX5-6#7eb)+SEe5Gj2uDy1wX()remBN?AnDkq+* zshjlC$R^mxf6Nb1%j#BOUUJWR2}uU^L*QE1O+Oe)A^{(=LO!>Ga+Zk0U2j*DH>8LC zMdO>~I)j@5(&^q~5BoxlbdZv4J3u$`UOh)C9vXz1><@BP+W&_oV9y~=?IP@G>u^ws zA1nQaPI_-smF0J;tf!Kyaw24`C*~3TlIs&J%67X|Yd|N-)WF0V&L~4NH(1ClO%;?k zT6&qOp*FeN{Q2r{%w$bp(`@KD0{E#_mi7ISCJQg{pb2G5&SP%<GHH?M;_Nj&G{oG~ z)W%If4<Z<0O<*@~n<H_}EN7C766X6%a|CaAHnSH^#`nB3hazw0^A?FKMm))?R|;x` zs?zlQ^li2Zcb{pN#K=s&ut>9FAecO)M%C(XkO@1N;RuvB)Gh-_M*k{fg~S7c;oxT( zryb_8&I;m+W}U7p&Q>Op#(L8Myo;>2r!_ECN#5eH6hXpJ-BD(7F`uo{YI;R8lJ=oz z&fQ|uJ@AURPxf<0I<`SqVdV*iz~WnPoM<4>9rE@06vP4ZB@OEM>V8(%5aNFqE2{z~ z#uawT9mF8`M$QI`8V37sXXD8*RbL~9z|Wg`PGZ>9*929ezTg)a03OzVmNP+k;!DHj z2AAqMB&L07Sh+u_vX{tTwGlDnU><vE)Lr_l7%d(tdd5Sk={ni&{D(7P-gEB4Q|?8Q zVqx4d-EF^US3Ezm(ZGm3LRu{DPj5iAZ0OA{5%BYR1=_!<!rT()pO${r5%4UbKB?q} zLRR5FI3?i2@s=gX5P}VaxFWgZ-8AFrxz%uP!r=G$xFt965-&68f%UPhR^FMy$U9Nt zFHN}RjrQn7ItF3;lSu)~djwAc^LOY;&Ue1F(Jiy2q}`x`b2!~Ls;n}jShRnO3Z2`k zE9xKq5BV;lP6XXH_oCl#=+b>UJ9ui3dx_epdK0$A4fgPM|7xp-Uf|AS7k;~N5=S=u zL+y{zJ11WpMoSJ?>m}!&mLpUqVy~`LX0IRJ?<MNa$|m@H7gncW9|jCCXYd-ebHk_J z>sc@n!;!%fqjZycbH}o$=MaS6%=O-e7n1oYQkDp-H15oDeqqM8g(h<=RZxXZw4{3K zI6NO%TWj)X74!+@wJolu%LZ8H1R@F966*4HIZ`f<r8GL8lZa|XI_)#Y)01yQs4SH^ ztRK<R3jCI-VW}KByka5{8paQzW+0%DTbfdsb9=0v37-e<QK_H=Ykok5gr1u_m>Uuc z`Eh_M9f{@Cz_Y!wSfhNKVb3Vq%VlObYcz;BUNfDxen~TF(RJV;yhGwT*G8UW9BXqe z)9hMvNm<j=?Hcd{;kshY1&tt-d>(2uBZ~D(&ZJ8Kfc+y}w9$#-UbK>Rhb*_0AcUQy zA3}X;e_#i+PKOMr^!4dzJ#i`Jnn9;%Q65{LCA0M!IcL|5&-g^5yAwDrPzX9q?dT3D z4uQgeB@St^6V@WhqAmPLYzSM-u7rM!-^g>ypS1=5Swy7W&U`dp1<57rtw+Ugx?`vD zQs7o+fM%0l<Ndn-%{thW?7K}V*_=6|8vNCgrqVs#@kF0nWPfV2H$ca8?QVBV_2vtv zA#HtwxVtsc+IdQ0BZau7yaqCb2Lz0*qLQMEMSXA%``7zP#h(#qujn9eF_SF-Wg=Z> zL)ioux|`6fJrRKJWZ#v3WqJ!$ZA03%-$He6+fF8#v)E;EbYQYLic4S|8+o!&VsJBF zyn&?RAsZ!b8Pr&@%vaf+6Wkjs+*rDe{Qe2T2Ahi;OPwt_)tmUlgZiE1O`7v`fN%Ra z00i|bix}(GRBXX(T^-F)kZ7~FNbyR8c?F9gH{<oSXyhiU&Aebc_@N>LsWKbYD>RV} zHHH2%uQsZraOtP@zJsTJRGRwI_ez&Y867<JZBD8V#bc9M&Y&B|-Re$zo~qG@907o7 zRujyBdyIe(dHV!}{=pT{WDKLFzN9KQpeNDFf9)=Q)UhSt(UWiY`ioNU+323X@KN`C z4``+@1sa-&IWx<Ez}vWL=1Jiw51hR4Wh~u`#R6;q268CsQN|fBWi@KT992y;_x?VV zSVC5o0Fsx6-s!Qlu)=;FMCM+|DXl}7s;n|m_v?zi{`Hv=EFIKS$GyqAF6B3*;{+|w zG%XhriwUXf_TC^&^t3)XO|>_9Kgj?V740dTd6@Oo9Wrp4IbfB(iuqnPibx&gJr9yj zyEoB51`ZG2+Y5Jp)ies*dNpZHPi0HYCtBXS=YXv_Ce5QceS6Y|Pi4qCp#e<}pQ)-z zbBA)xp34+;qSSn<N)}VFK}HX%eL-o5WNeVgA}s&i{;f1INe5(#Z>Gi4s|>xTS-lt_ zm3eGk-m8tT3UI(l>en_4DM?jdSlyS|3O!Jp{gHd46b?uXwWZ1jCtA~d%r%QnqdZpF zI){;=Mj@-|_z&3UGVuZyH6#pm`EiWi;D;_$$%1yaD6{D`<^?C!Ewc2N$EWr(Qp71i z9FK(RdLksLfzp=wfq|moU2j7(Lg>@4RWejjhgH_j2#Pn1(BuKPSQUm0dOG*=M0Vyz zXld_(5rx-DeqX4bp-xmGBXayIXBo&Tz|7n=vkgOSOqA5}D{`|W)s|Tvo1%#Zx11<O ztHxZi(5S~&3B(XiiiEl{`zxsm$9K4C5v-&iQg?r~{OWzSRP^i1d*^y^hBY|H?ATUJ z0DrzUH>KXn`-b{Tt7lntTh@7EarD%dSWR$8o(ltLW<kmIWDG2E$XMBe5N2%34)arn zdMmZZ#C6{M&#KE%39{HgE7iv}<FlTIdBC&uP@Ka{OIVDdGDi3a6%)~cm9sdF2|5Ti zXFnzjclWNQol%b=)f2ca!pLe$)9g;fOsaH_V@l8c2JlR>;2gY_6CvxyJrWo)M}#I? z--lAiCC7q776|uN*Da{~Sdj#8MQybFu`pbUWr^5oVzxAF{G1A&<Un%hF8(lMDkv$I zFHU4v{HWeEGM_L*cQPrINJSQ@%P0$DDQDxi<JaravG&<&)Ve4I5x-6lyrTDhMlT#q zC>uwxT-<$@Q+GVC-k7QC+7D66-H9<|Ce*l0BhDv_+ga*mGk;6?C$?ZJX{m>81nRe! zM)6#X^@aoUwblU0K5|y@2KOeu?bmXUb%RBNxng#~WgEOJ@kh~k5`XZ&Q^I_}+$-2R z%CZUy)t{%%L$>^$r;Hw)gm^{YNY=-`6GJ}A82!rQTAN4&@xZEkms;&M%eSuXBO-#& za4L*?1LaF#v3(t*S=$KAHo%hb=><-si6E*Hb6dgq6FG^QjOcts+$2SQh`qK>W9)29 ze>&ry)DZUx1S<<9=`NT=%p3ZTn*NLHtXZ#RUi;w9Ik?#jU||Kv0Tx4&1^_H<8YfAV zdH}OGnr;XB`~W&23m>@giV{wIJl*@i<45S)?vQVcr{liBk3t=v7NuHTee?!Ws5Te- zOm$<(nutxGl<*F4-j)wt7P8TvJX$2mk?G`rV}W{Fl=qvZ%XR0{jVgTb)TU&eZ<)-Z zMiP2-n^c_3tfJ0PzdR>hov1SrO~2bEBe}zJEo-^ZFxC#)X;XgX4Vj6mP9taiNlVMN zU=>+Z?Zx^6lSx%hA4Ss?XtV)f8c!HW0qTyV&##A4W?!dH)L#=~EuuCwX^Vwv$uM%% z@@Wg9a1E!UeS~Oz4Z*uP5fdAN4Q+6+jc5#QW1uapY$J%%Fz+io7avs<`a1koT>AsT zrGC_!?LEP%%o|&yoPG3HBHF-tj1vzFujRk?N!D*1ZkD*EbAlJ)oLK;&+`MLl7PPQp z7O$yMpC5`F@awMJ7|&7YKLn7AdkcNZ66BC4OP>cE3Sc$RfS%<9LVV|df@sJ=0+1S2 z5|Ih80XJ!t5ThS8=_g1|!_@j|xo5o(SmW|dveqcwCD$Y$hb1wxa=vo9QuA%!*Hfmy zi%tXYe^h(NIB^W9x1u+Q#rLL&pq`RePi^m?0J5FunCuPjZ?Ls)yx|q^(rcA0X6ZEX z9Xk6R75xewXl1g^gj^b4pv>sZ!lB1>CgQQ~uqEYla2t`?Op=dM%LPcey_XZE6i-fU z*|uf-_~iJ&_@>Fp@saV(H{8nB8E@lzoGTl-J|x724-dQje6N4O(fa|b^SE*EGt8-6 z>mKw$MDICCbX=WT8S>huuBSjcAU?>r_8a)|f!=KjK@)oRgIqM90nXwb2jN9Xi))b2 z_!8MR#-v=;6zG2y#LA&$(OYz?`J`;HfbJ+)&ydQA^=gnCm<DBdFv>$4t{(F%CO*Z+ z4vdhzZLZo#!!K8pcbLCzp6PMfXee2F7kA@y-UXPbNyU&dK^UZfIz<fiAm8>L4xr)G zEn5CVt+s~49B^5~tPg_B1p7^(lgcY^o!0puN*4PaNmu{nT5<aR_*wdosl%V4T2E7= zq%Vv<c7~OkFD=E7|Gk(&5DXPM_hkOR>AY(%+leVW#>z>G4$DG{wdN+tm(A5wK<Z`P z4F+08;P{pEQz(p-AL5z6)vF~<+~{QCChW2+y#7k-#j1{V`9w7P*Q#7t9WM<PV_m7~ zP3cGR<^6oyKgyv_t~)Ufjuuw-EAO(D<7IA<Y!9|czbB!cDOPFjy{1^DS@)V^#e+WU zp5%5;Le{-4_{XHHm#LhK6bo7RWZLu7C*JcE$@VCCpLkD>J=yQu?J3Ip+<R&uqh4m^ zPBZg64<Bb|2PRKymQlM|U1I!cgS1|=NNO1qP$exRV5TOl=%c^t`2&30_j17bCvnUX z9^(WX!z^3LYsipu?-ujKSG~Q2dQ9Kj`_jxY(f|6)w0L4o)@ks-&v|%lacZ(oWV9(0 zG|gDRah9$Rp0QK!Gr2fTuz!8jCv{%U;SN%sgm;##?;h##MqnVyX^<OuGvxK#Cr}k) zf!TBxX<+N)WHMBreQlA0WE7n~8YGUH#_827tez7>S?N+7^t=Yr)`n2iwGsf*r4G`U z@$}r1ZPuH#Bh=L29vYy`MYHSK`I!-JIzkX`lMR3O)~C-*<1^aB&cAz@3HxZMt}phb zYEoE|fkqCw+B9rY-ob1$1=O<K3@Og{qGj&Gd`*F$@)^!PkxxRKJ+;ES$rL-Q`*;D$ z_h6^q(>r>&R}QlBIqkwgTppR<hheoj)J2++wu8WR<3Z8DD`|Xahc|X*?hY`YK-|Hb z{Q_G<9@&i8aqFZO@P-`8`z3=;^@=wWo3c9!@U0(GZ1M9mI@@wy&TL|aSX&?cg;PD7 zi`T`=SZ5aVZr?AaMz!|+^kvB3Z9Qokmok2k%b3Fa-JQQY+&5j{97k|#O#wF(O7hoP z{z#5tlQn9Do)djTPEXwyA~F&S=+#Kn<18h&tShn@E<v?qU+b_RG+dc`by=&bCaz9f zU%|9{sEWc~Pv`S5l<}#Kz#p=j?ra!;CrGqDx>`2!Fr6!t|3-C}X}RHBu{S$g^PQEH z2?mn-Dv0EpLtptW+9?l1UIKS^AFD62m0p@SlqBqEC5#{-rKR5~N|Irrg>m%2Rp2J0 zfxS8fv(XRZ)jYiZ@c^zgh`y#lW(00ZNNm8iY?cdF%%xZB`oUB8$dJ3l8ZM~?m-C%K zT*+wlJ|ZscLzU<l{<z~{soX2x*LZ>zHjy4ohw?cLTwCM(|4hLUJyu3*uSQkOo5jaX z{I&wkN`$6ta$hftDDR7$Eu8vHfJj%Dx2&&Bp=R1sbgs33;y=~l!#ZfBl1Qf*Q^3W0 zb$CU$`o_KQ;>I44j18(r{A{tUh0dlt=}6cG!jU`*GU+ycKp@DZ%S0c&tzm;+%#brS z5RfOWz)KRV+;67SUf#Fd+9#JfLOXR(_aaSXGM5h@=i+V8Dqo<+{s~&bU%L$1bi&@! zUJKZ+j`C!*R}BC1a^%%P78B}yyJnM64mWjH!b|}A5<Q`OJ`@tQh3>Q+J_VE9CjL=! zvT{lhX4bIDbF_@_)Z~^kwYw?*e$5Z;?<kEMU!#r^(>gk;vm@U{x$S;?dMYGiYB4#l z8R##DV65q`j^iAdIEUlYiAzZ|*ymzmNRpsQ(iCMVfP=t`G5x@(W|1^vs%Aw~X=L{H zWmha<ZL?f@=jkW1+(@)Kk(N0eSSDO8P=i?^4Z$Cc&ZNgv7vE{JRK4jKQ0(QP7P35B zTU^o%GO6tP2`%+d6%sdSrgfsmJ)X1Ny8X1DrQ0YqqSfWAES%dN(}I||NyuVNJL44< zyPabF_!mn(5g4U(GdXnQa#~I1djXvhOmtyB@X1Mj2xG=AAj+?i2lljc82PdIfG*vo zPVjv~Tzz{|h6{2a?z1u%_Sx2WUYSVh`uO$FAn%{je3d*Ak?{j_rD^r%ruJFjiMYkO zpUVY(bL?e7DS7pbkm)gb+R5R%Foofr1gjELxTglO1j)rR-?B{!+A9rjQS`tjo7?Zg zk<9kMkoD8KWH(wyQ0Vq`gDJeCsdU-2_N3R-Kv%-GX50JsgzC(9oM;;cU%~F^Y0C7J zZOc$4*=HT_LtPD@1#9zF{N$Y!Ki(Yi2-NmrbVV-$Y)zL?QBLO}JP`ZY6rZ`dW0|2u z2Pj@gU(BV0p8#U0toKDqtz{*8gdhYm7b2=QUdW=!NG!j~451vqt8b`Il#mV`a&TH^ zuupOlZ4eq)fQuB^I7cS^`BCdxX(jJ$^G1%ZFqvTBT_0a5mQ?g=T?O_qH{K$?G>7tp zCTI+hS~Ff4DR#E!c{595s);T2(cfUQ-NX-AG~vnZI`^XPIG2<q@+Z9Mh)?RO_I73u zlcfvI&6WLV>V*cS*@;RK%Ut$DZ%y*Vsn?Zbg>D0%X*KKBqOR|ypVLx2b91@&LMi6s zOvo}x1NXzEgg8SF&t+txu1sG|Ki&(E`DE(QyGA&Eb`YfK(*>mWLT$Py#!LI!2!kb6 zfI1)UmIx@HZMDw(rb9Wci%PCLZD7|k$D9;x5|8%*XPZ5W0P?gV((LPx({-!|vH}yr zRkS2PM{Ur04<oQa<cem2r|VYr?SNv7WE=hU*-rTM++0w}qp0K_gWH2wqmX?>Xd<{8 zU)!+u(%p$d_DcBRsT*uVNz(y4*+UoV!(XTgDMo*tH~0xDf_|mhAR9KdO)Ra^QWA78 z^WWs<KwGh!cLGZ+Cwn@G5YP21I>oLQ)G8bJuz)kOKKe(gHti$W85GWj67q^Od;s`m z3<Z{UM7x=7;hCw>d_KKx>MM@irKeQdrs*)ou*o9u9x8C1=q!oH7nl&&+^T8S;Dra- zTW9-apZ?5vgGkw{4>$K=Sl7(+l<cgiHSP20(6B!z%Q`n7sM>r6td+YM__p#l5k|KP zPhYQt%m5#$FA0xHJn?pJ*@~r_3bdY>(z*l<tOM315Nd5|4e5f)z9+KCoI*_Qek5D* z9we(r4)AU7=irSwjBL;#ZzQId=I$0XP`foTCCG0}V~R+#l6x&TFYL8R|5`f!Az5ci zl*q=MLQD^$#C<&_Z1g;1BWv8kN>%8=LJ4hW2?Kp})nyk6YtegzfDs;Z#hVG?Z0s9W zC#6Uh)ru6k9l<Sl)8Sfo<mlTg&ph##BgZV3W2T=CePaz~Vj0T5o1_|IF{$4rd_iYq z7Un5F3(zR%^&jESw)B7kH0&d}eSE|C0Ku6J<D-+?C&yX(Yh2tLKGfy*^S%0p6W>OO z>Iup|0UnjT<2U-02hRNLSPv$`lti%-*Xn-IdjeLTXVsJzdvYS+FjO@Q8Qowb-jHZ+ zegl)uwlBSzWk}YL`jR9gCTnd4DX7}h_n~!c=`Jsa{oGv6^R;-8YTDw_9J@XBnC{6k z!ZdITRi_OkP0XHY#SL;Ct7Ov&5k1ueki8+HRDaWnHnl%P6=o|WsnCr*t-<elgp!Hs ztc%qVUn%O7C?22a=}LOucjYf~vTjg8tGD@Z0^WRL2_c-oC@6#zIJuq`e0(6m#}#tR z_sql0K9FERg?cWQfP~XZJ^66LP8Z!|VFqfjg?m`C=VgkqK#zt6x5i&bQ#yN|vEE&; zOUxon_duKpib_;13?1OhwmP}kLL>o8@TkxoH(H2nC(AZsU>C*u7~YukV=1~_!EY)k z0{0NbnY&ZS*GGTDo7Jmck<fNjBszf;-ru=3tl_00d6aJ&zS=jU++N~YTj(hn)^)ch z&8(0+m$PuzTYN4401tmWz+LRzb}V7c6z-I|$vNkJ?e)#cD}#UU;bd6Q3%sOklC6OR zPVy^5V+bb(hrtEOunjt7RBkS275bzg=L;q=NN&9%?0$u>Jmz(NfUilj9?Y9zY-7zr z=b>ZihIGqX8DhOf0<$qyim9|qv=mo5(!OFV-Ukdn)YFRFuh@!oJ;0tmxW0xw5*k7V z?N!$MyK-x^rr0%G^D?dZR8MQJOizTKSm^IdXv<wmTh_uVZ&WpjX{EiOWzen(_hsPz z>Fb9ZCDjA>b+GXRPs2TCj4MSN`#YGheQX`LA#K3>f$f?NP@$jeX+ZgkWF!|PZwVr> z$9DrONDz4|9b+rq>ZRzGZqouHU<$JedlcuGnP75^=_1QEG0TAD8Kywm_8wo2N7Va% z;HUvt@v|^EVFm>PjuU1u3}_}FnnniN!*9|$X_5?PH?VN3?OZMui-!ZJ`Jz<4?I$ZM zLENynJ!Lb6s>5_aP_Tq-%HG6Hil=4G);+^U>(cF+yItjbEs#FTg>fG)d)6}3du1<s zDDu^6Fp`AU>SwatT~%#w>zgN0F25UxFfz6F(posOdi=AQgw#kgWYyz-QquO?n(c*V zy7X0kv>u-&{H}N-$#m?BzM|wrt!^S`q)i~RwX7^Q<`-5q(<sp78_Q*dJ8^3EAe-2J z^NjhB*8oiBI$)a7XDE96i8mjasc0ML15dC~bKV;7sq%$t+^|3i==STnd)wSE`AXVo zJ;O>C9T2*eXl%O!kfB$z+;MiAPRJ(N-#h*YRNfuYUY-|Y_BJ0PW)DlUBa`CcOR;RH z__I3vq7Gw-knUK9)$Yb#%Pw)?bcd5JjW6nffn}!2Fykxk-{GmdDF=>G+GoYNn)>8e zt!qnhXmS#VYZ5bE!^iy(2T3G89_4$0Z#(mVFHPFu)U&90y>WTNs4yY?y#q_*!#KYO z+$vLTad_LrW!AmhlCEKA>|IE=`#EP!4r6Og0FBC+@ibtQnOH`m`XjJms%cK!rpijF z_jCBMbQ9{ZXovDV;P+&o2Xog+66UAJiYK)`o@LO6IT&e<lRS6gN1FkeW~`?ZMDWTg zh!1H8s>=J@&Gx`WGuI16mW&}<HB&#;xrwhe)W+=Gg;rbdhuzD2y=O@7T)l=#J*vQB zD2eYlE8l4>snXkXX{kO7Se0o>som35xm!X;(H>=J`ITzgets;n(6$ljnd2Ma%BM9O zW()|hsEYB7*5lm<8?V5pnbA_{rd$vw@4!k>V>6Fvp4_Auqi}a>^+-nBMt!pP@a`$! z80i!M^9~{t?|~V^OTE9=Di?7WAqY(N2bQwzsVIS2aW3_-^Z^?w3ExT;Bi6xteFdgD ze3Cg3FEFiVWvNUmL_N+VMrU9jd}>OBz)Bm&HQ`{pANd%gG@{m0T-D@JCPwvcQ6Ixb zuDh#pu^Klkxah0%bw4|kfo>{omMD_Si19qdbq5X5?s(EBli5u7#7D<E(CWTEqqn<J zH!?}|r$KN`Y+*B{5)OtE3z$r35zIB#aPOl*{g-H;z9u#@^^a^It0KN9acIdVFsF;Q z<r?R*l(sG+OH9#Y4-i5J8?p_C-2V1+>5pNzpM7#7E4W?8gKYqY++l?Q?CgT6|G}!# zOarwX_FSG!=grfp5jAR%?0`6KkZq-j=WJ?Xx=`eWe?SxPGZ$?tfMA#va?2o_`{;69 z_#~mR89mujOM0%gq&-A&HZC)x3?k$bjtGd0nNT@8PG;=tcG7Fmn;6<pOXo6MX04E$ z6Wbo?OVw5R!l%n8ArPZdqOF-PK+&V}`6eFo0C!*tDf_-euHyup4r0D}_elAU2VeWJ z!D?&#MeHO&j%P;OY;c24!=-}$p6UGhUGNJ@?krYmiWT0qZBp(tKQo3iSbSk+K`bQg zDs^kk*R(4dr6m(>E|kb9WqKPDi-xDQA9tJGjli2<anN@{)|kEOA**1Tvwj|tCr&JU z^eXm2IkgF<rrC1!Pas*p{?g-OP!^rFR1%Vv*od(^tU26lQq>(kUO9a7$cZ=mlQ$hZ z8oyZ&9@aA(o~0|)FGyZ2Y-JR52kfcRV*5-V>&5SZKL1|)X0eyCy9WlylDVl+8W=8g z?(H|WuO<(I!ltr}^As)@Kbck*=dpAzKhwC3XTB%lmHjfcJ>$V|Sma@8tm;FkUu-<6 zcaiR7i<u<vE6dVj&doA{TGPv=Zct8hn*66O?2n0xRy6;n%)V6Rvy2+)+c>Os8kU!c z2!K4AOpZ(6N5WML4|CvVzlKed)IGh_#%<&tntV_6O4Q2fofMflm68;b+Tl4sOCqyJ zW}bd~xjK(X7jvswngW(vhawv<R4qvY$`vK21Z-g%)Xbt1>Sm6dFvVt)p&80#CWI+A z43ZGe#iS9{iv3B~1e3W|WQY~psaTprxK}7|X)nyF9veZ`B#}#<`c9Eat4~sgE(*TX z;K4fLiX~|HNupjg!-j?w!&MRv3*8a>r51C7Vi3A$Txu*r;*EcrbWWMf8H0U*%kc*} zbO&o^;g7@xE(6+=4m0f%c;gSNY_F%LyCFw)o3K)Suw`<xcvGQsbK2RdzbRL?rg61C z`m3+0sNJ0SaDZ~Rj9pMkS`dc+HfO^;f~D%`N_g<37C^n(a^6xjnoj#48c!B9%7poH z%Vs|N2~)WaMJF+Eg0#)X%SbVeHYR~MF<w#`763h8)n3I4(I`5ZsU?G^f6Xi3HAp(G z+$!#zlekSvdBv|(63BM%NzGjjeF}M~jjV3vNpfzkUzE;io2-y-7lbL(YDvtspRJXQ z)KgZ@L`OQAQi;gYL&gkA+c71hR?XsyK66V7R7xqpmnx@RP&n;*@8!?qUxCqd%&9fu zQb)g`%r|p|rFlc;njjn#P6pp)zi)NI3+ryN4E!3z%2+q6LE=Q(E>suTGaF+1T|DW& zrqO_j3!?xse7s>9bYk0beR38<#5BNUub8ZnCNjKgl?3&22+0C0EDCyNg`I}5d_9%} zU{`usO2et*_Suih*h(o8!mu~y$a(KfYq|b<-<)LJk{ico6zm6BW)UUGO_?XawV1?I zw6Jg{HoZf^Qkz1%Lx^3R<o8z+8beK2Xkl(W;m*U}wUfZw2dCDGMivJF9bT;TQrY3Q zcd6O=_}6wJO1zQZE3smHSME+psu51yR;_zJTI$@9Qfw-#)-hzB>JeJJ&<ic8dMs*X zR%kP=(B6ZdHhOz1#c$dc46__Ju!fMyZ>ds0;XTxrj5UP<Gw0H$7?q+Vq=Xol;q}oD zTz;6ESDMtToZH+|wKf0@+ne_~iX`T6WqO@f!`6r)CmZx&XSbxHyv`25`O%r?nD-4L z&Ayb7?(0kOLbV*2F;tYb3J1@^idNb({$&e=<{4U^*f+*fRFPN;##ot2(z}9$Xs{kV z+Q-|pA(zyTL`&DpQ|shv&Lq&>9K%Z1B1Fgrd|}&*%F~2?KXMG?Q2OfXjWdf|Y?q-W zXWOSc3;9X#gOscF?*<)z4Mg|2sF=U5b9+Dat`S^QTi1;)+Mrko{T3|pyNSGy8snFB zxU7TR&o&Z{QN^}lq!#B$W*o|Jj=xR^v6VrUvk<a~r6PFWCIedu2-;Yitw>6m85sWU zn%ueN#_?_AH`OQ+J|)f$@U^*u-h{?%hTDK;i7akgNE4d?+xfC9$kY5`qou@ACCa;Q zZD|kECt41}&#BlKW_i<LG1eEZWwC1*LoO}ZL*7i=?R~rZ4xKsE-t7&r?xucC-5q8H z2$k<_$Q4gbviA#<Z=$_1hMMbc)N2!$0IyvavvPMnEkckOa>Kbz<f$vmW=W!WehA{- zdzTsIvpnoa7~L`6R{km>`O^)YE-Z|aOdgW%%vLe!$)`{wynkDhsF;pox?F3@Ru`6V z8e=iUjoN+FWu&>^TF)B;$sju!aZ<bI>^=MTc${@MzT;g_?3=Cb>)gNZk?B*fiZv?? zfqsxb-4fOVQQGy^=KXf=KQBbcnskFTHD4e7-N4t#=v|zw-lQ=W)@70>Y%UJyiEYQ< zz^YFEy5H>M?Wv=bfC$zofm__EJZtMWLUZ2nAw-%FHOUoz(um^v(VC`wdYs$C@qYu* z_<j!SqC=Zcyj3NXf8%$#AAZg+P#z!ErAKrS#^P_G{b1~f&igdscW`Y^7#rin4V19i zw=(YS!JMedFsJqPJp+17V2;ynP<UCf^it<j*WcbfCiV81;<`2kT`&Dq_S|czldnU3 zkET`rrxcCfrXeJ@Ct9#GnJ2V;P}<+nMr?_IH_LMed78i4kG$`u>_Q;7p&q1_QlzPS zKor^1fqaCk7Xz-O(3EN=A4y6EVk{{=`HQ9Q^?P5PsSCE%CB|@uGnl3yJy{5;m(liA z68<uN@=Yxmom_#RJ^}12p@A7ciM`Y=qY4q5f(zD6c!=P_qsBv88SSmCjK-x7IUP2F zV+v<-ViAhtVPUj_LytU9M$_|tc-Qf+<>#skjR@U~op8x3<?_)(N6Qc2|GJ*hj-Ms` zC>_4Mf*;PDcgcE-MiA&~Rx?yx!m^)DZGJH=-0o%0%u|eeKS^7<8;-BCcig2z3RA`( zrQZo0F@vSqVk+~1;OG|C=;H6;K^7cHyhnrb)NZj5&yGT{7{x~cYbJ%t2|LLRWFiRn zDUMT|LE@;B&DVlQ^BLiW6*iGYc!vs|%@)d`lnsmn4omJmr38m&i+29d8Xu;lSFeIQ zkAy^LR?DYbEscA?nk_ITV^j>~@f`R{V^NqZH||WTv8|YMXjB?~@+{?(u1E$eW`#Di z=A4pK{U{Hm=Y1-Bmhj87+G_L69tNDz%0k*(EPgLsYUf3pXWt!q#!ljs>aYnG7*TI0 z*S<{xa3KD6@vt$nri#bkp+lcM6ajpd`qAX!NQqwDNU*NP<?s>p@8{c=Ua6D#gj(Qe zl<ntiE4`{{iB%j)sS2r9q*R4eE9RMmR4ekVLaLSRn8{w5FH<K|wV99Yr)@J&JEU51 zF{E0NSQRF0Qy@&(W|DTuu%d9tup*_(Z;eL%JQ%h{W6v|cFB;dW<aQVBHW=7n?T&O` zG%CC+-52dfpPIEN{t0l=IdlSxK@uzNND+yp0LqY#WTx9b$lh)WHinq_!TVp0A6X8_ zcD6B^kW4>#5%YRZBwx%M1g_CK@C%c{n8F9Mz#Yk5Zv`4-r~tT@W*V4@f14VVw<=*u z-fEYhP|)x4C;men%o}DN;$f^TiQDc5Pj42dNe7dEpt5}=Bh&fgBAEehIu@kv+%SWa z@@Nt-TR$_bL{XETGRnMq&=DDF28Ly(6}zR%d^7$8^`{9U3RSP0Ev00nPYMX(%@sPk zdq7y%r(Y8c`slA<H+V7~FL=y7?Lk7;7*wThvC--dKe<Z&=HVl@4dFGRQ*zPw=b$TJ z89EH0{<NV0+b)3Y!Ig*5FqVNgP@%c;_Xtzhg*s&r{m^v-ha?IDUAVp$aF#co2aai7 zIp7i}#Rfs!M^}?v`;i=6JA06(*<mS%tq;&$0b8v*4Q=K>^{NJI1ZKjL%^({gWNhga z@%IZD;V-57^-S#n?tkj4(4`z7pzEQtLjgL{GBF8kJ*g`|sGy>8dHjT_N7&j!4rO9X z%@{j(23MBn_q`6T{sF=NeQ6_<qt2k==-VGu9!QO#QA)0AR(H^RvHiH$#>zjT)|rC{ zMLxhPxSie}5L2ybqew#SG+s*6COu=@fHlQ;G5#(}*#^#6!?N~v{&Wt@xAo9K9)e^y zabtgK{t`%YsA6f9*GHVn&iuI?U^n*wmJ+6~F%UoxP<K&-XXfi6Pv5COoObHfaHg%W zU%4V^X^&kEv@6J&euhc+YP~*;$%pdU99XxkkFhj+Z{3cZ3OI{xf~E9@mw_DfEX_;` zFRVS@e&l-aHbS9a7Jx&%#X<AC3Y}gc1MX5FMd|v;SPFtri%-GO$d?@$tBJfemE4}P zfQ~7Z?QnvEIv#wxtr)0TO2{QYr&L#9c5;^d6$)FLfoAUV2p2iwKWcx-J?4kx%2=`; zB;%iVWGeb|)>OWXfj*>_m9;)Im9mU7%Y+TPWzrN$dNRYCD~0CCWCQbs3AeaWTRs$) z*>1q{rr6n>lXF;B_LFMnfyZ9>m}=%nsF}s5sTlx5&5=4~Y^F2fH<NGQ*V!_|Bvba{ zV0BiR9Gb7wDNc-a3u9j>OvE1tk==nhd(p?7F@h&PC-)Q6NhE#!s+qP0ybblgN7qdD z1!E@uGoFjbIcS&3Y7`&R?@y`TQ4MLVy7<TRyTl+fR_L3JheiK>7o<_$8uB1^H~7C5 z8v;!xKhn`DrOevv4oJlMI@1U2N}qP4<K3@|+HU2<F)vFKh;GK*zJc>C_HS!(Q}Hg= zAn)wxWtEj?#lO5qu!vzy>S|bkIS2`Q5;L?HXF8AgzykB76;1LZ7e9MiaV2?TSDL8@ zn6B^^X_<9{>tKE>(UilfX<LtMY?ulmTdJV1dD5YOs^*C;9Px$D=AK4W(BJ>xfgk@Y z;9Lz{3D*DA1Mb#daD9e-UMT&)itlRzEQ$8{9)SCd?tT#^Q58hg-TZ(r<K4OOH?qhE z6P|8}b00^75zv|WLg7Bfju}ruTkO8gA+aM^#h=LRx>mVZ^1lm8FH(mjQaAM?c0OB- zLKqd8M#Zn@M1vYco{f4Cc7W@Ddb3=n1ZI&pg_LG3@lu-Uj>s&)XHxCF;hGem47)5w z%-%}nJ?XQ1r}oh3KL-duKKcb(a?MVW&GmO`uD6=Dz|m_7pEs~@m`tO-`EV?`i3KV- z=%tvA%PcOT!A<|B=L5QC!cR7mk6K9c`&fl^nP2SCj9IfAf)ez$VaBj_W^+z{0;s-C z4UoTC^X3RrC`>Uxpd$S@6wU?-RrtNs2WylMANAvYzU^rabw<<HH+la6YVKvO<0at# zpq-;PhUmZH_$PU&b9Xv=%%c9)GQs_2R&n-WLrX{LksyI|BvBz9Zyb0tKiSLoGNQ=H z#1_p{YyAq66Iuv)WvRlhwDXNisi3&hV7CA@CvuIYMYj>_NTJQfy5QeFVz~gACL@W0 z(Zq%l?D|U=EU$xAIZ9fh63@E;W<`%`Hn#Uyc#!dYGT=vrr(B`y=x;M6DkJVFXBsbf z#{lZrs(UA<0@q9K!j@z;RTRPqY3ln9&pdSmmG=n%?ry>;B*|0LtLh~0pE;9peRo7m zZp8VDXbb#$W$URnZnc)ZOh_itnk%71!g&1iDxMLW(b;FXHYhA^6Ou}!P?_fXYcH!& zHX&yT#GO4@&G(MB+g*oy{Pa;(oO@YD*`lg{OeK*hdwigWX4Oag`L-dCFOFt0q(sYj zxo~KW+Bt45b7JZGh^yn-!gn>HTlDNKw>CoQlkrdSs?KW?+QCa?`CalMCG*>I9;7vi zSUr?4hC3kO6V(spXCl%s5SfYZKciqu;aAe!JJdI-)j{6}{l0Y>jbBT3U-k79*Lb}| z)lIqAZ(sBJtEggCo^ZaAy>}xS6?cadjd-=TOGMt1d-;uPUVc@zy34;_EFLU-bIwSo z+UhPd-C}$iy(yD4H*E5Y6xc+Jb@k{3aFug#-O&%1)K(aDCN3oFKi(tK4)Z4VBp{~J z<0G4Gr6;5XAfiA|LjP|&_B=<a{`gmTF$gnoe_ZDYq{iMu{zW-{Gv<~SyhFea@GdRw zyABBfZ;fL15u9+Qr(lin=s}<Nh7bb~ct#@?oShaj0lVPRi}B)2chhk*yPv|Z`Ly{^ zQQLBBcDLe*CE=O9QrPWCJ3X`41>p<K+4$4kr&TurL3hlX0F_#@I;wAt8qysFrG5j! zJ!%eL{0ht@M>_T6Ka`vyb$31K)Tf5kp<WH2(AjV5kjcnQY)M3H)5~RVnb=CzaIg3h z4)^nIALVcrl{<jW)qH2vu2;c`Eq?lQ#MY1mR*zd=N_jN?F{<rMry_u{1Bo_1)?{<5 zEbmn#2qpSxN-j&}^qTiH(08zi0(KB}J!MV48b2;j_#ri)zm64P*v4Zu1%kzJtBa?j z>f=44aJ~1Kd+fU2^>F&GE7zHL7Otzh*QC|;&d2VBQJhvt(p|1R_xcf4WgK1T#{-K| zkkntPpvBjtJPB0q(iCIHW(7*ydxg0k(W$c^(EG&pBDziJX8o<H8`6)&%6`6Au<}^8 z7t7pJmbBiWmhhF9)C%c?-SOGR5@}|Qc~MH|R*TaybBG|BzsAOH4Q<k5H$rddo$|Hl zZ~FiTM1?nSK61bN(3)keangCQmMmV4JYkFjG>Ey9i8-Zz3{*>?!(K!lGMlRN;&PQ7 z7t8jtM3BZ}W1(tGi6{sNoL;tsw6!cDyCw$(%kBFG5H#sw8NY*Nc(Ti|?zCB~tX`)1 zhso*;yB%h;B%f{9d3#8|NoE1pe41jrPBc)<ot5{t+DtT9nzDhrpt9sq?Hn3fB8E(t zPi-t{-iM{a5>Zr+TKOcgO;+jg5lgka1{&-mIuoBh$hWNnGWXO}GXDkZ6`|}?L=eQn zvB_o7$_gd9MX}?bqdqO^VBQ%SAf&F;S?UepuZ&h0|9R1&+|csvbmU6$Qqc6s+qr%; zCHtX)&RuzunKt@ZcR}n@cQd&Ka?&tZ;2Eig?ublRDR0|h1vMt&?{g#H31ps~3-Ryh zstNx=d%+>S-$rwzlf}t_O)SH?7K#~0E$eZfiS~a_jcn_OYVu9X7|t5`Tio8Sm+-YE zvbSuFb*;wF@F{V&pRaATvR1moYJRpdL`{!)CQF7@Ces;Kb+<i3_M@ik<l*n!WyF%+ z5@o9s0v9I4p$!H-TWZotXJh)Sytv$0tOxEC$q3W~0=3P-n_|Hfl?u;M3$9Fs`^{2f zO+xq?GUMk?c{lxl=&TKwY_J1)CEiq<p(#G*VS7Luf7^2-5~ZD!fdOO?l(kBHB2!RW z#wGAYnkYdkb~0ZmE0wHeXNEy8TNE`ItZ3*7ADSwQKcEgC(R>^sqdRDSVs(4``*tg> z7*5y)QasUhb^nia=p%^V<yut)A>r!=@B|ib!{pdr?CeatDc^%^Azh7>3bh^qKA`uH znP=7ZpfZ4By&?D3%-HxnZoDH$i@ZA4wVEJFKk8t8Y}ul<v>0T5-{791FKattUtnCk z--b(EIS$;P;{~0kt;>$DEG0=05|3hAzv`KWL|WVqYfdS-mI(t=t7phZl#EN}lfQcU zHC9a!W7I6!lGz>5$u)E>HXl<UZAC1+=|SV(yhflf(of3OME3gVZ+M;THC~6Xyv$Vu zrVT~p!Dd=*Jtc)-r+oa+Idn%g&$F(@&2n91f{38KGH)xDi#dR9S{EQI7Mib~(pPDe z?bmVeb~Wtiha>X-r2|FS>1%)y3!CYUzzuJS3(fe(RO=iLJjII<qAR3pRYNb)2W#N5 z1mdNoxWyKN<S&Ki<3FRh4B`JAfV#tp!08Sr9UkArWupl#F{MpBE2*qLuLp+CGZFPn zn{=&PR4}96zo6DmO1okkJTp7j07b9)I@cH2e@rC?U##k~j!0i;5?ch@(wn3fw5fso zVFq%I3*jTo@8{e8OAhPu2^@k+blI2z$&F$3GUo_vbA{==*A%bgI7pLZE@M%V8^eE} zCo}HqM3K`}8Qmo-CS=QS60&88-GpozE{1FwvSLEE3<W~A3|TQDTZY0RTZXKdkS)W5 z8r|L=|1@pYV%R<u5|~y@N>BSl7~D#IX)Z$50io(14qj(Kd9v#m=ZT5Tm!)~PgUsj0 z-GvlM7|Oc~y(ueyDXGPN-n|#q|CYWoB9mt?9ccUk<+8ptZEqEPNS!*sP1`YO8x$Fa z8mWmLR9$Kz8Q4$p2++do0v51w-%aU??9KEF5NjhL^H`gc&)>mhN+N;QB)oDv@3MKU zn!r#6gQva5nlIngMru4R*#Anz`IBne#wVEV7i(TnJ|NQ_ns1wG>Qyb>i3*({%gdb1 zU!BshD{U$4kfVBMPm}XyL%Y>gLXowb23z~A^*f}?&5fXj;efP+g&o4hGrFO*7wiUC zkUu*Td@z;Tm*nzsR#<_MDC|r2;f6ei2YBPv5H#X(V_5n{VaXJ>sKD@L9?JMX^E2^d zbVq2VpNRfnRHzSOL)>Cvfo~F~#(1?WO%!$(_6S!p12gilVl`^8kN%243`tt)PR%ho z@a@80R%_*$8|ZFSr{JMThC*IDo9q8C1?RdWLL+H)<aY@&y~-6kTk{Z6r|#F(U;0ok z^RZyECm^-^W*Axrfq%eDj4eRLTWw>xp3t*VIq_aCXMD+B+N0R-!Be+cK$=?2WK(M~ z)+`t;R=)78U+~!9G+R{xo6f_*b0y<b=E~kFKZz#M`kLK^2+_I`et(E*+GoQH42W0M zaX-re_jRafxh1rAw<#5>QkSI=?zO$|`oHRl&FMVta2F==#eEGZs$F0!=b8I!JvU@! z+Uw@vD_HYA>X$7%=<sK2Zk4>-x3W6qErrhQ`F`s0+oi1!gd|Q2+;$&7JRxC6>jXYx zU#8&e&$`WqV=xcn>=}!k8{haX#!LPJFeZDB4|GTM-b$OXL3dQC#uc+;2kbbscwT?C zcLw;Z*xd606^;Lw@Gz>ITx5lbKGxY{n78W4eze*@C8XF`iaoX`STM75YaSJA9|+Vd z-rLOA80rsraUvqjxDo}v%UyaTK@Q}~T^1bOlajDW+aw->af5U*(t{$Q>kD_VskG@A z**liiV3}CZsHa})f*amxsTRtg7;)_nE3ZN}lx1+N-d&LJXZa@{AP0gYc@M@zdIb!? zm5C(Bf-CW7b$)yq1#SM3?CrL(_2oiAFB@?$kw5`pq+XC;K^2?axy@O<1>M`Cdq7cG z-fEc^w1A8Z8yOi)+w3aU!hEabOy7|EeX@Cu<Z3F}Zkg5pg0PF#iP+vD0I8NRWIych z)dt<i^%&W&a6irYfx<F7gxdp!o;RrES2$<0LQXbs%fId4>21Q=O=ceZ#djzU!FC?s zjc3D8``&Gtv--`##f|29e&afkX3PYG%?Bo@I(3+IMyKzzxfQkLZb=h{UWQ(#ZtjxZ z#p*DZ;{U<VY#irh!FTK07j*a=4&8~9#}1!3R5||a(W6I>o#+l9KH^j1L5cI?#)QWP zMaz<@2Bg+5p4SBVrS70DF_nuN|A`(G-TO&mB4+jrQ*wQGsL>Ylc{!p9IyT8H%|IE` zgOWFPA16W;%lrS-@4x4ujapfIQ;NPjK<s+HJH)adNY6f2v=)C_ytkhhIPyt$5MaBl zw5hm@@UC{cA7U5#Ero&NorLEnnEtYfEn7F^^keK<8h}s7xH>?|O>E}cxuu6^6HEv3 z8CX^UhY)o59)5_D{1JZ4n96o46g`=_07-!4_N&ERMrBa6UGjNOQY#Q$$+at@bSamT z1x{=BfL@WVy+SqOR=5%|X&mtpRv_j9HaOT|I&FkNs5t?Z4>clE*3`MThJi{l6+nB% zDSKZoHWQR)k3n$hY6sFxHVZ%kQa3{lPg(e6W@<d6tsLc*(A(a5pv62)rv9P&)^xw6 z8)Q+JQ9ljROKLOij4T2z_<H{D=FUC3uB*QD_ocUN*^;f;iIZI0aV$BuYzLB%U^@<$ zofs0u#7>-G3rW_)QEW@{xppjF3WYiaLP=X7(+(|^H}pYi3w`n^q0mk{ZKqRcnVCCl z+685G7M->XUG4mlX`A_czx$kX&%Kr*w6kW7lDmDL`|SPOzx{jf-|kimCgb#bwfszN zg&Uk)X~v5e_}bqJFV+YzN*fsO5|)M=zy!q~k;M3#hOw?=`y_ArPvS+&piXcSMtLfi zJJX(HLt~8PFssFv<bd?>=q<MQFi6G#Mu=XC2n2Z#t`&$T^h_JiaEIE)k~$T|{(R3I z%Ogmtg;S?8bYbzr^L<UcT^Et_R|vK%DG-_ePCzZGxI=}aB@!=|Z%Jow2F<s)_Rj*1 z)c71gX=MtqHy+%)Dy_FJ`7I+~q|j;M-E`I6Z*sB}*aN!D@wtzuON4$y3+!eCq@FSa zmFRgX@yl5yhdBwOi@C+u3g@E_#VHCkBTyYN$rh|$=plF<|A(C>p3woP>%&}O7{tx; zN6sJ8d(0Nt<!PSqLwmS-{QNCh&@&Cgsy^vkEF+KrZb2eQ6CKz~ps}W`C?iQ;<3KJ& zOM}E+m%`ER!iKZa-5e!Jql#1z%wqR&wbqI_jd7)UQ2vqn+S(YD4LqcfvMvUt6-8eQ zjW#%ZphOmGhNw|Eck3oW2LB0Vb$o!IT^9jmfq-C_Y99vQ0vmNC$_Ri$(y-88jJ~O^ zxqoU@f=*T;JTV)EA$woespXn0LZ|Ag1|+(wLw!AuXWOS^8d`5kAvDFUh(qa@QDh?d zfHtTBhQbv9sxXErfb>W@r?+szn5EyX&sD=~#+D)g7nGT3r{JQ-gay0;Q=)Y**DU#> zZp<{RQRhxv?a9bBG;Bj1GJ&8_GE}t6L?k;-A69$5lxa$rE;J3%x4E_{)09SCII9vY z52)|8Js<im?fF~oZ^^W0Lj%Gz={bYzmNoyHyvcwY{j~~*k{NR)zC^zV1OpB`yzE(B zvkYVjNz5S<84Sbu(>f9s1^=O-6{(3CFdCq?ko_7pUl#Sei39l!Tl4JrUh3}X?(8jf zujuXQerfkA&Q>RJWs^LY{%M%^^Q$~Wv8>??D)toCF_cpN&qR-X*GL?UWk<=L`3qD$ zv5nS0kgUmKsrD3Nn6*sQnYpQnv)cFK$g4tpRERhWF1m-6wDqn`Qqm+Syu7!32w5(v zb70d>G3uQc=65F5Y>Jb^c)=f*QKu8c6QRYg*v4?3D{8TEwOHazPaKN2cgM{NYkfm% zMg$Tq98z*XGB+f-r$e@-Bz=lRm_!%|IcI`MLn1WGEcPPC*%#BqX2Ct!fb<$6lTU@) zFy){Qu<5DTB$qcOPo}*BMKVZY{176(EQ8x?vv8}2(CIV!)4%B_Z{&neA|E2K&EF84 z3uCfmnxx2rYI_26XtTMG+fk&Nq+!dkeMt!~&opd(L&LP<C>iV&9-@?~oI6@?96WlR z8YkJ)YGQ0^hfKk*ZS4(qUN(7<WNOBPg$3FUmye@xM0SyYQCH#F{DU7a)3quYZtBYl zV~2CnZ?E}IHWna8Z;lvrmTtw1gfL)8|EPqu&#lo{Xn6Dy&1cJ;2A0BoFrYZ`BbgrK zmDF0Ins_e^!Y*K1Yfs?PJk$zM-6x3Jo24*<!bT)Z(l<83R$^3AM+#fXPwBu9bHb>j zLj;h<tU8D}`vp>2tdMDJb_I;j*lrb!i$SpuZkW<YrAS@h`uyi&U{r5?U1j?0%#fz* z>zN>#^f63Q!iBU4pchWDx7l3z;bVtbWz`b>oWS)(0q#pG?o)A?A{J_*egS4x25e(W z0ufd9+A}JeIM7<2zgM7=f|x_?f^s6-R5vyt;d0}V0!+YC-wyDr$RU`rZZXDqc3^e< z9u{9cn3)bYHnb!=WMT1@wr*R_4Qa-sxfSA-)lrM#83@#whlum`1Y^28gL?&L(LTwI z^iMtA&+o<WpZ<$HJt6rgA<#-Y5Gb%{DyGFWnuC;FSE2Qr%foC_cXob3(?IW3GK_#z zuOEaFWN1GgJs8FaMopP7+2e3#ev_%KA}&r5Q!4?QS1@u20f#uV1vIH`Fnu_gA3S`7 zCzE~*B$W_!61SlKj<S{5+MoGCWr0`_6n90C_>-!j@tcDuc8#XrRUN#Z=H<lO;BV5> z?Mdzie`9a@we2Zg+MBdGlNfDt`QbRmxEbtC&{XUA^0Ls}L8^!y3ri}AC3H&Rw8hCc zn;|9ms7^MWjl2HD{OsI7dU<OS5WRJ<5rj?MAJRrGX>QQ^`^)v(fi;?x`qRHcT~APZ z1`_TW^o%h$Tg*la4$1aPfJDDAS^k-2NQWlaY0VjNqntFLwOI^FS?bj`aQ6hQlcV}% z)TB9@RNUR$6an_VPr_fKzG^wa+{PKGAq;}n^7L$+cOhdifWS)a3ACwO@`p8Em}PXx zx1F3OJgpM#*?JuD@pBkwU5nldmQ|<o&%<2g>E3a`VpN&1kwiMI6AFf%8`UKKYdRXi zRwqAA#?fT&oPCk4VL3t2Y_0i9>W{ua5lbPp_7F%0H?D&}m67HXGMFp&F{mB+joJl7 z>kSeJ{>w*JBXKqzS!8s_Mb*}Nhis?cWtxNH%BbBK$tfH*{yN0LAw7U{PXOP<BAt6E zj+!lxiy$;rHm+z6)eE_;-&9VFa<U^lSzp)-A&}tl1VCeo-1T;K5>s`eOeWr5PO@xB z?V(Hxn+`kfSBby}8fr9oh$a2OI1g#I4RLS%4U(xMkB5AN#JWP~NRBPp+5tqaNsY9u zuJ$CYbig0`>rQVkFU?M$ovM__$A>fh9H(~etmyrnyp<!4E?4J}S`$1~JX9_#2j%$q z!kN>lakVlexQ)eWx2Z~u%c)*)z>pY(y?ml;nUthyS&=lzV5{{l)6Zs%`*p_k4Z;Xb z>s(tp2}M)%^O)blK@chsC**nxPHr1mgZvc;8B^@C<kft2C~S0>Z9uZr!Mhx2N5ygV zdrbWvht?JOM)Xw`?hFp9^frcWc4Us$(?p!yM$YDLyqy={s&1fwLTtOSwxmXBF1ss} z{993IwFGSbw?09KB7zz)17nWnhB_D|N(=0|eK5AV(K}R6%jNk;^7NS0QhIT5+!83^ z2{zXak3J}Coc0Z|V<{Sw`{;=dJBw^_gDPR!X0uop&$3!pZX&;_Qbxco8L_cX6IJ;> zOmkx>1~OB(R`(lc4rv-eHa&ZwN`ZX7oDC&Ne|!qD^_=z)05!-~k8>hC8x*=~Y3S19 zXEWM_<<;O*U1^dgrD3X~h|x&IBA8I$#Sv!ZEc*)!&VDN;g62}9cC}STSG5nh$o|-l zlyug*(nIzbZS#;u*E6os4Js@=w-Nmyq#)aM2!n{8Q$w04<tCp05e>NLCXqiyTonxZ z8faQ6-*2<vjrmAVrFb9=qrCy8h1=M%WHEBpV4(0T)0oB&*1Fv-yikgI|5!R>^3hg( zL-p#9V|(2_Z8mWNfn@NWvYj_fA#|32Nk*3f<2rFauX$*-R}6Wa$})n9zRkp*aRP|r z&_&43IZ;iv-JWEmXbS`}iI^roY??~z;<;1W5x~{%+qW;ymASXP_0&YPb$fa1%>2Cm ziBs|2I&{a-?p<QWO&4$VwX_yC3`lloCVy|zgaOHsl^{Hwc#&1so1g{-xwE02N3}NZ z0tuNaJ9ZD<I`ooLyOZWM-}&B~xNHrysQG&Q&3|3%l>0ff{d)pqb6bY$^?bLMrsyb? z*Y7C5%DohzAapMnPM~ckp+o^SgCowC2T+z<;3zHvkt+PvNk~6LZ<u>>nT4oJ$+<_! zR7ILoLf{>DjtLDd3FH-rOc2;T*Tc@imbOpRMKjUu({wp)>O8v63xCqKx<T(?-%CvK z$!yi4w~*Vfz~n=+a#Z;py4pB%pYPnG>7<bOeP2xGZAY$p_wu-04=&H#uV1X!MUY5p zV<HkbR<CLu(5}d6tGwb9vvGQXV({h`<vP9R%0||@GGF_gT4_dBTBigow`A^RW?j8e znfu;gJ(>n2$B3>cJApR32Rd)$O0)xbH$kV?pLsb``6tu{4Nb16yFJ>;izyvdWT^~0 zll&?}+!0;#5GmB#*oCz#T#2?7bj5PI4$R?n5eDa1qPckYc}_t*rLIUT$+&UBLqa4T z$<KW@FQ!RN7U;o6{)b^Nepr^W;nDZxgCh){dKtuaXv7o5T-caa`LzAVoCd~xS3Yj7 zKO}Aqw&OldyTB$v@c-4ygb{zzSGWl6Rusewx$|#}+YG<f>upjsF0k{jpX3xdKoJ~f z{J5c~sJ|B}iN5eE^Qk*}Q(n*rP2#vOX+Wk`>STLv@iTH+TRs3x9g+{`^T(5Fs14^h zoeNPMv}?`sHOcTu-JQ87)*47%$QSKe7qfUG_kCT|e>C@cpo?JAultp6<j?<6Bc!-> zjc%#KD{=}$0o<X99LG&unftz#YGQBU_z@~lJM|sbl~r&5F47^<9TRoE0E+{r^7&}V z@<BCSzf8;r{K~eKY9|(y$^{=g)T!2q7B;E<uO_GC=M+jZGPsWDF9q?FCa*dj63kB3 z=W!(4cC9t6$*q+h8hh|nk!2i7K+#4`A1TKnengWZ`W?-yy}DM`sp2#3X^6$8WS5rc z<9b9=s%@=~;+Rq{l1i;b`VhNyMgErs!i{oBZFMRKEA~9XOckw7KFSsa<XqDOL6F<1 z8_)5TTBn{}vbCbt6^_H_O8O@#rvrMrkyyrJPONPFu86=Zs1Av`u+^r?j(oXgEtXsb zwykBUz;#58^dfJ!=C5G`<m-H=pL??QcH^zRj&cP`Y_u2f)H-ELl>9m!)%t8bB4l-P znzSJH#8etC#_OTK7d`YR_()w3wN#R=e_UE9MqO5Qg?+62b(A|>>;B*9p35`}FU~|= z^E^At&I$@G$-0}Sre}f#m+j6#qV7piMV0a}V}x_U$Pq-c<aqF|l>dqcZ%%~Cpx1`? z1RC;BTDxT3EQ{e9!J_&CxRSwgSeCP%OKV2Yh~s6FR>iB_NSH4-mlE-W1#=UpBk!W6 z)uf~xpG21pRa#<56Hlv4wh08K9chBx%wdBTebhb5tmiouo)2P206}@ocE7PPZ<*!@ zvbY^~h{2oDqg@YcS7*tH1^|=TYgF+=4SIGR{BdhBgI1=)3WqBdc0w!XDhXP%vxUDR zP5o{#6n1=_X2a?$aG_~7M!&(-dm)ioay^s0<v+!h$xm{CUu7lJxXyy@Qi78z6la52 z>QR^sGGA7=jc>o)x9ee8LHmVQ<6sRHJgoq3MVt6mNouWwwm9E&8m`ZFmvA`S)1d$P zIXrW4CSJE`pz<+=V!?a$dO>-wg2GFK#5v5IITmkpU6)xJX2n-u?@;(HRT07x2XLV# zo2iP^!{<VqoTbXqmOOizL{>Z_@$}$9Z)pZffn|boiqB|I<kv@e5s#?{+It2`?<^01 z$6=e4LDI@3I8<FpE+k%wXT@EEt8B8Uby+VA2<IIdqc1Zkj)bVS$Y52ebw1!3c}$DY zwNC=k-xWMxA>IW%@v4}pC~9m2h;Ss@Pc5}Bt@G0AJ2Jq+xT0w<Pt*lt_Fy}^(9~TG zL3uU%a5&k2RuygWbd7FStya^UNPcIGr?g}>h~@PdxuVwoDlklCFQuZO6b+^S)^e`1 z6@=kLucF>mHk8DuUy)zsDGG)%=)XbpkoNF&A@`Po*M-?3`sQ5j>3r@jEaUZ3(%>KE zB2ry2$>7WbU0CCeWaB7Z@C%gVDj`%_8)N+%bWr6&c2?3LXtgOcYLDI-?5v*m1bisK zFG;DJ3@w>_+5S$dw6R4ld681>(IQ4+{d#)JHB6El88SE@G;c^IWC=%3YH_UV;*$)g z{{T;2$JxM%CJrlWdt)63^rzho+D$&%&0DcfQ_DApSw{oh-KC*Y-Ka8KuE31CZctZP z(iW*@icst0=f$N&3BMI(%k82q#Hnpa<J5L4PK|+JAayImg~=RMtnM^O#8HmVM`tG3 zH3!3#tdpB>yLFe1q?>Qs{gOcY^i++AuNk&1skKM~SoEePwU!xh`~s9wLJcZQJFqlz z2U;lePOZ-y5GFT5NbjxcKR<v=+$yM89r_MXSf+v$90|@E911^SbW(o<eMYMhbU;>v z0Ce-J7Z4lDR>*Z}fe*;~R>&LlF(?m-|DM+cH3-r}DX`)YQ>n+G%j_Jvjbd%tEbJ71 zId6EREa>R`v)%wGV<=B6a+Z7t=P5gm4D)q|1j?uO!8IaTT*ZB_$&X+xQNc@BSm0~Q z63(oaVnptaDT>9j=+&TDW+c`m4U%my8IYIPhe83QtMk>J-(e`0t6{`yYdRuAYmJJ{ z0{?<36Um^~%u6+C4y&cAy+ex;BMt&Zyg^3}V;dF~7Lgvr0<8^k11>(S3Pn$&M|30# zip9`Z4WT2tDqM~3<LDNB#zCYl{e|9+wX7m95n1hfX(!deUVi4`EBI`nke4x1R=+JA zWYTGs18eWVpb*i(Q2}%eCK(>l{ZEMiLi2>R*r25-o9ectp`jS;;gG%|v$g7N%SEp< z;|^DsP!(aS@NRIKMGbu8_}oTlK$n*Ze9|<4Y(~fi=H0Mz69TG|^|~OM293^e<#5Bq zjvM*K>%``VM^QZ?>#S~ImYJ;Q&;Ld4_;LEB-mj8UnSWIM#oB%6a4f0EP7(|0<*gZp zw>500lZsIZa~`SBjAphSB3M_~N@IwrweE>YB)^Ez;(3<f?$;pJk%AV*k*rVa=ucF9 zS%uIeTBV{WY}uq@zix;X*19FZ%EPZZnRSQtp!sgEj%@92<iL^Yzh5|WGY7e1CwdcX z*9kZ_5r^N+uZU@TMSe|bJ#qRgiffCL)a5^+Q71p6(HI9AG&+!5+>=ObFjtS!@aTYD zI37xdfze?|7>uYKr`HcdoIhW#4-9fwIxvOma8|ZL&wg^2J=V@H?T9t2c%xdzN$Dwq zYLy6GT!?)>N}uqk0P>g$gZ^GxZx}|O(GjWR6v=IX33Ro#xV9k5G{I1>oJ;3jK@eMy zsM4BWTbLA#^w-8u$A*={wgRj|2r1pJ(|BU11sLeL#bKtDJT?P%^t6D->uo6Fo+VNY zFR})`EO+Gm%ZQ^U*9okFWi8cL9Kh;$k$oJ{apo#J;`XOvr#*SWedEM-@@?WEk<m2u zE!I(aB;anw>=^72Cj1f@0^Q1bRg8NkTax}r3XoVnrlRGP{~mogqqr;yo-+02ikrYf z#ay=(qfx3#K`L;9{{f^rnaVm<N*QBDy)BI+SL>O>hLQQ|Gx{pupyKGY`j+a~pZ+cK z^YCrpARWH=AZQvf%gtAJk0jkKPZ-KO6?7wN5wu*!hW*$pSeq6uMzAGZ7@3ThA=$$u zGr88TH8;Xs#FTevwm0@5`WS6_Hf?nwottWGx)eZ0q9t1`nRV-tv9>{9A>nLr@iNob zL`N$Hg=h~{9-PcX;yZ@xD^%kT!hhVBzu*GaBk%dr+%RFqyVWpJ2nEl}7_%mbmknSQ zxD8ebL9`F~=Q5=^3COPyiQs%3X4Aju93~`b`(al?OD*i}G>soXRs=TE2Hlf{g7Q?R z&PR@sYEyF=;9N!_vBm8JDL7kvp0-vvma4uFrLBc$&`$Ukz@ynTUf{!eJ0fNn2Z{3l z+=u_Ys2rNN9stKDjEU4oqc17Yc2RR8RNc+7ry4FvqC;5kP*?O40)LO55r#&l@=XYG z2>AYNeH=oRUr#>L^|WV2s?cwepLHj&gP{l#CDbT7np-^M!IA0%5!#XT7tPmR9QF4` zLjV=X0O=0rm|<^(qwmNqZc_!rqniYt#r4|H2@n7|Ta^txo;`=x`8BcExmdk3SZlSv z6)W8?EbY`0?i5GE*{B#oF=W5AI}*DHxxlczKA+z#GH>Zh;}+!sP_5Ix62BPT4gkXP z_V;ri)qstT2~fSAlUkutX~t(g^hv>S6$e_>)<<Y5-d=VFXW>%!$xF8koE)MY+;&s- z$1Eog+<jz^X8gVruVtU3!SX;VJ@3#h+@)9Ek*-3JneIE(Z22erl%HYGw0%Rj)MLkV zXYlUyL-Aq!k488B6C&^DSNV?=(?qv3;V7+bv8M_goBt8%rmQJHRdo1!nkXXZx$W{U zEBlYLM35ZfDe^#||0c;Nl}~~i_#fXuPwpvF1$E@eD)9tqBoMfGIHZx_fsii3h(jg` z<(5d2M(D8~U*WNkJt91|D!CZaNQ8^jBMotV^l#`^^(7CU@<vYt#X_aftc4{|h>0nn ze}SEdupByg$ALHVet2ZEl~?tre}y{-_*KqOXjT|yE7xgmfaf~3c_|Q1He2EfXg=nd zE;-YrRe4my_GR<|X%`!Uoi6>{mgvh1loq7NFk6X_l}4(4@t!)d(ZKAZ+Ol|JOJ(%= z{Pw{vcHnt%_~H8xhAlWn0n#m0gm=t8uC$0~RHA1&jtU|YbRrksuA}ETg3xTx1=EjN zO$i8A=6>@uP~_g1H4Us|K-7CM$0$YNrhK*UpbY;<h;Y1+#)(bxy#J`R4$N^*1U*xG zmA1e1i-vLny<u@R@D0E+Yvm%ay5^4fky0)?=|{XELq0#=3n29)7UM^%ZKSr?OCpQs z^LLr7R$Iz~UUZt)5H{V^=@c?BiVd{Tw4fOPf546ZDganGA>O0I_9=E=?rrEk#AIwN z?Y*E-<Y!b8=;%G4qt*1P-zx~#WL`%&s7w!Ri3VX)ui|O`af6y@`{%j!7ix=un`<5b zA^q6cu~Z}wDr?q1$giTnaX{Qn)HWEa5;2_J0z4LK9I!X|FBiOUn&oo>F@OfYi^|>O zrP?O{vN7D3(wv86(Z+U_%HI+-y<WB6L2uj~HUvM*W}~wg>Xw@7E02(Hj!;O#0L9W} zhO{kgN^^Kp3r;YQACRStMcb8my^jk=C*iws#=7aVOGA;sjhokleV>li?ON|}Ton<A z@ox2~q};upVS=j~)V`oeAAN(X%~<fKT>DEw-rS(nhp?|@&29Y11JqORsncbpXdo2O z8%BdCIS4oqgdN~b*h8SVEYbkewP~VN1E~T)9|8fDL%t6im9<)eJI@wnsJYc^q-x6` z?wJBwp((Rb8I-z39QO@{c%!lwh)ZjAI5S=Wh%yRIYXW2WVFs5KbH&K8->WS(2C`{M zeXQ^S@{p6<NqDQZoK>*8y`T!s{}Zl7qA6s2xHyL&m4F(Fi&GcbT2(1i1Ff+-`z@Us z)#HS(QXOi<EKD|oUW4=x0=)&x(hZ1~*J{~9cKXGLk=llZ_9-QYuNj(raFY+11{?|F zO@Cs7?wJr%7Ee<NaEbILau1xtVsiZIK%QHHtQ-D`G*`Vjq=b*LlRP5|a8u^@iH3Mo zz?IVE=-mRw%|g4k=}0{eCL(d9=mt)cH6M5B*2`6tRh-oQCL$q3ej$Yy!itRO?3vXF zFVCIo=*h~qRBRc#<?cbw_r})(8tgl9@)G-l>c+rb@f~4Ba((db_@Wo;SN5GeF|_UE zsIT6X4hOBNhpMq`CLRu^f$-a+GBl>LLjw{VKd?*P3al0e3S$j17K{?NK=QD{UrroO z5U-=z<VZ$&vxYf~HFD|jMbC@%`ll6HoNGZG)$C}SSOYL2Lr#ntZ<Tt*)QDxy@k%r~ z9%9`je0k=_GpOQS4N>^cvI}O|T@PA#F6&&?E7l74vd1$kHUg0E^0B~LK4CcSR(?+s zw%s~f|I)E^zPbX@z<8#Hb4YNEbW`bO>*ewByF7=-$2Ff*8ZbT{zEc_H2FypR1Lb~L zkO6q&Z2DaF&N^iy){{s<G%oDJTlLAkapV1gxZ#!2tx|Z|O5W&QE9s_LabUih<%6v< zuUvrO&qe1s561b9(-`#^loOQ<Ip&8Ubxy_BX43Fn%NUX0Gn$N^(@RS#w9KhiWcG*2 zWKpJRI!FfU=}0JdS1*)1<bv<ZZ)TZvy?-oK0Rd9(DblUq0e%%J3E(3n2x4+HWtv=4 z{wb+{kZr`6ol^P0R7kO|C=)Fir1OhR-)E`90vS;l3)7R8AjF9Vpk2FfU1181>2~x5 zJ>Jxni;&jM>WW1XSWk)BEorQ}F4K($;HAbB*`q`i-JS2}fKG(TSC?&*2{+4BE9DlC zi$n(QGCX?NPShX~1djtYD|=8iA48g^CoClM4!uYEWeye%2_EAaU)ghhC|IrV>0BGn zxVZ*4WHhMuCZe!UgCx9mm;|@8k_fUd0NTfaO91El=~$3@CF-FM3b2tFFT6@2FvcB{ zbQALs?a^yn^gtt=<>&+x#{B8+g12nva#PC2r_FmsQE@%=XP};WB_(^J-YLvK&Pjkd zngoOmRTVf%%(XtPP%eb6Ko0Xc4FREM7j<QL^qiw7aajZT)L}j)npSx<cm59XBIqHQ zD7-VvQl%aj=&CIDKjdfl0D}^UDnl8@g*wgIc#^w&sO~t2lJPdi14Mq)1?k<>8EL`5 zsf<*&7zTj=B09t*LL!26t+{e|js)%L*wsfg(bpdVG=Y_UKu4EUSX*aeNn!EqC~4_( zJbbjL;!%xWr!j0AKBD<Gd^~ig22avmj{I0X4jn>^m+VHV|9X@!>k2_!uMYNJeWjsP zf=IG>$fag>ZSiqf*AA+XgdQCeZi)Uxnz@mB6TPvq!EU;pInrPMNNl^zf!4IIWl3Up zv8RVM?QN`Y*G{Q@y&aU@#rp2i)K(XCUd;)t4k`s7jj0p}#w8IcGg}zrdYCB;lS|~y z10&(Wn!+{*AUev$2#XY5lLuTYf<t=q-PB$!otwICuZ_dOLYxm9eYQlx^FZF(FGd(J z837wxYMq?QK*t5ttZhKU={Hcto5yVpp1gDOBwyhhV>8jjX<2<9&=3aIOY}}=m>crZ zQ}lb1s{E&ER^(^W_F4|;J=5VS&#N%y1On(47C37<fv5=xTm<bcU<8@rq(waD4s%UX zI58;%k{W^wqY|wpOh07?8As5wg)giu7!+m*r-#Y}S$d+JtfI0-IEkzGyAr;=FJj`4 zeI#rw&XX+a*)EG`Y{6hDVN@PbvVf-Tl+*qT4#I<@{Jbca-d<@`WhF)&uzy!#7v0AT zXqu*jjdLhE%dHavJ^$vaH>H92>B5Yx*FR**4_Jb8f|T5?k@!umGzUwol>{HHvB3f( z`67BR_dLOQP7}D+L*}2jabD<KTai7BDfQpzEv2$;#+%;s-L!R&sOi=hS~SVE?Mw7F z;S6=8e>{`h&#%(LooNhPo&u>w3=~oZ2v3$!l1!C@Y3yINLOj(b<JUAcFP`Bd+q9T` zWAh?t1REI`$X+bd7{8d27|V=Bn851xGUrp3rHm&rnUOkmwU5cCO1jiOA9IluscU_V zwTl%**Z7zRNRhVQ$9?|FwaTO#e`SrY5S4X(as^Y`4N9r1Z}t0bS$h!2&tKy!o3s;g zd}W;tf;VYDV*2$O^0nTao7(Ev`4C+m$W0CArncG4M+Vnha#P!VmyaUJ5BV66^3L4U zE+6yt-MOh-eSBjAH!?T9G=UrKxh*$!yC2w?o4O-6^)esRDn55-Zt5<#WOHtcaI!tV zMe{;S_U5Mcxg}e2Q+Ma4_WLdkz9%>J3LkIHO&!Qh4f}Y&ojsVFI;2x5-D~KGc;3Cy zyFiHQZO0=xp6rH`-VcfyxG;YKYBWm#MH+w;*x{v}$uiD*PKc37X*~MVzhGCOO{X~! zJu2oFKmy|mQ<WvTV(PeOh(p_DnakRXZb6%1&m2IB;MN>)%JUp>YQ=`AILH~aDa6KM zSEMS7oox@#otc}zG{*|k_weQDWtuyhdqkSW^D7$HHBE9;=4cmf#mmnl9VE03tJe{| zH>3|}*;J@VR;A4AezS>)$aXlRnP{U)QK4MHdT5z-ZFbpW-F{f2Uj23P6Wy1Mpz>=J zbW7%vd~VH2Q)i@4R6AnTV;+{sswYk8Np48kde9r8<C1}hFa(Ur#r3aeFoNs@b99h8 zPbgHKsccKwlxO+nQm*NHKwo13-Z2J{1nZIt6T=eDS8Wt{rcff95Wb=PD5L*D^R55X ziU7XWVpBg^O_zry0RJ=H`g0Y70=T?b#N=g{I38v}W=-+wV<Y!Ga4?9tJupy5@x`Od zPBE5$#dM=Ds_^hVc9ri&+x0DLWK9G4Qr*x%_Va44upV+s{%gxqt@#@W%f`HLZNqSy z5+@Pq4V;Q*gxR2h29)(>am(90-^sTx>)ZS*o9Bjx?=<ze;Y*SWEE8yRbG`&mRO#u1 zSR`?q(`2r}<`=dJy>ziPw{W|TXB6Ryi_W{5x7Ai!jG0PjkCA>WwOb$wQz)HLSFzzz zYwpeJkA<3|_rJ3&ij0iZoGfM@B9!^@$#V-0JrW4qBdr|}C2@By%lIvaZLOr2B7Na1 zAHR<G-jM-j^BmOsSg{Ri9@W3;H#Ld%K}sY>$W<6SzT^+aCiIOw)x@BqGS{BXe6_Ek zqhn)d$vyufzZrM+yMJ>N-~93K^i4LYf05sm77uv8`!~1n&7b%V-#q=|`zbl|MSb%o zzWLto^v&je7J0!qbTbF3bj++k7G{1kmJ<7=Hds4Fp3@9CgptC&)$4idyAJqf9(unT zr76e;U96L>HV^vr`Kt|pC_hc$`+U5+P9MGlhN&+f{SHu=6BI;w^e2qgHw*>Iz}c*c z+tX;&I~6GrKoQtTiIXua6*R3eR-#0Z7dzvGNG<bOk?h2+WD3zlQg!X;)nZGjkWl3s z?8hM0FgK_(ZMK@94&DGKfdDXI8o7;9Z9;3I2Wn{`Z<1;-LG=WyP)fS+dVGy4B1JWX zrHwxZSgt}f-o>q7Nr#ifLA{0Qbq(!oq>E{jMdI}{q-C&6SvA^dN`HYSJqSj$3PL4x zMIFK1hBU}YSQnsvf{|vb7~TVm)_Yj#!-99TI4^SNWuC;$e1WB6cuG_U?$wEXKrppz z$`HHtb;vmK7d!s+_2q%r#f<aygAVsQH7)mX=v!GUOUh@bPftuPg|uj@L4SlOl#d)d zQhw=6cQxLKD;p|5Hh&Ql$`ZOAHrx5BDU7I(PY}tb+zM0Jf!TG$!Q6F6i|Rd0tdLZu z$&1<<iq$JgmbI|ZQVn9eCz+WMRCf*S8Y&;Y(9k{B`rtrw@Wd3x7<_BzW>2%X6H9*P zlNNg!Eh$e=ovm-6p^wLH&+Of#tI;n2!sxFV$ibD7_<>QUw&H$+<&mJm209^hia<$h zA1ZFw>79DxJ{5;me37D7dJ@Y(Bm-OQh^rOue}t8-m9YTpkj|=c@+3*a!V?KM{;V+6 zmO9v}%)F)c4k8;{+pa5AH#T5vNO9Hpc8ar_VkvcaoRchdcqF9`lX0xNFf}7cfOxT? z1qR8om=hwXvO8GP)WfA*zYsJDBFNAYvdRrSFiT<ukZx-X%)7RhA7?canFB$UonQ<O zZbi<aIlo;XwJ%MYEk^TfzO0(^(~W8CRh!eG-W%vjnCVpwNFzjj<EsLoMfI2*tpkv) zB1(;tNsJpQ#6;v%i2Z#N#J-+F>|25ua}h0QHlHgAOs1!czbdoJ@aQK5r^Sz00SZ91 zNfU?;kN&U?pf=4QcSp}jTjM}d{U>a`K~zT`w{cVQKTl%50p?D2f%?NovFXh9Its}b zE1!rjDqy)Nim~uHksH~ApfgDE#U#|2Jn85M78H3bfBx0PEZycLwwcju9eJK`T)Wjm z=HM<I*h+ArjKPu2A`YL2C;XI--$y}2NB>wBGsjpJt*sgs!nl4wL-rm$tq6kX!zw<a z;)5zSX&9Yx_$N69AvD6Z!qmCoX?a+;?Ie8U%JD`6jKB0X4SJb3bMc^SHRUFTy&ECF zo6RVN0=;ZWQEieH<M$_Np8sS3lt^n@f0+YD7b%f373@7+620vwVNT3=4hWo!#{}@< z(fc(*O9XF2$Niufgn{mi!pG0=1eMU_2x6>y@}YX!xXD8^=_V(S@z|sMf(^S^-G4tq zwTx^Jg|U%MksT#j6$nX8BNe73dC$x0HXfWXxXbW|u}E=hq<SNBP74d?v`G}12mC~N zhFq8zd4`~k*64#8B#*_t^gN8uS9J7lio|zofA0r)vQ`3km7s1l%|khX|3O2th8MLL zXe*(`E3j8<xoa`Mq0lr83C5+vAo8UlndC>B^JEyrV=?#+<rc|^&A<R)UvVs+HRlkw zXI?2?B4lG}r8x=hkVj=%TcI$th!_(~du%1vtPM7hrbDTJq(t-dGs?(-PMbgt(M`4u zaVrCr2-2uVTO`5pDdDyry;PSZj841UL6F0f+FOPg`}7786p)N#UZmjL`SZsJK9p8b zs_u(p&5aDRr!I!YFr>c8M2yXaR6^tB0hY;5ko;zEVh$P{F@LM}%QYI78YdAk&KcgG z3HKiqC_h7ogUaYB{$-s$O_2noSp65vtQE=8)I_jr?U<%mM|xqpU62n{TPx+{?w24* z3h2fOn>;_sxBVw9Nuhr~Cx8JM1?&Kl@v(`pE@HLXDhtX?F_#2xkqzxW51Qv88gz)) z5;&Q8@#3RPS{CVepe$gwR@kQ!o;DE?%0sNKxtbl>@xt3v)78!`l^y)Qu(XBALIas- zAL5^8`_sIjDH~QIZ!Z@&{TvVV2~?s{qIK)?eQXPk7q1aaG{w?j3MPR|lgdacu{+Q; z_7MYK9EVd8prb(o2Xse0jo{~sM;l;YC0e#kt$Y>lUq#54Kk0`0ETU=6bA1eBha$Yv zrfCFI#yi5vQhz*ZG>s-)h7D?U&AOBa?}~Xam&2AAaJ{=kM!6uC$}lsOAvjMmv*m*7 z>Jt}(B{2~TN2@J#jD8hESkEQC?NLcaz{bHQ()I^DbW=J45VL*|wF~~zBwmcM35<HF z-sw;OrUP&bC$#SgV=Iu39GDqs8O~2Rtc|L=V$HRB&oFCbPD|=l2-(FsiNvSpv`;0W z_^0qElbkqMU8Ws>Hk6oi)8v7XJP*uDsfvLyJC^Ag8kY1o;<$N+c8!Vbsq(S0?diZe z?P_&hmg{5tOdo8Zjbf?77?h#}&xB$o-1L+g860=O0m2C1d`8+H)Vn3J#m);g>ZZgm zf`N3yCP7b;x;3zAsFZ!;)_Rj$;XcdR_aumF$~GWmI#kDKbV^Us<}xbCL1F4ZFf>|e zEa)8OhlG+e+z7F>q2nSgcgLh<qC7sH;p^k$Qid*|YhBPDxmOY$ST|(w>{7LLOJ(og zEfvkry*j|;YU_qH-MV5Ey<2nE>in~G#_r8{#0ef(ltvTW4)Xk+f?GR}=L+lc>kDkF z*{CX$<2h#95=9!uJEg|=@U{S8To=!?NXq~NH?cfC{>)d;RPI81W(X<;3*`O>DR@CD zZ?U>Jv;K2jBQ@UO!$&F_w>N%VKE`N*_~<frW%N<+uP_pamBi6aTUgJ+vUKMZWa7U` z5OEZrVj~l#rBI6?e=ZYP5q&>*Ur~pT)_SkcSFdlF3^rifwKC?o#FP#Qu~KRWb;~WW z9MC{Q#ymdv(v-*@h*h&xF9T`-hi8FfiHAADj*}2T;3&__xMfo?(!m!zsbmJtKnyOQ z5HE?CZUHg|q5ZUS>ncr33}zmwuFCYqx&Yo$ww}z&`Evb-z<~D%|0F^tLYG5VTH}YC zu<eaJcUaI&bT+M$Z*>k&Vp1FJ@zM=LLugZqbOI?~47^RY{S@hdR}jKEfTUFSWH9Mq z8ugu|-H;p|gW;BdXNJc3xct`R<II^iQu!4f3y9LxE8*3{>XjPCu5*pEr``|mKBpO@ zKc27S#@oS1#tt7_iXNO+aA49G5m1XXC>tqJ3Tg%_Be(z?e9H4qOZ@RME&fj{l3si_ zJo-K>qINq4M-Pe}onzJ!kapz!|MEA^AGa4MtkmNeBz4HBp5?Si_~~b*+Q_Ac&nWMh z3kjy5_3L0DzC5s3Q~gi<dPpG44ebJEhaU*4{1frH6<;=8Ic}}A{&t@YnDN`RaeKUz z7@D%6Kpk^TBC2KI7(>NLY8UTQB(iD;ggi+b5$$*yr`qwkJ|@}<t6}qq;`t+wo!_5- zR9)%F?WHRJ(;?R!*Mn%?I`It#GnTHM2|e))X;H1##IfG39_V;@2D=rzZB0(^Jv4C^ znv}@eO}S-ulzB2+Q<8Cou%ob0Y;Nh&<I@qjX{P2yyOd6`(Z;r;e2@<`rmSH>jw+tL zfQX7^O|q%XbY3ElQb?q9nk6dJ{6^ECjAf)@Wz9+X357&W$cU4KdSKO~md1wYqizaI zRcxvY(b;}SeW^d4fsS^LYHa&eK@tO*o&=DT2Sm&1TbxQ!4Gw=y<;Q1F12*IzOqANx z-4@17|CNvWiue9M1o4$);sB$tCTI!Nxugu=NiRhn$-_~Hbbv>8Trk37IyI4x*ab@i z+Bi5Plh7XjiF%1T9pz{F4J!zQVDyIAK8U;_;mDk6VWSS-kxe=n)=fe<ooeuEIR@lB zFr6eZ$F>G88jz1nzS%e(j2uo)=z#rTjanJ>k|s&<gY=@-F+F#YMMX%?AuQmh>4|mN zT0hd&<e9|ostv(rkfSd^U3g-@9vh+i!SL7_43AP~Yegojm1F{gIINXUF_UU71c#AS z%ze~K;aXwtiYz2jm>*MTUqL;&HHyP5;eI9>3}>_~RHb5D{<`AzP9xLFl8jaP7Vj%Z zye13wO2s1j#<gOPg_VWQLbZQ+V5Orc$y;X41N<s~PZ2nY#4l(#E7jzdfNTb76}imB zQw#&z4aJ1w+sG)3=BIqhGd4I3kA5(=h6SNk`_jKsJOK=V1%zV=xY$88ciy*%Ezs%H zI>px!OT)yxE9xkyd3=*4QeXDRZ8H;NaHCWsA)%Zmjp8v?L|Bq7pQ7--CB>dD<hglV z9USZ!VF6{D8ue<Hjp~XE^9xw(SqUOTM{PwzMrj0Pg@1j30jwT=AgnAwcf3?j)Rinh z#~h~>C|gKCi|s{*ZkR)G!9Wv(10yxI6r)cH#ePY}rzqG0Z!5#(9OLj<j^3kNAJdUF z??^|svFz6kYj9HNNMv29T%5K`0KyR4>T1Qg%0l#Uo~*SI<u1{=R+yP<miK>-2i_yJ z+(b=myHzM5^UMCFRCJ0lRbqhaKvSU~d-`r}K)dB<QHp~=tS-~+;UslL<imn)5C&W5 z9kH|vZU&DUL#W`*JUAJfr==CLyl~aSbIR#tvTw=t&@seztLm4iKKf+=<~KRIiiH9t zBlk)5)+QACBbVhGY)(z;EVj~wHl&>qDQx3sb@nk1Xs#v)#yS*Pa5!Em?0F!`6R(~p z7YCYL%pHW4^L>_YxX)w~(uT`A0*USOlOb>af%ye-E%0Y56H-AEwTq`J#2{kX!^MJ> z05>d?ICbtc*oCY05?(m$zNahIJz2+KV)ZC5qzQ@3h$k1c&Y>=UXt7#I0y*L^8!*XM zdz<M~gMoLIPn0FWA!JKk&VJA`sV$;DEr9bw6jtncnP0WH5sma%3TR;s;}|H{8V&$7 z0DLMTVUlXmY8n}p^Z+xe4IIRb$~mKeX@q3g$ecV2V%EeCsMw^MM0lmY`I6eLhQOM( zHncYw*q7r=;GGQVS3y6S&wneaRohW7Q|sWiWuvy=ORbU3gl1y>)D(iVU#c7LRPlQ> z)o~42lsGD@*rZ~MiknnyR-s6PKx*El*M3rkr;uF$H>+k-o{#8;jE*5tT*j~Hqq^qI zo-!0z8xD%mn{?MkVNsMw6D|669oc12hpvwtE&eXvI3+)U%zk2kt@sL9mfJ~u_^R$= zZ&!CQ{jasVt+&0mt^3;EuHH30E4y2`+tuAlba^XJx3cw3TTgd)srNv4Ki96Z4URBl zn#fVGi4rv_K`YjdGZ~q7wZ4O=PakIYne4cvcu8*>t$31tn72%I$_)Dy%54?OaXrK^ zpnpz$8<3>V?IZO}FW8Ws50Z4`Q%rSc_E{{h(?h3+%1AFz0mRwL<m|%IU|kpt`<da} zv3x&I`bnqkirtza1!QGD{TkvPsXXGls+DBtY|e^mfHI1$Y3{TVQle<grLQ0n@w`?* zATB0WvbbH_%e#km@5Ws}HT~qSTW)>Ht#?jO$RnS=oVh&~-yR$)AH$$E-9XM@qO({U zB*&ksJMZIY1?ZRel}c-!A`le2>h#39GO)@Hk+qvf2xNOdL5fhRL0XQ6$$naKvGj{& zqx4M>kT~239W(Ou%etT1R0RyFQf!AM1?fUYElS{27r>#DZ__OBgz_Ag&pWZeb)HM3 zS(*uuX7ulhRM-yJy^i?-m)g7xekze$He_;yZ}x$zkw_<AC<>E@<>uh0`O3db2vT=G z()lEBq<<o-`}tK)P&7>*O&bT86I8B<Q#cu6$RV8Eai>shT_Jx0!7e;Nba}W!EIC&~ zbh$&zkK#wRhrW68Rqy>5#W8O$*E1Y5;!EU%Y=7Y3v3rK^Id)I=x`7iX2eyxTJ?P1) zp>19=I&fn9$-&XVhRL3q>K>)@sp!H==0mBW?x;kUF#S~;1VMmCdIl($xrm6GSnsge z=`mPU$P6e(R;aE!qNOE9%1QFV*Kuuxl$As=v%QH-MZs|2BFZXEVt?#&6SHUIr6}x^ z?OLK*yXOxRCC0K4F<T#f5#QRXB$z6x{Lh62mWog`Bo+0_V!lPQta(g^n%_-<M$_u@ zo<df$KpRMbc3T~2z(+)~2`rM_@c|TTH#oMSxdDwa2JFWpm5{tq3J4%vfm|vm!B=6y z;&I<pU-=<sgudcwv<0{MLqkc3LE1wJfYPiqFDn0y0w#jA(GU&7IZjYEbk<N?!;<)i zn`*ZnbvCR*?ybfaDOw5R$e+J8cl<4cn_D!*y!B=W9Vi5ZiDnF<5^R286Q^1Oh2F!Z z{Nh8IPg!YOaJb0u=*t{L;uvqx5MZkY40%MHyV?+3!bNIYr+@grl?8O~4WS{d6T0Og z#a}rq*A>zz)}<`OheoO^Vpm3GhY)8{_@F;vZcD;T__wl$V(~TsAd`~^381o5pJ#4J zHa71Bs<er9I9$iK-xlk11T!l#1oVDHbK!V6cCg47sGEUz%t$I})K=oHsEjdz!gAc_ zHT+VIbD%jnKwhytk}ro;b&;>J%IeA^VW~l7$3bx!md1aHPDfwVJZ+Q37am`abRoGw zG+!l;>hy&WXyMqho$5$iFg7U0B2sUn-%%B<H0B)3j?_ugDusRoAvW%<MXKNC*>9_N zGKA*}eTCM-jbs|{ZRy1odm~f&ra~~XT#4w*^;WyGH*peGZ0ZvY>*ydwt#t6!2VWhe zPxUuMlBg*eo|X<q^jY;sZ4|Mw*oV^D+u7UhJ8ZdwW$r4u>L+=_e<e!Ak4tK;%u|3b zsA9-tpg4g#OQdePSq>&yH$1;IS%NkCE?wdIJ9y#zT9Wn=QI!Pc91&p(sTz|+&P?6# z{52rq4|9J?#HkqX@_m4BGh|2kC&WhlqmKSb#U&N@sW?mlPd=k#>q~Qj&1-eqNR_R= zu7c|XcZgYju_)zxMZP8PyD12G+tX@4|9X9B6LY5BFx$FhyEdMg^4OVC*guxeQ1Gg* zbIBP4gqVtff-wobgy65a&a4B>Irru&Bvy*T4eABmWR6v@U-r|ujO`>}MqE(^8PL>m z=MSjy`lM#W6`iMDDDsv_vp`gNI|c2OtHeZ)F2I%-D<UPsqi2LIqA?+7=&*;_0}aA( zou_}0HKaVm6QE8IZE%kW75G0aG1a;YM~87$<kas8t*~x!iAo?^>*K^=t<|@M#9+<t z-jKnGkVwRQ?+PQY?CgvdiL=m9D*iZds>Jyk!g0Dtc>>`^X~gWSnkWyDmd~47?Ff5W z4I-z;>pBr(qv`pXAemMR<;^3{=TAD%%s2n}g%@4`iQg=&d_QoD{#Zp>r>0AQBImXL zc=V=q>=ny<bku~uKgo-mQv7Z0Ev&%8xgINKKi13!)YV|=ud+aqMctSIS~Y_K1_Xu~ z3YjfbB1r1ki<Xcgb&P1qlCe%7<LE)6?DlbcZkp>}pvYs42TK{L|0uggJj-V%>4E=B zl%jKLRAmiQK}l><<Z-xP7+kDYdm$DMT0p*&?dq|5DjPe<!oc$_9NDC@F)ITll2kUD zP{d^-@`Q*?pYn8wE`&tk#saAddcw}XF`5s?1&<z2uMBy+xy>#st8y1sYl9Tk+9&f8 zHR(-KBXK48mRD+LllTGOWgnC1?;JkHGwf-S&yi$=hRz^a@GkK;*Z6t1GYPe^L{kKS z=(6Dl%OejSD<8P${`<?v?mK+6{P4)|g9jdd;NZxygTrM6?E4-Ze!2HW$V~Z=lwx3T zW23=FKo{MtY@$Fe;@e>(BS0<6L+PlB2A@J9V*OmORzQgCSoqj7cqr@5{)A3oy&1?h zXAEI_mSrq;US3c7O%k?iX->#=VH=BRVRWb1Zj#R-Q<n*lBcj66xUP$H)<R`$4GR{v zh9ZPtY~`rd5l?RRvRqQTZ`5sxBC!~t&i$@#NU~8f`pV-6&MidGa;erkmih7+S?DW| z$5yynZ&Z&A6;*{IMDJBy3jBadU#~CJ$*4MZyTG%7>ym-5C6sInw%#5lE7o4jbPAqD zSXh(!WPN=jt?{4!)touNucEFnX&5(%E~v=9<H9;fsM#=1hal63C>71W=*v`)C@C9t zp^2Pq=GrUOPT`7nd#?62w&(x)0-PfW(&VoAme=28d#*;g=ffOidrpXI=yT}*8JyNz zJcV@C@oc&g(lVLOnZ4v?;66m+jtD~Sl*pB1L<@$P9=;GPcDB>~G0mv8YnOU9<)|bO zTqZ?rw3(4Usy-ob$-0jyQ7Uw_RM$1aF{vsOn8%BXmJK~@<3Mc|?evnauW00!U+gH` z<5&iaO(-O^ZTd`#LNYc(Y6MG@>yTtFE4jq9<V9tfJEcZYW3CyCmkB}CxOyzb2GZ}J zw9vq)#l04L1KPLqPxJ*9P54>>U~r!dzOK%~*?Kt(TJ?>LamHjus2&Wn8nR%({k*O{ zt5a26|5!4iE%Iw3-KK8}c(@bSU==NPck?Su@|OSfuOuV)a6bp3hhd&p?#$gQHf4E{ z642wexXk+GFy@wirb-rwyr@Z*(w6GY_hL80sCJH+bBQh!joZ!6PKIq~C;3|Xr*`b; zXYn@6^vz$06%9ew(R`gWPoAw{2WSRa9qx6arkKFF1n-ay9V57#uSvl4Ec$((sI>-p zi}0l}nm#rLF#Tk`O4~=;lcvCrlUTT(!usOseDq&HmQ-{o@&VCrgZ3T{7Vi>t0WD}F zTsHlKk;?re(eqk~o(KtmSq@S1&jMy-&7(>=3-}eTb!!qEsH~q83y5G`=U(<?-4 z&7T?%j>hrGy9h^1<0kQflv)>DgX%6O6tXd&mIrAmg30D;`3rSK3Mu%%%H@mdrB&jB z_<%Q7Nzq4>LqGTNHV)`uuxo^ADtlMBV%HbltnBs`n<_X>wvFDM&4ezSDl?)n7)9ZH za-|dGw@9NI`<Bc?@(<FZu;*C&Ic&Ok-bMWWoEAmC)i{RHN4dccZAr&^A%1C}G;aF2 zPmgjy4_JA{xG`un`3J(#nGBtDY_Wz7V+1QbaGw)?pY*j`CuvWE9>6%l0rSvxiA_6? zVs1V)zqsSnl6FXz<1R5a(_gFrtijL*_hH+%fx+swO>Dh>?hKbU**0FexS)teZ1E@r zw!$R7yP?^?0VYaT@=t=zKdZ3IPTFzAz<ABOLh<TQS}wF)PhJ+Nx_M7-It3=ICy~DE zNTDW{r{5&M%10;w7O#R>KxgqS0%Aak;nAh~f*C;r$o-%+aOqc`2}HXCPI7t%aB|E6 zVW4ak48=jxZ#Bh%UtXs6<QwPTDOjU_@emMZlu)pEQDL~Q)(TgqGE<hei3<HYsy!#m z6S2l5uS&CWgtCQ0V1Nv2QoXi&+bi&M5IhCdLUh+bZQMCN9zQcaE)RdGla$_5*?|>; z$B!io;089Gh_8%p3JH+qh_Kc-J}xHA*ODrge@f9g66aiXNXtWZNw#AW4xKtXF?XgM zu2PMi6*3c1#}4l^=37Io!km$VgLOX4Hb^%6f@uj*c=6OU#2eoYZJnWyZ0Hp_@7lt$ zJtsb0+R9TAffUgky_DZMem)Bd&E7a(GU%D;m?xgkk2+4LdQFlKEejM$s(U~rF!=ra z69Uxhs^=wL+fM-v7u!`zaSu+dEe6-J%XvP)qt6JPMay&T5@)rjM2W<^&_z26y@l1q zN!`<5ksl8SYtkJY1ZoCKSFaZV=ad8|LF*H>mK}(Erc)-|;pU^9SV)M;m8MaxZN4&w z3u~^{&OTY*rhrI{GdPUSEifU^@QBSpwRZe>ez2J`i|T$%-3ZcK2l-k%@@v=|mFu<E z+0*P#fL}w|<W6h9$NkipPE~bEKby!_a}Zk2T%qyuSg5)FAZ_WQ!qA{^h-5U<Q8ruE zj&)-bmD#E3Ppdg10kWM&|DE^JFY=~|gT7jk-UDbZ+Z2wemk%-(_wWy#<1N9+ZBp=N zp0hRlGTf0L|L2+h5;683MZ~zcP(FQj{uD`TlpytDG>La)Vs7FzJdv2nv$J?I=|9_e z%ZZ39^}_Uy%EXgw;>!BK_`$S=wAOOaOVmOYG-q^B)P*rcxMdLee8rR<PM~I6l`&a5 zZzUN!nAcKhdD%W{FstR*s;C5J<cZD{hL+GC<Mg)^uqkg_^#*I8B;sKSM_ts}b9$Ow zQwz~PvGI4R?qe$ccc?Tq7bYLDn9`N0>GLV3uqdb#lqX~UH#I=i;y>|s4c!5Lm5);} zK#T@sgs8_LFhD{6^ZGRIWpovBKdz9L7wB+6;u?5fNHK=V#U%SF12h>#k#USPw$|YJ z!&IYcVHLbShW{b8e<ZuQL(et%7gnl8PuRM_f$^aOeCV7|#DVG35hQrgGEuE_6HKV6 zOx(*E5k)NO_M=HY@cnUQB(G>47#tt>+xHwfT%LFm&zbU_#an(KQ=p9#{>tWtj)MH5 zM2#?v>6sZwj$?fFy%-sdX|4{U*AOkHHSA&v@Dll=>_2zL(I@8-S>WJc@I+YUuKHw) zFeU_ZAGMjmhrFb5>mZ!-u{jXOw{xh$l9H`rDy#^qO9)~pQ$*9aZC<q|*FT=~GJAKN z31m6?Pnz#<0|OeShH#^z-$n{ejcXdF2Iz4)r;T_SSj(x7gFK|HA|Ii?WD-2b%S{v{ z(iHehp{HhGD_f0Z(3V-M5gdz0P<#C?Gbhr9Qj_W0QU0|aA#5~pk(iM~i^evuC5LS2 z9NLwSp5wH+NoTqCO*M&sbJblhx<O~-OmVNKA@qH9^bS?NfwSl}I(nUoA5ig-uF<;K z%CkzRa`6Ov&l(*$qR*0<x)bL6mpFnOYIHJ{{g6&w*=KdsM4__;Wf^$>zWTX=_i`)P zmc~&wMA{TuTZ;LPd>1=HbYS&~{z`-RnMfX<TIbl<%tfsYX2G7uEVT5`bo3E5{2x>d z>vWjg(bsgkSx0twur(pEN}Q4;_snSpv;?!AU>)t&&98G*>$d+osPs|vdA<I16_DN> zn_g2C^@6uO`j%cOvW&I1rg63r)S)E2!rj^p%iS8P%r26n_(>9{N(T<mZ_`n`3IdSW zI#UHe!gZr>i+e|3qXA;!w2#nU%hQsqYkgrYEu3fQ9I~Lc2VSamq=(VJR}Fotp+|-7 zhkv3MyJMjrRGXQvbw9*@bF=5B?S=^h?IC}qUg}lhNxEJ~Hu`uW*8@8Jae-z;M-QoZ zScP$KTt}x=pj_vo$5qU#c!Gj4t;i8cu8(OQGtYcXh^{(1CJ*J<SgqsW;^ee*C`Ui0 zSASf^@2L2<D&DQ)4^`A-(SAm!Kda*BREV=gpH=}|A$Nv~zfv);;-HEJ6@Rbdr&PR8 zMIE`{pwsVH@kSMIQt|UDKB2<%?GYXA5~P1rN1s#i6DrI%e?&*`QSn|CA5`%n6(3e1 zy(Ri(6~Ch5S5^F>s`{jkKBeM6==7^9zOLfSDt=8jZW8E!K}Wx+;+ItXx{9}}*rdB# zRd}=Oy&ToLSdA7Iq+#>@nx5LH2Yy3GuhP+dDxTKqXH<;p^tCEJrqkUz`YnC`kdEH3 zYv)xwuG2#t)jAK~JM!Q|2M^qH^k9UsJm+mhLN>3r>GWNCT!B4yutq<sqhD5WNjKy| zi)7fckvkZ^ZA18~u6<Mm@=-4OfQ~G9t|ZEdId^FynuFt3ECdD*sH6>(kqmvhM(<fx zY2Oo=+CEK*$_J^mwV(uSFYdopn5kFgR}@yW&)bILD#WM_2stYXU7YuGucx4(6`if( zy8kQOlJ71d`xpD$`cK_hT9xl9b+@$^yITkmZ0j!ZZ>hVqs@Q$47M+U}b|5%$q>^82 zvFL4GyNj*G9?sQHUF|MWU%7up|8@PPR(A20cA@{;irt;vD|%K@>$OVN%acRhos?bO zEj=yWEq&MYZ|Hv^SM6WZ|1@n{)%QuvbnX0<BzI*`Pv69fVt;@CwVlQO?v5h0uUWsQ z|D&sl{agFj_xI4w&YrfOwX2Ffr4_WfXJ{1$@m1<?vAdT(Z0z1h2;>URb)8o7R7+2L xsGVFgq}}Z=^}m7hZdx(Z-`BrOt){gr`dhmDHrz%#+xV}Ox_Z_F9a7?T{U1y&H#z_S literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f58f2d96ad093a608524d712d30f99ebf43157ac GIT binary patch literal 156 zcmWgV<>eAsnwrW01dl-k3@`#24nSPY0whux7=kq!{Z=v*frJsnFHilF+yecA%mUra zyyB9?oE%;AR1=GolGJ?tg6wqNqSWI2(xT+lVh}GL!HX|T%}dEI(vOeN%*!l^kJl@x Uyv1RYo1apelWGUDq8Nx70P2D#(*OVf literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..466ac9f66731dede493a75be0b5fba913f531c4f GIT binary patch literal 19682 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 CM%U{A literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e7be8f1fa7f701548ae871df2a713dd4df32b9c GIT binary patch literal 212239 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 SOPA5x+<T{CbLYjFDgS@BiDJS4 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b34f5f2da939830c29346268f9a6f2ecb17d5b8 GIT binary patch literal 26371 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/appdirs.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 0000000..f4dba09 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,552 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 0) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical user data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by deafult "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical user data directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname, appauthor=None, version=None, roaming=False, + multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernal.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", "site_data_dir", + "user_config_dir", "site_config_dir", + "user_cache_dir", "user_log_dir") + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__about__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9e9b50644e0f21cdd338c0334b2cbbaa6564ef8 GIT binary patch literal 726 zcmYk4&2AGh5XWb;X};5>fXan~sl*`?$+lHhDuhs>JtBk@#K9M9vvv}zySC+zNZI${ zz}s-nl@qVPiE$$o*6W{U#($4JBR?Mwd*kmy{A>XHg8#k_+P65JMR5ERC;_SjXaZFO zXalMgXbK5$08fE8fgb^H0dE8E0Pn)80~CWjpcwB1#iapITpa>M!7<P-@Db1+@G;On z@DmVSIHd#NPhdWI`Ww%MNxB>53#ZHA1(TK0*6%u8Zlsf1?T(F=%Cluqg^zxhF)w{7 z7~Az3bD^qoyG5tXSg>**-3S}^qSIq64}PsJ+PG6xxh(gZQWiqFm}baWq0QFH)!Ijy z$%}`4CDp1vyVF*X;AJVj6pk#lC119fPLaJxxccSVd*j|_*-H9#Sj-AtWoB#g?2x8; zaXq`KC-++AB`0$qmP=1^#fen0Odj%*6k2&J7r|@m>M?(m-nvKWOzQgV<NTiB=^rrb zT98ls%fBYy_LY*$*?E0>_pb_ad46#<MO>3t?(<|A+pr8iSS;7#BLJI5G!e0Hd5Jx- zM={ijXh+1iVY?B%h<?NX@dNBQ+7W-gX1+3+k!C8D^O$G)MqJ%+FLY)eR#PjS4z>_3 wdhFn_jZj?MLyI!J#6kyb|IBQ6op+Vyp%m}q1>G~mi*%HX(pG|_fg>{c3q{z_A^-pY literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fabc7b7caef31cec67eebf1bba9850afac196f1c GIT binary patch literal 566 zcmYk2J#O4E5QU$l-PPa9jw?60z!n=d0TKj3kQ1bF$7Udlv`knO1&Ul`50oNTQk%+G zNadjyNGwPn_^5d^kGyS~>fJA;k`(xZH&4Oq@BA%48Is=wBVZDU1SW+@VKRseiA*6g zj2oCO#1>`;v4hDWa+m_5fGHtLm<pnTsUd2ZJ;a`!8^|r>4l;)<AWO&!vc|x+26B(P zL-Wkjamd!|?tZaj@QSpVt@CRk^+_+<PV3d|^yKLwOuc9QoJ2>lRzzL!kJb^b4N-6B zv(v+)XIT;{)9I0yHPNVhH7)8QmS9Zh&X*#u{TTOiqTuwU;G|rfO5|#u<En^#L=&-# zh*#&zh@A1`a22yW1RoqXb9~WoS;U4Bvvl`1aIA|tTHbVc?f*LI-;fxm8#(-MxSLoV z@%OIvW^QLaAN90&{(t<WK7N*7*>-*!j!rE$xLz$$(SJoJHA(B*x$B?0K~F<Vq$kaB ZKFsH}_-d>Sqxu%3F7a^h(=WU0<OL$hj{E=s literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af8c3535b8c4fda94a432d5c33f70e503997f419 GIT binary patch literal 1042 zcmah{J#Q2-5FM{Kxexa4A_ajEkvIy9EpjIX5EM~_L_rrJQgK2u&aUsWx&6ZSCb}q8 zK_q{Kg1_XJDu02B8DB_(QedrTXU6uM_r`wM>vh+DDD{a0{DNB}K>rO+vp|#L#~=qN z7)%%x0ZalYI7~P&S_>c#VG@E0;c$g^KT0{wao6hYROnMJP%Y4(LA7CuXdNg!pt@In zil<lM8^Giqq3*@4ODqpDcLTX^s=TpEWJO(R>)L5{l$oq5UBA{@X~ncD6N~ZgC2_w* zL69&yje~*}oGqN@C7O5V0Ot&*0SUuO-@S?p24@_;24DdW8JyxOhbce?a26t)@MPQ_ z;&`i-v}!1a`_iakl1pQT$C*9AOrfmwiILx#V6E#xENGZ#XcUUX(r5#?O9nfOrK#dm z0v0#0+j*79-0Y05Q%UGi0q9S29j94CgL+OGTmYPM61Eq!-JcMLjwiWsVJQpcy7nM5 zf^-<i(l~G{OFtxdP5t`)VQh<fTxa!WRvIhweDjrh@jA7t8rSpLrdFnEbfOGJ;wBPD zs!S_Au4OWpv#gwrMN$>Dw4-|AT0)fSScnaxO7{iqB>u0`(bcJ4)X+vB1qk7~LKIcn z<m5*}d}(C9T+su>^%~+pN96bZCUhS?*SYTDV+=iyh-qq{8(2l}OzMU3*NL48?V?s5 zGv-Sqk4f9_7V-G~e-+)QBL1>kPq==7Q5+HbX=59W>@_t)(<{-m%W<<XE;>@0p1H`% zY32C)k6UD(<D%6rLW7+Z#LT#^zdE1s=$_Rr<2kjrm(ALt5{6P6LB!YDdbrA>pu_(F DmWcQ$ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e996a2b0062ec1d2a7792693c7ca82ca99bd2aa GIT binary patch literal 2962 zcmd5;O>fgc5FI<;A#KwZDBlt%WQjHs0)YfVMMxknxfF5eftB%YQ-fo>Yo}7H-pYYL z!hyf!D<}Q}C*Eu@B$X|PFA2xHp7pH#-p<avcw=d)+yAK4hX&DSnmOvQx6zW<=p;^y z0-~`+yB3XY+O=t1qum-=&!tVWM(;7DMygJyxZNPtpi^SwxvZ0H7&q=t-Az(W<8G2{ z(vH*m0t|9$*^2uniGoS0gg=fWon~$6ANq+Oh1qhf{V)}Klh8{s_V|hXuwiVYB`4?< zU@c}0iXaVkpa!B~2P$kELI7sFL9#`%ZEUdVkn9>8H_wsm8M{q#iR7}eF=2&d-`HJ} zt0dQqjmhg+$@#4PBHZ&sKRxm+kl}-`+@7K(b#!30<Jd!ukkcn}tgN1>U{5zOG~L%% zgLE7ZVn5#W!z6WsVDrAZ`#`2D8pQ8Ln_4B&M0+aXk@z_hhbokj9>lKq&K>#TXdseQ zPrP)3Ia~2j))tr@Yau#Jg`-B+@oG+ZEBDSZuVIp5-iMLmv<Oi?wfNj|tf6CP^?f(l z&+7bY$I>m#`?(g~#*l$|ju1VJih!qH&rre?z7~b-nR&5e8<4CKrTa>s#cB!>q(ZFB zAg#<Sk$u00qnGfiA`~UWS{Vv_b0}xScw)l%7GbpWFm{pXyxpOvvJM^(+$0g=`(n#T zr~@G`l#pOwF^N??fxVn1(VK3j=55yOuK*6Q!b>H<?3)8F+RK--ds();5q9fp2@3oE z5(@a<C_~}3Fn>PyI=2=C(ZtQl`a?BxQ~yxqxmHpNEg?cR65=Lal~+PPe+DIJoI|I_ zH50mHpl4kn#*v%^Z1;pXn7F~zqq&YX*OXr7j&ojfO6qm)&U44fp*Ohup)XU53)4st z7i_{$_3U14{%8CiTt5!3%x$#)Kx*|x@F?G!?<#xT+03ImO}IjZGLdw6T}Fbe<I88a z^LN!zckxzz4qb6VnC-h=fxMtRR+f}WlfewwM!_-{Qpjp3PR2V`P+VLl;+V+SYMER} zpiB|ms{sFJ@@T5>K?V9k8aelWSEP}q#vfKdEhLoHP^=`6tDqKBOQS0#^}t&7WCrF^ zL5k)gsresBU*_%#cYmyhEGf6p%Jh)^L#M@(yf@+RDtt3>-fB)<%^!DJGkWt@d8t{V ak*Ff!&DxKqlKz;VNmz@o)h=G|pnU_$*!LX( literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8894f574eaef7d1ab5aa0035831b0cd647d3932 GIT binary patch literal 9546 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 N=c=RC!_c|e{|5~Xp*jEn literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dda2cbfad877e62bdbf15517c480294819b2f3c GIT binary patch literal 4262 zcma)9O?wm96+ScimSy=93xksk1QHZ%*=a~1Ay5mWPzPIfB@@V`={#f2wKGB^DR)K$ zoRCFn|3p{abkRjO{Q-TR{(%00yX}f)w_f!<cO+X779Dht&pr3tbI(0r_fVRg%uoMS zh{O!he`xGW17F7o_Y*`Oeg<`j0)uRW0+Vc$f&|$KGI-6TPLk}T<^!H0JEidib<z}M z$j(rZB|A$&j_e!-d9w5I&ZOp;AbWy>0@(!$Cdr<pph$L+f+@16V!o8-n<jfEo~NlZ zOTir3^O$GI%TnhI1q);^P*5Vf6jO85IZMGJ*^3mMBl{c$=gB@##yu}j-UR&-s!xzu zq8GTzTO<l3lGJ`%!*{6k0++Q&%#c?g;Oz_ag2=w8DU)NAcQvIrM!BRZQ)86Nnle2` zc~4Vj#whP=%Ip~B3hU&}F~u&EfHF|G%v0c{JN5@8rbgrsn5=caO5!Sc^Lp1Z<Ms-P zB6(++;w@-;g#?6GsAR8_z%t}Qp%pElWUrCHH77}|X`$j>DtRTn??aX(&QbeUBvRD= zNW*J%=LJIIW4*Tc#<fpKVEGfO+Sj$tfbo&n<0HMZ<V};eNZvV|V|wTHX*aYIu;vXa ziOU!_a1w0sDTz<1{TX>n<h{ji1kn&Vrt%fv)|+pVxT%@md5sAc&^tU!^DU5A(0muh z`Q9h{a}xM1z(%)N6x-t#?<m=~Nx*EU^IwyIp)vnZuM5m?)18vNP9j5M9g1hMt4jC0 zi{!nl;|@V{N5|a;r%$td=_My$IiaT9{jk>=M8ffdeosa!>-kUo(C>9su`m5@<QxpT ztqAjaIjJVX2(-gy<bpF7PikFHP4%RI=y%=Do_HF4(UYpU>&j5np0-4v_m)#CZwuMm zk=s2fRPtd@dMdl4*W8XuHN>HKsxlkBVBhbGvY|3tek7#Z0h;QwsFw!oYpRLuYU6&b z;nW`OHdK1sm5+twYix-_xAm;q7cKw57gFU;(ZUJZ6j6)sJ^EPYI!3qvAdqeFCZNgX z2gOEPDxqdKyHDJX?={5t17C_jbfcp$^A^5p*Ye{vOP(%TKe(ZF&>M8UWor-$8Cv0Y zy+OwV&w-Fu)U$SLyVl2RH!4~P+coPrT{jSpqw<au^t?fb@q*)gKX5z4m5k$fy_Vzr zjpTW#tHJTZ)hOt%_Wk~f-wh+T(^<JLuHEn=(Od05K3tI^><wf~ggkRjXU-GR^?Gu( z@3tPhaNObQnEqj<|4gz)X4y0*Kp~;$$Hq6u#<$1Dm1CoPY%CueH;;|=qr{3+QAt+v zDD}<nt#7ZY#6Wgb8j&E~Q03b_zuVMdqq45oc3ZID7b@pS_Xj70zgnpH`s2UskqwM+ z65uD3+C+WSBm*I9))kcvS;hh!ZiLF{C?h(xg<Qgl%6{H)gMH7v{RvCKAX#C0j*rrz z@ydC8JAGaj2+qSvi+q%v=ACTkazb8Ze3`+@h#DWuCu;GZ0?~)5bf81>l|zzP)rXt| z65*WqYKFd`Nq;hF5qaJ$8+9DUMpskLD4`s96}dKfN`UA7FP(0UbZP-P`S`-?7~y9C zZwz@a!4-p_SNu{M$Mc#dyn9Rsl7+50H8GwK|I+zxx#M|I$?NzYtsMFYy76@@t{+Gt zq=X-Z77{%Qm#uKn`p!ZMaY$h{^4qeO_Mow~Y`I;}io>g7HC#Uwq4mogwR&CXv+sJH zXDbIi83<0mlML3vVg=$fY_VndOJT4Rw8tt4$Y*oxv^LyjaJ_wQ(!*|@l95S|^CVkj zJV#%0RG|nJ1MhZ{`F=`JJ2iwTBc-8_vHcGQJ^UI~20!fkIYE!Q20h|XPjg^6fWR{( z|4mVr+S%ch4~Aqk3_0rkStEHWg#Q?l3i6*L8Zg!*!MftGSQ<;tP&dcN#&|TLmkK2R zJ4D*(GKjhfI@IqKvlS>R>Q&ubFl9<lr%7HgSn@RU4`t#(B}7KDesp!{jd6o7vwK5f z2`PKhawF^Fk82m?^NTMz^NwalJK$eSM@o4H5mx){gUv>5yH?**6MB1GNF?vkB}t{( zwQi&monA{`V)A7Gl|>2C8&o=MeTSN@(p?dOM<qfL$@iEi?S@-ELf{PVT4k^XfTt=M ziq3(W9g7xZA-{Vn0h%&|%4^x4gHwJ{fE>r~`jO*2g0S!+02v8m&X@&E8y}ekBL{rW zm^TW>l$kT$$Lwf+ESD-H0WB_u{BdM*RO*QQI}kVmh4By}0srdIl(#tQ+PZ+X^~;4g zj1Yl(6_IfAGnkYn`McqUD5IIuLk_*1CHeD69s)U`IkMv%Ig)=FaUdpRj@*a?Wg|`l zoZ2j>>v$M`Tzmelya3&gQtK8bN2#0qM}7cOIUjp&=#_pSB~D()f=cq^0T-e%5uWxD z{1-{><JeoKyv>Z<Bt+rszQB_SZoH^q3FiUGD8S@bFcvTt^*EY))%beHiS5}32@Gxf zIUt<ksN&l2u~GTGIGX=_Ov)7<+U472Q(r^g!#+G+tm*42;^mj34;_ETqJC^qOI{0y zn4w<I$P!C9%V3cKzbBG4lbZ~_WN^|O#MlzkJ_5Lp5pv!X(&<d$OkqY-%XhisI2c3& ziH<{Zq)EQ6Oaj30aoC&a+1`GogQ%eV3fV=cz?p#5kQ|_r{~ISW40ML(7|S!5U{GMd z54$V^C}T@qexuOPe_9E8PefQjes%nPImLVUja8ZWc?~8014;2)nLl|ULdg!2>}Z|T zD*u(+8HgHJoVZ#{x?#)rosNj0eW=nNy4EOE+3MErZ>seN+bSCl`hE0Cpl#i0R5$L| z_Efep!qQv2)kdwZ(vA3UYGY@6yNX`3w!OKrv$a!KW)+oc_d$JQ??H8M6NKXCT~x2l zFE+Vnt;5=<bCs-Dw`(d@d$iZ6s>FlFCW9?Cp$ScAYqPnh((wddlH4P6JgdxCwZ@&D zW(~sb)pr`TjVkaWh)ta6pt-zuZS8cvRl8T+_*zYj)_3YPRTxdStM#wZT#Tm8-P(pK zqC)O+t*+|6|CCv;P7fRKW^K3DsP64>7p_}!H9L}0t>1Nqv?4C#jLm2G%6FZy!Y)5% zzovWpZPAK!Oui|E(bvUo@of&w&<0pSDJ_^6jVs2qF>NjwONoW_f;o$Fdh!n(^T_mq okp?|)&Ku{<C1c6V8ztk6an_gvb<RA4vOH;~u?{(jvt}{zKV~o6r2qf` literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02b0a2f2a5c7bd06a0bba98d639f922df260e0a1 GIT binary patch literal 21162 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3d0841d5338b77ed8800ec9ce3aeffe83417081 GIT binary patch literal 488 zcmY*V&1&2*5dJKCH_J9@5(@35FR&EHmqKzVrI15!A<&yk5sp1ww2>tt$!W9nwtbZx z@=Chq)K|!<qd*}YG@oWPf8XfM!NKzAj_9rc9`H;A+n-p&XNG}K0S$}=+5)3MD=?O5 zOB6XKpewW$sKRE3p~Q~!<`^mrGyDeHy`1x9HUGoSuqxAGcNMIjB1ttm>tk9B>P7`+ zO?v6PGEsh?Odr|5*v`M!^5omQo*6z#zDw3~*6^Ak0-GWe`~~a;HUc~FFmdr%)I95z z>^ozP>N~BrBt5O^XDY*Vm1f%hAipY7WxA2>;g{U)@v@1dYn*bmG9h+a*QfOUY=~qV zcfGDX1v~kkLiV`ZKTqC}8LV$y*I##QW!B9Ul@2HFHXZ**AkW&*-18Sh_-wBhX(@T< zIC+xN=ZMcc`idb5Pie2Wqf?svJU{1}C$`VvMNVCO80|1=`j`tt&V4KP%fs?7unc&K literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1f36b5892f4726b2d791ff845710d445b0fda9c GIT binary patch literal 11442 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 LQ8+nb6$bwgdbfAs literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_structures.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/markers.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/markers.py new file mode 100644 index 0000000..892e578 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pkg_resources.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/requirements.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/requirements.py new file mode 100644 index 0000000..0c8c4a3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pkg_resources.extern.pyparsing import Literal as L # noqa +from pkg_resources.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/utils.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/version.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/pyparsing.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/pyparsing.py new file mode 100644 index 0000000..a212243 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/pyparsing.py @@ -0,0 +1,5696 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2016 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments +""" + +__version__ = "2.1.10" +__versionTime__ = "07 Oct 2016 01:31 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex('&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + """ + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +collections.MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [(frame_summary.filename, frame_summary.lineno)] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [(frame_summary.filename, frame_summary.lineno)] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define action to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or loc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.popitem(False) + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + prints:: + ['More', 'Iron', 'Lead', 'Gold', 'I'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, And._ErrorStop(), other ] ) + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + """ + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, collections.Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, collections.Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + matchExpr.setParseAction( pa ) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/six.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__init__.py new file mode 100644 index 0000000..b4156fe --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if sys.version_info > (3, 3): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'packaging', 'pyparsing', 'six', 'appdirs' +VendorImporter(__name__, names).install() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6217e7c72948ecd47c6a5b2aceb3e67cd3181226 GIT binary patch literal 2513 zcmZ`)O>Z1U5Ut*so&E4S4nbg&D5NDMqCwaW0VzlX6htBtflL&m1T4^KveRpiy*o4M z?v1mHeIXXNT#)z)95{2}zx0(;{sJdn_3YYCtjzAz^k;Q-z1Odo7Z<x{|5WOq4$;4K z;t5f{iPzkK$?z96B-$kUI%`lC&>@-vde)##L0OwN8>9rOfK-DUcS3qbBrs_s?!15p zTJN)+KS$nEv?%z66Igf_v>DI<&iyJ`NQYP=B-Nx0|A^OphB1*J(Bh>JQAMFcS(ke^ z+mtO(*7IdFHW0$1JM%ylS*h=is#05}r-xmM=Sz9-_C5LW)oXI3Y$~hNZp(Z&L=H+V z2YHd@#g;59o0mm898OlAct<Mp4lty&+e+`{M#&<zW9`S}g|R583@-b->6S8bpv#fe zWoeTl9jR46d%e$j;D^5f-mmbQ>oEI*_K6ZAivm(wR~xh+P_@FnI|1hkyF<2lWXK8J zh=X+(si)Xs;aW)@YTR_4qlH~ylyzt3oAALH*V3vQrhVnQbw^U|ZpEPsjT#Pg6XEC< z8*qgFBE5jme|OgGs9LM?YGt<BmFw!0Pcy5^HB4U7%9LZ>SB7iJajlMRElKhsw@I>E zO<a3k>B6sxU`TYtl9(<(cnP!B`MAE|F?jgfz{}J!Z^0lDJD#e`4+K&J6Cfwy^jn{9 zMtno1y1xxvwXqV&$$G<coVclwsgda%&3R9a7`t#{)zNw^d^+&quzgNy(?iuQ7{5-! zj9TL8JkZUam|l2gQzr)YnF0K84tRoR!?!3f-u3PPxu9jx;irHO@DJ&r$)wP+XS!{W z4QRi~2auD|WO`t<x#PRh1d2?5J4(lW1<DqZah7|$^}%>JWP(Z%SX(3aavX^x_Q<rz zI7LVEF=$I!IV!X9P|4iLvY4k7<hR?p9B*yoi=O$pI!>fMgRQN{k?T}gE9VpD$>xHz zn7Ck+R<2uz!BKb$#*t6AYtQ3!A*a}d9HI*!rAE1^4(b#ne3p|s(q$}c7$|C97Lf?W zMZBk=IWeKnG~=g@mnV8?{zl<7&@^V~JbmtQXwa>ncNnV4cZ|+{NXrM2hbm%tgbf+1 z{fN#Vv}nIYv$~)gT!Pp&X*VQ2nRi6=IYw<fd>m6~TeRCH{W}REeni6$cpst>+}~-F z?XVI*_p13T*b{;Q(e#@m1n)vCQmbV7L}`W=T<|BvYoRUWu<Ua;13xU&?1&(*!1#i> zJN@H(IJojl4Zy*b`PpG&X!UrUYn6Q_i&BqRC1<oS^3k}+SSvl(JXdC_DNQN!ft-|M z$t?3-d#Ns<$REmnS(x##KE$)}5Mw`D%Pcom=a0tBsnzwkp)VplZ{n_ggUepk&Z6YH z&=s%wNdk48Kn-h>7}rBi3_L)r2Bll5FOS<=m)b?R9Y(2j5$9)U;&v?qEJB*urQcz5 zp8ZFaR)hSh*X6XZAa<FZA}8l|M$Y#z$-E0g;bn1F1fq-IqF9WU@NJ{iX#^q)PSN#* zi&F~e>B^3w02aC+XtzcB@~ph$uMp-T#APFHOz$7lqrS;rKEg6Dzzn2nm9I@Na*R_^ zTA2>DO0$W?o{cK(F-z9tKwm-tu5&cUMQK$*;$Neot=YwL6SHdl3~?#E{fd6h2E|>z zM_9RlA`q=1M7ftFkH@LkG}Ky2l9l}=(Tf~PyV7N)w4G=sg1*4!eKs*0zUEFCKJ}Vq zfR)*cM=y*T=bGo*OTFGD-@`)2*FE@&;smN@xEL6q-@;xq+&Xcn*VxllHXpIM1`{`Z ha%wM4-iFa1aOdkHaqS!R7Qf(2(BGQ9;LTf+_#ebvbP)gm literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/INSTALLER b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/LICENSE.rst b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/LICENSE.rst new file mode 100644 index 0000000..ac630e8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/LICENSE.rst @@ -0,0 +1,24 @@ +Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/METADATA b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/METADATA new file mode 100644 index 0000000..d68429d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/METADATA @@ -0,0 +1,38 @@ +Metadata-Version: 2.1 +Name: pyasn1 +Version: 0.4.8 +Summary: ASN.1 types and codecs +Home-page: https://github.com/etingof/pyasn1 +Author: Ilya Etingof +Author-email: etingof@gmail.com +Maintainer: Ilya Etingof <etingof@gmail.com> +License: BSD +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: Intended Audience :: Information Technology +Classifier: Intended Audience :: System Administrators +Classifier: Intended Audience :: Telecommunications Industry +Classifier: License :: OSI Approved :: BSD License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Communications +Classifier: Topic :: Software Development :: Libraries :: Python Modules + +Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/RECORD b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/RECORD new file mode 100644 index 0000000..a9dffec --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/RECORD @@ -0,0 +1,79 @@ +pyasn1-0.4.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyasn1-0.4.8.dist-info/LICENSE.rst,sha256=IsXMaSKrXWn7oy2MXuTN0UmBUIy1OvwOvYVZOEf9laU,1334 +pyasn1-0.4.8.dist-info/METADATA,sha256=Mx_DbLo2GA_t9nOIsqu-18vjHdTjMR1LtUzdcfLzE0Y,1521 +pyasn1-0.4.8.dist-info/RECORD,, +pyasn1-0.4.8.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +pyasn1-0.4.8.dist-info/top_level.txt,sha256=dnNEQt3nIDIO5mSCCOB5obQHrjDOUsRycdBujc2vrWE,7 +pyasn1-0.4.8.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pyasn1/__init__.py,sha256=1Rn8wrJioqfDz7ORFwMehoT15xHOVeiiQD5pZW37D8s,175 +pyasn1/__pycache__/__init__.cpython-35.pyc,, +pyasn1/__pycache__/debug.cpython-35.pyc,, +pyasn1/__pycache__/error.cpython-35.pyc,, +pyasn1/codec/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/codec/__pycache__/__init__.cpython-35.pyc,, +pyasn1/codec/ber/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/codec/ber/__pycache__/__init__.cpython-35.pyc,, +pyasn1/codec/ber/__pycache__/decoder.cpython-35.pyc,, +pyasn1/codec/ber/__pycache__/encoder.cpython-35.pyc,, +pyasn1/codec/ber/__pycache__/eoo.cpython-35.pyc,, +pyasn1/codec/ber/decoder.py,sha256=7-WINr38zVEa3KUkmshh8FjK6QnFaA8Y7j7XaTgYfRk,59708 +pyasn1/codec/ber/encoder.py,sha256=xHl01PCIAiHZXev4x01sjbCgAUKcsTT6SzaLI3nt-9E,27741 +pyasn1/codec/ber/eoo.py,sha256=eZ6lEyHdayMcMmNqtceDIyzf7u5lOeZoRK-WEUxVThI,626 +pyasn1/codec/cer/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/codec/cer/__pycache__/__init__.cpython-35.pyc,, +pyasn1/codec/cer/__pycache__/decoder.cpython-35.pyc,, +pyasn1/codec/cer/__pycache__/encoder.cpython-35.pyc,, +pyasn1/codec/cer/decoder.py,sha256=ZYBqtDGNiYmKDpKDvioMDf-TYVWoJeZY3I8TEAKuk5s,3745 +pyasn1/codec/cer/encoder.py,sha256=PGtzcIelIHj5d5Yqc5FATMEIWCJybQYFlCaK1gy-NIA,9409 +pyasn1/codec/der/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/codec/der/__pycache__/__init__.cpython-35.pyc,, +pyasn1/codec/der/__pycache__/decoder.cpython-35.pyc,, +pyasn1/codec/der/__pycache__/encoder.cpython-35.pyc,, +pyasn1/codec/der/decoder.py,sha256=kinXcogMDPGlR3f7hmAxRv2YbQyeP-UhuKM0r8gkbeA,2722 +pyasn1/codec/der/encoder.py,sha256=ZfRRxSCefQyLg0DLNb4zllaYf5_AWGIv3SPzB83Ln2I,3073 +pyasn1/codec/native/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/codec/native/__pycache__/__init__.cpython-35.pyc,, +pyasn1/codec/native/__pycache__/decoder.cpython-35.pyc,, +pyasn1/codec/native/__pycache__/encoder.cpython-35.pyc,, +pyasn1/codec/native/decoder.py,sha256=4Q29tdKyytK3Oz-m94MSWxxPi_GhcBKvUfvPNKQcL0Y,7671 +pyasn1/codec/native/encoder.py,sha256=0eMLWR49dwMA1X4si0XswR1kX1aDAWyCeUNTpEbChag,8002 +pyasn1/compat/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/compat/__pycache__/__init__.cpython-35.pyc,, +pyasn1/compat/__pycache__/binary.cpython-35.pyc,, +pyasn1/compat/__pycache__/calling.cpython-35.pyc,, +pyasn1/compat/__pycache__/dateandtime.cpython-35.pyc,, +pyasn1/compat/__pycache__/integer.cpython-35.pyc,, +pyasn1/compat/__pycache__/octets.cpython-35.pyc,, +pyasn1/compat/__pycache__/string.cpython-35.pyc,, +pyasn1/compat/binary.py,sha256=mgWqHmr_SMEdB2WVVr6jyYMnodSbPP6IByE5qKccWLM,698 +pyasn1/compat/calling.py,sha256=uTk3nJtGrElqJi8t34SoO8-eWFBG0gwNhXrlo1YmFEE,379 +pyasn1/compat/dateandtime.py,sha256=zHvXXBp4t3XJ6teg_tz6qgNDevzd93qnrLoEbNxZQ_E,482 +pyasn1/compat/integer.py,sha256=k6tqyxXMC0zJoU-Rz4oUPPoUpTmWXE6Prnzu0tkmmks,2988 +pyasn1/compat/octets.py,sha256=ICe-DVLBIOHmNSz-sp3ioMh--smodJ4VW3Ju0ogJMWA,1359 +pyasn1/compat/string.py,sha256=exqXJmPM6vYj4MjzsjciQdpUcJprRdgrLma8I4UcYHA,505 +pyasn1/debug.py,sha256=HWGbLlEPLoCNyHqBd1Vd_KK91TppEn3CA4YgUxktT2k,3726 +pyasn1/error.py,sha256=DIn2FWY3ACYNbk_42b3ny2bevkehpK2lOqfAsfdkvBE,2257 +pyasn1/type/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59 +pyasn1/type/__pycache__/__init__.cpython-35.pyc,, +pyasn1/type/__pycache__/base.cpython-35.pyc,, +pyasn1/type/__pycache__/char.cpython-35.pyc,, +pyasn1/type/__pycache__/constraint.cpython-35.pyc,, +pyasn1/type/__pycache__/error.cpython-35.pyc,, +pyasn1/type/__pycache__/namedtype.cpython-35.pyc,, +pyasn1/type/__pycache__/namedval.cpython-35.pyc,, +pyasn1/type/__pycache__/opentype.cpython-35.pyc,, +pyasn1/type/__pycache__/tag.cpython-35.pyc,, +pyasn1/type/__pycache__/tagmap.cpython-35.pyc,, +pyasn1/type/__pycache__/univ.cpython-35.pyc,, +pyasn1/type/__pycache__/useful.cpython-35.pyc,, +pyasn1/type/base.py,sha256=TX7qdOX3EPiY7-11MY4fwK2Hy6nQsrdQ_M41aUcApno,22386 +pyasn1/type/char.py,sha256=5HH8r1IqZMDCsfDlQHVCRphLlFuZ93bE2NW78CgeUTI,11397 +pyasn1/type/constraint.py,sha256=0Qsth_0JctnDMvOSe5R-vd9IosgjqkKZT_X9lBRXtuI,22132 +pyasn1/type/error.py,sha256=4_BHdjX-AL5WMTpU-tX1Nfo_P88c2z1sDvqPU-S9Bns,246 +pyasn1/type/namedtype.py,sha256=VIL3H3oPgA0zNrDSeAhKmi4CZGTb69uDBVNJzzRk3wM,16368 +pyasn1/type/namedval.py,sha256=dXYWiVTihvBy4RiebGY3AlIXsJvW78mJ1L7JSw-H7Qw,4886 +pyasn1/type/opentype.py,sha256=pUpnPqv8o4AFeIsmGHDTFfuxXAq7FvG3hrTEnoAgBO8,2848 +pyasn1/type/tag.py,sha256=nAK54C0_F_DL4_IaWRthIfIYBOTuXZoVVcbcbqgZiVA,9486 +pyasn1/type/tagmap.py,sha256=2bwm0hqxG2gvXYheOI_iasfl2Z_B93qU7y39EHteUvs,2998 +pyasn1/type/univ.py,sha256=FXc_VOStZfC-xIVTznpFO0qTq1aO4XyJFU0ayQWgPMY,108921 +pyasn1/type/useful.py,sha256=r_K6UhgcrJ0ej658X-s9522I9T7oYVdmEKcbXTkZMds,5368 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/WHEEL b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/top_level.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/top_level.txt new file mode 100644 index 0000000..38fe414 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/top_level.txt @@ -0,0 +1 @@ +pyasn1 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/zip-safe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1-0.4.8.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__init__.py new file mode 100644 index 0000000..5a56a70 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__init__.py @@ -0,0 +1,7 @@ +import sys + +# https://www.python.org/dev/peps/pep-0396/ +__version__ = '0.4.8' + +if sys.version_info[:2] < (2, 4): + raise RuntimeError('PyASN1 requires Python 2.4 or later') diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3582685d6f4bc857ee542bdea1d070771047113c GIT binary patch literal 309 zcmX|5u};G<5Is9>s34tDw@6GGn$QvnBoKmuwW{dW#R{?!hQtoGgK)<pK81mauVKl` zlwV-tGL+NZyLWebPj@&T?|**?@dW@sSpN|qyTY>P2pp3@39v>&VNE~)Jkoy219+z} z;UPQ$m{Sk|@FBbr*y4@AD%tDM02Z6!ahj)R9mSy=AZ(77{(7~T#YQ|g(g+(by?f9q zo~L=NO<WdEn1q^MVES*8K^s_a+XKd4gt1a9#@c8{rMlN`blWH=D{*6tHlJWdy|#zn zlgw3hR?B)Sm32i~PVcyAeEvGmYF}72+cn0dl8&*o_U-7R(!43fB|!@tB1Az*C*%)C CTTQ+I literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/debug.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/debug.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79d0041d723f9ed0fa3ce20f6a780170d75f09e9 GIT binary patch literal 4764 zcma)9-ESLN6+d^z9)Dz<IQ>YP7Feexv=(hrLU#ovTT+@dNThB>SnXnM8M&UR>(m}k z?@X%1YIz{#0U;q)+C}0I;DHAo_Ho}4{{b)e6$z>TLSL5OIWu;hkRryuXYTj;y7za^ z%vUPqfBq#1{xD7SFPeCYsIQ~McNLM3zoH&db6i){RMKxz&!WCfO`8<Yv!$J*W-e{# zsF$a{Lrn+mJoyg!1?pgaftNRn<QJ(~BELk<GWlg{PLV%F0s37E&|jed{nHdoQ5U<q z)Wxa_ZTU0gSLqcvRw<aKL+m(10qW?Pr9+GK-?_d!OU+pd7qH+I5AcFn88{_tW-)M@ zAQ%tiM?0Nn0a|Cs$KT<h=2`O3id1vt&(kZ5ny8#(U3hdJyDX4@UUoS@+T|Pt=jaf_ z7*e!Tzwnw3+^8!v<$2Eo9d`$z=b@Pov>s?wN`rP1uXe*EHu;U<(O$=t;vm@`bUJ}H zg(tzjzt@jm!z1+C0_lGJHId1MgD^0KAZ!nOp5_N>#cuU_ZRR+7@~Et%#2<pdHmL`j z7E71?QMc)pc+<~iW`QSDud$}^AgfX|g$EjP2D;JCVK;vG%~IV#iN64OAt&T%k@N*h z;0ob#sOY8Qp<PQlZ9<QF0mei;^^WxB*lsT^dSQ?He<l53Z}EbcHet!G!xOUgNB6`2 z1)d^<;78=)ND)N08^(zaT5<Tj;o{PjR@_dy{h%J#mac>?uG~beAH;F1gGRk%3O$&= z8^RTxu`7z~mEd{MgPS&g^3j&5>?As9^?%w5{T_T!x;xPQRs!=F7gOK1$}Qg?O{#jC z2|bTl1iGFxxj5)OHcr}x$4C1;9_{y6(%*z>-&|iw`q4_%jjnaWIDx0HJ@SLSgB$y+ zE2(m$m(Ry&IXW;!&+CTW#Pb%}KXV|YTs31=EmyfHGgd`aRmB=sGqILO3)<{ee)v81 z@EJ5<)?INd{K=LU1FJ^e(&sR0^1>Xg1#a2>xFf=+<XhYaq1q7M^S+N(EPT|Y0O??x zPdq>T<|0Ro&zl@Zt1+yuMF+`~L0HS2bxU~Em2f`JwBUJhqCM{eY%t<E^HymYt2-<k zp9s%0WzXvm{JkF6UC(>A*XpGs`aNu+FEY8rgk3X1SVawFC7u>LAg*=xlxs_$nQH9y zdf8!UV{H7e8P-waZ-5-Xr<MQ?u7!=WoYR*v<%oZdnuia(YNW=<+~8>7gZ7V!X>vio zn+VsD7be78=D`NoeH-lb5|i&RsWUlAX%_3pC}Lh$ovhwRm@uhcfV&Kc0o(v7Qay3s zp=wTaM&ywA@d|SgJn%0{KkhZ+L|N*nOhIK==dt(r*l?qQavvqW2MYm>7!d@J01{6f z((9A}gMdjk?dBLcAjAUBH25cZmg|r#UgJ=BjU~#KwFHMC3lJ-X8BB2HVibi3APP4` zWKSTSL%U^0KTLjX(HvfC|10j;c=)BDnoWbh3G5YU0Wl7uy#%uy>3>KsVj<CQEm{Bq z9^8<De=~<1&^4LjDGM|AENB*<KGuDodp{1BD3`eOv`l(Y;YljAJIzMJN|xp~ihda? z`Xmz?ngD6R{iZ@Bjy_a~#3Q+%eNG=kn4NmH(JZHk)xdqx=V4_aK5lm*N@K)uQSXHz zFtnCpQ*9}}S`%!jJ?^zSz}|RhU9D+8yKmIu8})0=`NwefQOlp0$J6H0W$jiHbO!pM zc6lkjjDAz}yK(DLFYucPgi-<Qe3vD;3R0gjWdUlhalf%?98cKFHPls}G|Pk!EpB}# zw6THrX4(%PxAuBT1`nDqhso^@x}hoF-M+o$-Mjt36n_>RY;p+KHiny14-Rf4yhu+y zpMqarIGVyBN)Yv9ljC-?&<!~c2qx~3U<TvG7D{{tgjC6LEk~VJr)*c9wOy+QsGd^} z;MxYAx8_wvowJ718-n#?*k*I`!*3Ss4ob|hjib%}P4PQDh&y$l=;_pp;-1Vg`!M5m zEYT|<C*!F=Ux)Y3kfSn^Ly+_cI`Iq<gAJa^a5Qu%VVA`Wy@+YYjdKxwkbTT<tacVG zL<)@ad(3YNjWNG<21O_%I;F6ve}D<cI2i;A1Ym$a#{Nq=897-wVK%by|H};FM$4Yj z1h=tn=}@CyJ`TYgUi2yxiA9&V#um~)WO9?qNdV1|xPcP8ATFP<nrri~Jvucx3~<O2 zcYTTq%%^9VwunN962+B$!OdMk?v015^r^+^9aH=Poxm;_LQ*{-$-2JB*c(0I)kxXZ zvx^yqz#n;&^S1AA>1FUTWz@DdH|2WeyGhWGO#zt{aw?=r&GH`Z%yya<J85V}8qDCs zF?~W|xlOFabCkFYLbd~K9s51iw85ioa~~dlv&y3G5-O?O06Pc_X^~z+^@TOW2Pg%k zRCvib%Ih^uH+Fmg8B<|m%{=vwK<c*UK#2GPa)NYbS_hqOj8swd2@Ww&QUy};s;rO? zPXsdd&DbaJqk)@@tAMbDF!f60L==OF5EUZg&kjiI7Hy<mNE;e&RINR7G;7YsVFx8% z2f<y&nui}`&V(m@F$b8<fz?xdTdgodSZFR<&4M9Eh0iQ{=D;ZVp|cb(Ew6s^TELYV z4GZO^<@f!YHIurhZX0X)x>2D~`^WtCro7gJLE3|UbnEvl6JO$z8eYi0f0oyJ16=j^ z7Am88fLYEUjXmr}CXdU~35?wfLd`D4hn0g5t00Mwanc2h{thKGI8KIYqd9(<^E!%{ zB>=P|9{`o)Aj?oB6GQZe^*M7HXDFzQGZaMs63kLI`JMJ43dWXa!!Qf>am)!yYIzSH zO%pf%HuPA@cOWlc`OkPU??P%gE&IPs+(#}x!ias6o*Q@>X#-9LqrXwhKwY+?egN_g zj+Zd>IZBK|!^()?|3G>UILt_R;mCm9#CHO-GEOUsg3!-E-{h0QQ@HLeY{{oWF4~Kq z{0Y-X%9c~++<nBNtnApLW6p<}MJ>_J*wG+*hl-q*{&|8=DdRJU8uh|)_<akyzrYgB zYbOL36$FDg_534m%83m=xDdth9l*Wy^Jxll8+G6-2s<;)B+jJy(lXzLR<fKOVm{Ln zoA|>?;IdgsvzyJvo%<V`KOZ$WHq&M)9lgE1t#9z&YrKIoc(fa|lk{5zUz#yvYnlTU zvab@!q6NiLJY%cMoe{xJKIYSWlDek2mIC1|zF{$kC;rH+B4epqGstD+2PEd7YdiMb Vg&F1M7V>i|j_p=XIc{OD@*m=*h35bO literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/error.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/__pycache__/error.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12f6a1b2f769530b47f31368fbc2613c4edb1d38 GIT binary patch literal 2978 zcmc&$Pm3c(6t7M?e<xwtQKE|og&=IeB(5wT7Lgg(LA(q?To1W)DqWRH4V~_`s(P6W zd)qyF@hb=(1iy?2FS+_HJo(=1PSTkP?#_C!p(@?)RlWD>{oeak-s^VTfBve}A5F&o zVx^}B?<X+q&oF%>8IvA+MYCe;WtB}lkXD$ilC;W{N74#NeI{!pt!<=Lkk*-OkhFnP z<+GPQo76zjWU@ty7E`dJPKpL7+Dsmi;)oPYQnZ-tuyMZ|LRj0!gSQhHwg(f$2f;za z69~^^lPZHa$NlR1=)2XajUSyElbGvYz7kgPbR|H-)m5lcr<1td=I~5Q3#VLL?iPyA zaQ${64<lhMe~41aVI%H)Lc%B0vyHiFAGQj|jY^HODt4BODB@{it)4}SpN`Lmk3bs< zrzDwB7@Qr_`+47AH-jJ+OBDp`b`UHRnML^C34$Lp5fz$75XdA9g5Q{_!})3Y`_qwI zrlVA+107ojUI#O&veo0O&qn#7H$UWYn63;av4u&jz|^VJ_giH7-5*4hsiz5eHA2UZ z(k-fBJwL5mrHY4JwdK!s0_TV1@3Nc2@I7RGddS*zx035v>JZWgnT?BlKF0tkgF81n zFT>pUw~jCM#lrE0NK+L9gq-&AWOk`S2X-NAvD0~E59f*DHWZOC91mdo90UdIRv9fK zeO+3bJI+FYwOGG})L?o|6(=7jY_uJ2`C9{J(2?vIMvh05zTX0m-Z+~f6iz*hC4im9 zgvj;pIUG_r!9fqPW=3%dWm-NBRYwVq!^RE+0x8Vqa~*0Zd|sG^ZXsmIE#zFsY36t` z=K@?0_I-zmRN>w8hBf@*Hg7e9-+Ot(+@Iirk6}8<7QkxKXRm-f{G2>$>*Jggp2Zr& z%8PmkMO_HEQ&*0sCJ7bvc6`BaChqq3y`(|;<_web3YHsLusJ)RMVC<KvOI#^p;V*2 zoE61=nhN9i+$2j#@B#pJXn?*q995>cPq=nKOg7o9wzQVqZPu3$K80BLLPaSNBXmWi z42LER7wD!4a8S@%agGAV5R;D&{^EEF!+s8vW9&tRIk-kD%zT6|mlgJcgqKzJlgB*g zZ$z}n1BxH_z4Lx;-PVwE?AK7OJLO1`KXt4faHcQJg(XshtH8G^ny(v6083n`Nw<hO zpq!Vwks7fJ(G4+7WLM_h^WO2UKe&zOaO0|9JJ{oBrevC^n(Vhhfu(4X4?4}dXHXKt z*gkJ|!M(p1)YocPsiT{f3Z0e6*VbvtM7dha*BPG+9U*fR<+&pewW$Ou)w@<^8O7=C z0;SsAE9hdwUdVSSQ!<#h+}$bXJ^=L?Mo!f&gWvxdzq5FU-{2;G3YD+LuVms)@!QbJ z|AXFM!2g0?nF$XQP2WG*gxfzzrHd9X*^?4__<i1QuUp&yaYP$*0n=?_I<SJ8bbWlg m><Im>qI4pIh7U2oy7@)^*X~RD|ApP(YxRzL%?I}$bp8SEqZKd! literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b433b688ca15bff319c53bb7785555c8d436f5f GIT binary patch literal 140 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHx4RFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358QOWr!smc2B@tJv<CGqik1(mlrY;yBcN^?@} KKt>h=F#`bMgdzz5 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f1b8cf4b9e312da0380f9e2ba99a0377746b440 GIT binary patch literal 144 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHx4SFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358QOWr!smc0DsYUwn@tJv<CGqik1(mlrY;yBc ON^?@}K*kmWF#`a0fg^PQ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/decoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/decoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb183b4dea9ab760be753a7c59b0cb666b99deac GIT binary patch literal 33664 zcmdsgdwg71edoFJl4kUl_4Gp?J67!RGj<+!9LJI05pg8PlH+7Z5M#}iJo0E}bnhsZ z2Af9`*rrWdD1}lebZN>`+Ol-%0$pecO(~@mc1ug4+?M?mSW5kY&vsd0yRe^K_WS*v zd+*$lMzQRM{bQZX(LL|qIp=qNuk$<i_O`Sn{`!5UdFYx_-&BEr`|v!3pFJN_DvSRO zl~-!kP-#OMjE5v1Qt6P6hgCkTW+N&c(ea4NN7ZahrDHlCRrv-r+o;lwYBsLYaW$Jz z>4chXQt2jLBBt`qYPLnCTXeiZ;;ky(s^g6kZ&T?u9gj=AU8UP~JR$K8mG02-CW&{d zbSL7?Y8tSwQKq40x|G?ivMuu5qn<L1bgwd7)J&gB_o-9aR+Vj2Ph*H}%IsH9g;jbj zQrlIwLsC1GxmHrwA+=Lw*GMW_UMH#RmAPI$rBr$Yvb$8aTe7>o>;a_qsBEvKqT2zf zv=OO&D%&rq{a)E5QrD{NI!RsUrEWs%dX?QEsT;i1%}5<k*^QFA(M!DrsY#XHB&nOc z)GbKetg^RA>Mh=I29df&Wd|j7P?>`Q*{w*uRb{tI>Q-gmDydtMx=m$MlA2QHR!QB4 z)a@#}LsEBmsVSuHRM}mUy31=}J5qP6>>f$oqs;Bn!VaX~rm}k_b+4DY6RG=D_I63V z-GgiwQtwdNJ0<l_Z*04fdY8)Xm(=~r+$8PpLFxgOy<1Z6_EK*{>OqygM^f+cQuiYD zkjmaGsrP!R`;dBAW$%;J`@GcKkvgQZM<n%#mwE?MkE-l3Nj>JJ-ig%XDtkgwPk5<! zA@!uno|4p4Uh00N-mkL5k~-|A9zg0VRQ3T$eZWh-8>y#N_CZN~&`Ujt)De{(mDEu$ z^&X_2QQ3zi^&v0ykTN^e%)Mν8PT=zS91NK|I-kVKPS^oT?;xjOf#L^pfUV-mf^ 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/encoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/encoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52cea128fd07677db0604bcf5d39d300ac64443a GIT binary patch literal 17672 zcmb_kTW};-c|P4enww^HUtRV(yY|{UzN|0!23{8JMOrV|(qhS8=<*^)nwEC7bJOV& zmWEw!HX$K#5|W}S0Rj}55O9E`s8l5dl}f6pJR~o92zlr?DhZ&<Ln=k8sDf0H@B2@8 z&x}?wHe{_nbFP1%^Pm5IPJ1Gs&wl?ao_DRP)W4~&e@`GkjmLjapHgM~SqfcTlebmX zQZ-w-wzAmfNZC=YW6B9tO{iL*a{ElVPgRqumQrrYl#{BOR<(?BGpd$VZdTR$mD{gs zIpyY5Ew9|XstqW2!1PY3>Y%C(DR;<}(^4K*?yxCmq&%YB5mU}ec~rThDEF&1OSxmp zv(@?m<&CRyPVy7#CChRr)unP?l?T+zSjB+yrqoMV#X-~#s`8N34k_=T)E+|Zuquy8 z?MPI67`3CSJSMexjp=&?wFgvrTx!Ro+M}qQP~}Ofos4Rap>|4@4@&L9sJ4LGL#ljO zY7a-X$5DGkm5)m8(Wv$WYLBUML23(8?H#B+uF5B*_C!>BCu;9d<vXSJ&ZzbzYEP>2 zT~d3O@{Y-hk?B+GcdPYN$~&Z9Qpy`q>qRLZj*9n4@kms>SBgiY;(byCG&A;oDHfvQ zX(=9$iVsLJ2KAs6PeiQ`N%798_;7FWEmAxwtwU=45h<GYqWEZU@v+|G<GsZvdW&!E zExxU{_+)SKOmFe+y~VR##Zk5Xj^5&QZ}D8GSUITN^AYkdD6bp&D8?8A@=@$YK8oGQ zN3k3ED0U+s#TXQjk7A7ci&DI!3;Ae`_hP2E6+6}4imgG>Yz^pVR*H9Z?G#$OcdEOH zo$4-Pr@D*SsqP|ns=J7t>MmlZx{KJU?jm-oyNI2Ni)N>~i`c2|B6cb&Rt_uo5_suu zRX!!W1kN!s<tgRi54(6ty#&E|nF4j8Slpq=ohw>FU)fvUTw})5x}lMAyhZ~*=~iQD zdAsHL#bl7G)LRcXR$4&{$-^iF86-Zd{2)=^tX6}x-_oX>tN8OPEwAM-ZZ|yuN~~Nj z3EWnR?@4UdD<8mba?|%#H>*L?tFJW5UeLE%Ev@-0oLBTOfy^`>|9wb2XaS2F0m2_^ zfXIhLbrTd7UIIc@xk)O7a)RrJz%Tcya#HeXRYox_`HU)?zpR3Yei;}+CIgJ*gVA%# zSVL*0b-Cr$W@J)&QCoQRii3pz(s-D^fXDx1BsVSff}?KXFQIPrshf_vnNa6%CDlz^ z>HE~pq-rU(ZmD@zVM3O=p_IPB1{BY)VlP;2t7&9!rKFFeo(8C`A`ANCTu|7B-EXGU zL{GnsYw9YX0dmy5030n8`{s6zVS+m!W|Cs^5hO)h=keo?VJ~JIx>jmkXw<RlO>9`X zm<|%YS6vM<ex<%v^%hHOLB8U5^>EV|ccEJHeK!+BaQl$GTz0c&Bg-6?@izsTE$?ee zAHo}dcIJUrt@%K+(!9Td7nZ8k`<Kh!=Jq374?ob{F8TF`q8}2&$^*-ue!#%fr<>bB z#^eF|IDq++NR%~bWv!%@w{up%lee>W#yVgP*zF^G?BnTpe7u)1FFJeqhbUmna(YbN z#D-yy#z;L2*xzu^?&e-|zg89Zd+Q|2dXZ_kec1d7w6KC(XsL|{)zucZ%prAxKtLMU z%o_=%KcZSN3qY(OnS>fg^T*^xBpz-uAemiE&FOJWZRZzENPRmWLef6;v{zqiT`z$D zz-NWV2Ryx6ZM;}Gb+TM6S~8@V2uA(QX0xGNm+NJ36(gP@n>kglu1Ui||CQ}?!267_ zeV?9ST@tMT9HcOU-St7#y195a0Y$dcB!@X9XHbh4415$d;qDAs3G7VDNm?0e82ge# zY1D2P_TL=?Vuf7Kf7~D&&%5yWqeu)ZVLw8Ak<9J6_TXHjRjAaORj=mNNyfIUPv3zd z#c*AHA1GBfy&z3OTWESK5kbvv)*;iHtqQnc_rm(k!k*{I%bWuzqpbF^{Z}A;=i(I% zqW=&cS;4ay4iW=%-bgDwNjd?Yfz#_5)|)&y-G5q05LAFaI}|CeI3j0~lo7Ym6dwzq zm35JXAU{a<TN%}Y7)q+G?^`Vq8S8yS)WvJxvtB@RR^94XH#6#1PTkBZ-?g?u!6KVp z=RH^JXH}w=RO=~qBdhd(E6cK4X|<lA7QK~MrU~Ru7_es(YHHPv==r^MOTDLsVTUZF zB=wZiSqp5{%v+Gi9FtV5j`X*X&FQli`ye%IgW$%SAW2cf6{k3FEEj7aTvy;`xk`&m z!TRu*5^M}ek5{FKRO*-I&7Y7r_p4S;tz-TJ>gE8)<1d~F>Hus|wT3u9wA{=Q<m0yt z%>NRYm_gLM2PlIB>n1k(kR87S&?cw{a>{?gMuD#x2Hd3DXmK80?I@e}k*NJDfcbL* zOeRG@z)3Mbr%!^!7TX7ekqbh!5Z{H9`fY`i{toq5`=BA^GAe`-@LPZaZ{W9`Tj^+k zLZE_dWfcrHQ){-iXWLIwwCGB??A1GvYY+@(IHW|SUTIZ6;1yOIy3o{>nkluQ`rDJ8 zw?ad7zq8nBiDcL*cDc9EENxdCrE)QvUU4)?qGiEr>3gw~z*$2s!yHt?X3f*3mghp- zG(8RF;CDDbaQtmQNPAl=OO^U+BXFLczod^~pe7p!sq5ZWd9&8k6sr0zCMQ@w0^`S6 zFAI?d3r10Q8Ionq({W{SPz0vFn<Gy#DKfc-$pcI%IQ0|~HyznSvQdFkDQ|)O(J&Ya z*?EIw$Y#toNM83!5WKsjk)|AZ8jsjQ3bHh3XCPaX)*(A#kJw53u$@HNLCrB|$jadt zHAs&*#~_K3!;@uC)D2ok*dMt&kPh*2vPg&V<m~pr{UscPD=A8nVt<fcTB?_7-qKQ# zU0MQNY*v}iEiG+qma3*jQ)BDLnFy{QV@@_gu+CkT#dR&127^A#WCRJ3=no*lny|v0 zlN-Z-j<l_yI{wFvoyOyH=q_^+QiEn8RIUT2NdzM^_453x+36W$>&0R_vJ6CQ(_Dh$ zfz|;C$cTlaGdH^kB}*a<)ytk#AdBd%gzNkqo=A%vy?p|qkz$lcF`=JCcYTJ*+nETa zI#4^H&!Y9Scm#CL(k$<d7?Sud#1JJ=BaWa)3>4Uo!NB=Oqw1CFA!=s##tnA{Qe5XK z`J0Gbz?2mX3!aj5uz)dd(#tFm#sYqXd^q_xiM%gkNQAtDz0>POT;FcQ2?6ely>|fa z7YUno2T07;tl1lXWb{4o2j2sji?IkSBtR#?VkkBC#3ElO6m}gMV3BqvRNZA#8$<|c z4%%NdH0TR>ZQet;G!{kM0q-*k#wd~ACzMG)26iRP0Dwa`Xj-UQgqzqUWr#OBCmYbd zLnN^12|tv%BEs9AZWJ!hEzVq;dA9A;8wGtorZ*cT{mNS1D=&V{Y+%vR=UG1sGJOP@ zU?j9PFEnaRxKJ*@Xz~%nUA^@tcltGq^C|C?h_R$Kk;uTzPe3sBBD8nklY8#_1%TO~ zb*9n!RXlzY31ud>pLKh0{~M4iL+2~4g_Z_lcS{ut5@JO59HvoZ3})yc83WL48$1Vk z4YGywDY1E$8rQQSk%Z;Rv#<c_FaqFOAT<V)kRXjgSXU{P^FJt%j1dDD*ivIRKsJ9) z%K_fUOR(Y63dSN|mllda55S+K(UVpaAh(dTT5v`GP9X(N0kR=N7_ed*!t{h;seh!5 zX^1@jIE$>R!%m9r#jLy+6pPuxYEu>_4!VY23TqBC*?L9{xIXcb-*3T~qoD`u4JNCZ z{RAdQz^H=}3_8bb(Acj&ZmTI8%L(-gEw!}T7_(?Gb(o`=p3}#G{vcN?ZC$v&S--JR z0kMm4TI^y6kZYr`*(`{0biX)Qg%x)9MXwigLElQXQTN1L&<_$Kyb7a8G^t4VLHY)% z<&sY?T72#xi5%@1v0j{7rC!YMYeTsGVy798$jz0i!hNC{KnQq=m=~9sqqPCQz13(2 zeQ>OGt4ooRV1@X<i;U07f~D+1SPxn20BnX4>j+rvB(y&KGw9X>PA;|(z;@Q1cKh&d zg6?IyH?E~-@bd3)8dTHJQY`<<Y&IeY-<#3;0XSx~PjwiL#yHspo)#$|j@LaMM)Thx zJO~mJzU%Zc943A`9d<DTNP?(`$Kp51Kcq@<Oj41%ZVAVtYeFP0Ip<TtIe?K2IR|`d z+`#{k2^lUDp4H!rxJZh8Q@WRnK=@b#AYcYyT5yrA>hJDa$zv9!NjJ>N&}jn~;csu4 z7}5(9+J`<RI1|ArU<V5n#>OHh$Zp_nI+E|Vu3-7(MU*=nh${3>f)_JtV+Onk(IM7_ zm<9-I2o=9+?(5f2VRtpRSYKj7nl`LRH6+Xc6^b0it$rsHG1U6^Wi`V}GMx@TIn9O- zMkn9z#ZEs2T%TqZ4RNy5qyuKMr=X?4N(mU}Au}DIq2A3{wquP!%~<w0Lsds_C*xn0 zz2-2Pf9JG>y==|$-t6^;jlljn1a|kdT^s-xJ@)@;9p4FRkl7=~GST(wUW~j+>+ao{ z>2U&%tvlBInuwX0UtaeRCx%zts;pK#eH)TUpu~+J=_s}YtU;FFOWBj1A#_9}Z6huu z`hJQ6201cXN?om=LLA1HAWTJqFpgRWJBg)-fMFOxl!yyN6qr2WKo&JVN~S}mZY$f; zQ;ebjBF)Ud5S7}eCKzrMwT|hLttY_l8}F5##vuJy_I#aQka~azn-nS<!RdW^!YJj0 zMR;{4T%V?lfFvV`3$F*FK2E!K4-l(j#B6<wtGIaWtCU&9Kqkb%OBSr+7z2OAkPO-| z12Ga-Efm-RG1>nK^V4XgY(qm9Vcd*F;<0Z(<e9GNK7F36%p#i8-EZS>#pFPJ2s@lG z3>1h$1eoH;*v6_cP7pE68?$`CnC0RlwQ~#C5w$JMU%rT#$qpk7J9IpD$k{trkhD)+ zu0cTgmE|e|FBR>#9`HScams~~Uhxa17RDif4cT{q2_wkusX1@0B#|1zML))4q~|Qm zbIMXTRq_`%5k?KNj2Lf8JgE~<Def;q1E*0b;{b;<fu|r-36f$v`EC-y<9ReY+S?ss z71QKia_2POPir5t)Nx>(4A^-DHV&iaD4v7-wWlCUk2>QBbL0`)7(zffkAQ{*{hhpX z#BSfQ4_p3P0_0gt>{O2cVNH(!p){Pv<5P)vKqQO=q~LgSOoc-xIi>=;f*oIm`C$&L zgzZq|VHN(&0hPo&7mC@S|5>jTNnhhMKL_wDd>Q}I!b#w{fXDw|BpCk!RJI&N-4y5X z2KN3a$(yGVm<>1|H4l=mc^Uzs<fyma!Vl)_2n%kr7ISQgz@iJ;r^aDakBzclckMye z((*VX!wm=j)osJ!D(o>lrJ~_mr^Rp)l;G7j9HoCCGqcRh1cy)HJsW?muHd<fDbrgq z1CT*XhQ4-xSFAzId`)ES5Lr7zOo%GPt|TDAWak(7r%O^BIHhG@Uu3>7uxddHzA-KL z!14mS<_Gp|gd2=3m35;zi%?|?uHKafyartNQ2t#2BEdO0l8hx}ksh`tBprk99|3J= z5v1#b?(f>))3<|LA-D4%RY?+$Z1gAb5^UEC*yU)iL1frjY~UIyVRngu3t@O8DF=-b zKmeM;dYqIZh6Vh=!VNoJCpw{l*vZs~olurP0){pM$;cmzAXglCf>t3bVI<=HVgiG# zw*H2K8X_IkbMe}1B1#Q-fXKp2!xZ@=KHwB4^MU|^8bI|K(|X3Vo}p<S_JdC>F9%c* zvH!4~aqQ6sJ@OiLioC-RJj$jcW(R9LYy=>nFq{pI)YouW2b8rfr1VfBv!N@{1$KNC zb}<!bk-7!?l%z95aZAjRwixqR)$c>D{Y+`I)xarhWd$dm+i)ZsJ|gMQ&YXL?6HX_o zK^WgxV2DLBwG!+K-!DnQ+iJqytW%~JQ$cpQ!l2xFjL{4n@z@+h81(5<9r5X9&ViIH zUTBZVUSV%*SwlcU;(){n!%au;auF&wFM>0PiRiNQuk12^gMlS10;>oo0W>QA9(3h# zEdLv~@i@#eyqvQ~6K}Pj0?iLWrn6=YQJfyi?*SLb8OgM<6ZdWKF?IqodL07_QFz>C z;)yLB8T}})FtI>Z=_CCzCW6zot3sXtX52HHAK(>?_zEdZ`%De>S`2r{AkYt_D?9xz z#cA_X6rrdLkBrEE9cca1@pBGtCxAi7QJ_X~DoN=O#+VHRuuvGGVy}KoQUfc^bAVh- z;JZ#(Td#7;uo0%i*B`Y^nHK~&sXR=Ll-l?y3`B@-j2w`cuUcEDWaMBx@;x$gNUj!i zjeN)$BE$0P`lBiwHxiHgeHk~pdtAkg8<TOE93nE|(9UH4se7{hX0rWi<5dhrX-JH& zA6c!GTF2rKP+s5=oIHotesz|}fF$90WrTiz)MoyOEb=b91x7@1TuqaibE^J%1%1M* zW9kOZ5ufkvfk@Fr2yFoC0p5!C)fl#Z#YP9D@OY8Inx+61n>fun7=scZ>w-~`S$t1M zeed>BIgLsT8|T8pVJ4Qv$>!y_bX;)opLU1?UJVo+h+Rk$_?cb5B0UXJjXI>0yxFYB zr2%L}zx$-2-!vQ*Y8sLPQ3PlPMbRvP)PZojblYJU5Lwt|064-)Br1p_xB?5#RrZKi zk8{e2TZ8H*qWv-1hx3Q;Vgekz%)rC><8wRH;N#hyb4V9=vPj#<A$b~Q2A)L<O1O;| zgb+0LG(*s}cG@{vo;m5CEQ{ImGwWW7K^sX+Th?fC2J?)4OG&FKeRp`^uHVmG0ZIG7 z0>rLYSOsjHPDZyRU=yKjoI<D&$-KC+J#j@hu2+^TxJXctE}?iv;Cln(5cqx(KeMwa zYg68mve*)#L1E0b66#Gw&e+$PihrfL>0hp|y4i~VOr<V)iBFiIArYjTOlY{s1qKsR zOtE+ZNpWcZI0gm0t}&sA4{YEP&XE#9?%Mt;?3hMi)m<BRLL_`BCrFYUX1{xpyh?HY zGBU;(&*0>c&mcrM@7eGK@nQKrgf#2mMh8UuF!KBzu=0-i#aW^)IkXJg0~j}HjY27m zK?&T2^TxaJATT1K69+lM&O2Esha}#|USoFNX-{-33ZWY>JRHmH8S95lgZM6jpwPE9 zuXVjq79D9&%H?$_v(CD&p<#vVCi=}8z{ug;aV_<zivQ6fo5tgFCxGMI?R;2aKpqc+ z%mL8gg151WiBnthHqC6T-$<#$c-}>Le~RsfaZRC)I6jyM5(9d}-0Q#<GFZh=hH48O zrr$zqulX2XVgm7CM5so@H-BtV{Xxw@yFdWGz?4E2mC!nfus`I$x?vGvK(V1OUaMFy zNTiRxEI{N!7kP?7_I}D{{r6NYxbu-ij&s?PxnQ#Wbfjep8(Y#Dmok3B&Kzh&)=#=d z;LW`wuok=yONP9~jOA?zXv)0_Xb+V0N}G(F1weqU;}XW8TF2d5lNn|Po;9uA8Wj#4 z1Wo|QU?apP#5PCKI<@3z03z)NR@@0aP)l))PNN(N5v)HefT&zeZv$02nE`AdCVpTc zg++kT-I(Z_MW;VdbhZAM*48&^U}Aol)A|@+ck$Y1qAloG+r!)*F8zRnSg+PkBk}`9 z0n|Qa^ZLz%TAvjAL;9d|C$1pzAA?5yLE8X92kOEP+MMstWxl;T_j5rsz<<N;*|~3Y zjp*Gui~zR(!N%Hd+c``MTLlebHt)j@^u_D#*>R_{XV}qr&oHWI&pz#hdj`<)o}p8` zXY&Fm+%xo!_beI^?b)ZDaL+(D5%pq4@t$?}-}pI<73e~-NF;Kdn+rx7xa1=DW9H@J zSgGo_?>q^+KGbU-ug(<auPk1kpM#yhf)i0O;Qe-@j+<(t%-ScIjfdRc8P|8($9wu* zoS8lM+|!F4c<7=}Lwp437j>!0%eL()=9<u4FII3nkc9$o;t<#!Jef6)1n*@OPMq{l z6!?PG#wG$s6?h(cu{dS4(Src1Kg8q_zF?pNrNwJP6~6^fB*@2W;#>7Y?30uOE1#Mz zLW`TK_#&^}{)&ImTP<x?p;g^1FX5R`4K4vU%e=vpZZy3*f#J3f(#vJd3m-ur&dcUk zgKQ*5kx!H>xQC1xEnpQKaTQAqvRqS{Mczk7K1jdI+uj|)dYwBvq7b=a+<5IQb!A)s z7V0!VN(nOYs)J1YI{jg`UqRw_u)-ULU8*M5u7l7Z{wL8_LC@h9PUsNfCJ!_uG@pG; zH0&tSVau^6!`~!zCt7*ehc47%X9P}Go}n;n%sG-chQPuwf?*kJG9J@47Wahq8+*`h zABu1rs;FNQEEA&GSCt}2q_SLO0vV{%1Wv<t1<TN?rt$a;Y3@>@uqdfMAyT7A8C7W? zEXiar9L;lnHJoXzOZx#S_7(pTh0s@o>bg^uol&hgh`XPbEfivS<x)ZbYiNahGY9Bm zxblE3rM5mq5fAYxBDyKTH8?sD_NYZFkpU_XXdAd3#y3R-4E_uv6*vI5pfFK3`UvXH zh^;JR5U8hf2@n!mH(DGgc9@5`&baZc-0J3KBcZU@;p}2ce*|mRA4L-2+^Q-3sDG1n z!o5j~gnGFr7(nEA-B|k_j!lNg+(OZ$c>M|!()KQ54u+RRba}B%@o{vZ`~tc%`bBaU zqLVYR5!4LHvGTAzj417G8+rORXz|uE@D*<@g&pl8q)?GS9#9LUii3}!AnYaVF3=A1 z34bE4?YTu*?7ZD=j@=XM2-Ovn`y0`Jz^;23#$V$4I2(nvjo^~`?W-^-2@TZSj;Ul0 z`!de&0r1Owg<+iB5zQJ}^zlEms%boL<aS&B!u3WawmM^MrZJo^AjA0IMABiDLka`~ z%)%;!ZBuWnPbjKKqS98sAw6N30>u}BVDJlBLt=bjRYq-JWZVQQ8#Za&q}Ry2&2`38 z0KH?UU?l849&Di+EHFjOSD0anF*$%XW#JfDaQKtm%*?I8PM3eg2A9Hn;UY@F#-NRB zM-{HmfIP4iz@}9Qo|59H5Jbj>S=n4%L;EBK7VW@3{UCxm$XezSU+fnAEPJL3bw`<h z_M6epWRzpI@9#lwx4b-krrLnV>7PX=8f%Vpj^eN-Rv*6Hv@%fS2u8Ov&p<a;aQ0GY z_su~|7sQ2JEGFF?F1*HUCQNQr(g{qu<0cl<`;#=eIOwCs@@3T#2JR+=ST}v0YaBt9 z@%)bAZpgg|Un5*?x2N`9@!XrZrub>V{u<wchZjIt{*@^_d#=8{TMtlBkS5-R$A2D4 zH+dT(AbCUlAMd&@fddS=`+yE0?T`h8hNu&uh=c{86LR1LAw$UIlYqX6wLgX5UAGb5 z<Yl+-5+hlF5xm1EK47=UJB#ZkuQ!8iew_53E@ZRZgKP&C(|G*1A@Oc^X5~&}Mb44H z;xD5J<_0Q6A+rb`wnQ_h!hM)qAx!?`FE{xD9-k2#;1<k@5DmE;8NgwD$eIHO4lRY_ zmzHqR`<YS`+NDziiw;$g;pX#{ut$nUBI<WZYF<a?ee|WJ0Zc(;se&?U4~6hfN6qm} zc{hYCAS81HbLLkOu{#}I7sA0o=Oc|ocp4AC3Qp6!oW_HIgix@~(5HZrVZMJrO!?aq zQx?HS2`RP>=}B*jeB7dZgwSIf3<*Tq&^4aJ7estP)GF2dGa*&U^G%Wa55XN9Am0~A z5Sb97QZN2AatK8l6XmB-511rU&mP+kNdcw|KH;Eqi)r7@GZs3xa8%*VAr6Zmclc$) z)%w@rmgWTo{{pX+SB?lDCf5~-K@3nygh-RT@!BEz@yUZpjhRJ<7t?^_XY|0;`n@sa zZxM3%r4*(HBEt6~@hN(Y-+z{gB3uzqH11{@mlzFj6fs`N54fh$AXgvtl+9IQaac4y z{*pLn>wsDx5A)!7W1gi!u=%<68By?XmI@VL{HJpZbEh9NZkBx6hG<Wr1dr-O^sSL` zv)1sDM7@39Gl8H2&x7En(e3i_89;&GRNQAS8sZ$N%>yCP5+rmv1`_w`ZCM=bi|h&P zO5KD-XF<NAE!xFRez#YUp3pY<jE+!N%$d{jwwa?`Drk?-HH`OZVy;}yDV#60PyI3w za)l9K+fT+XSl+Buc{&w+$<bIX;K&~z6~eLOCn(`}fm#$`)#Ddh6Z&P$Iv6<D!d2Pj z&6c;zQ#0XEdZF%MQ+ut}_7z;IZPC9AMpi3ZUK#GBxg059sew5FO&U5^J3q(D%+k^d zzgJvZG7-byMy0tW#_Kuef|y+U`Yek>OinPN_`)F)41>&W&3X@;IDdB#KJf~s7lro( zu$yJXIK1n*N1T;Hio3tGG(sVD9)J{1g!w^7UYt1diN;m9c%yu9AA+~aj-riyGR|b^ z?j1$#F?$l}U3RyKGr-{%JjsckVe)n+Ut;oQCSPFk6($`^H#U6qXV8%0)Y8aEJk%LX zNNw?*`eD?$N%O^~K@xi6|Bzs6P76_-UiP$3u=+q;ja%WZ)7V0OL?ai&-Lc*_b6cb< z+|9R}Xau#RC|S2Z97C?aR|lw;U1Y34Gol)#mX-vy?tu2z7_HDxH`dlXPjKPpFV38Q z?$XlC+=cmzGtY+JQA6%>$=4+E<%C@S*V6<!!(@)hyO})8gi&GfYQ;hqBSurXy7*i$ z{-VTO%1wn|DY&W2X5nrozD(=(cU}E+6TI%`4(-0b;$~-}Z=A|*g28YNQ=A_Ka}$hF z=4PK;oPEOFgmv?C{3NQf5*7!AYf88!6typUWWcSkIPiR>>@_;&%;j^BMm;Yfcyv96 zlz+Y=w~gXf4>zDo)v!4D96ssxv>#Vw&OdV{Yzr54(eqbyrHOMGckq%K3@KM$tkgU= z_1xkGX7rzMaUvNU1b%{a<YT!G3?lt`wvssa{ah$WpE2JcolT*e|3xG@dk9C*{O@#> zLnLL=8UNUL-*{?#Y`i%BcKkj${?+mJ_{s5+@qTlR-Iam~@t;ZMh<kV2fxfPq-F;tg JTw;9V{{RjZu4w=O literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/eoo.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/__pycache__/eoo.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba452d9af3a5ede944eef107d681a281de229240 GIT binary patch literal 792 zcmYjPyN(kv6uq9AOeQa~2qB=MMN@1d5CsK7ixAMDq{u?y#&Tx7(PTXjY=<Q%U8wmB z3O<O&Efv2&#k~_E;>5@IVf&nWJ@-bV{?G49nE>DyoQw$V3!HY2kmH|$1}GVD28{fm z^#kAm`XQ_^6T;g(g1iG?G2a2jU>(6e1detG_5eJFJcdQu{f(DG%6znxR^b{tx$*;5 z<@2j~=9IG;Z8(k&8W%Y2I|PN-Fj9oXC<;kc1Z!kKj9cusm{1nU_qeA=a(N$6CkjM$ zd_a*!+VO+e|49wQ`)3&;jSy#qlR9802s?mv+l=c3%p-7EUqHbfgIxgM5COz-+ahJN zH1s`DRMyEVQ$DVjYn3_Q6{1o%LSQz`wDplRE9>Ly8(M#W86wr6XH!=;)23+7+w)qV zFLSloKK=Y;+H9q*9v_#i&Q&&DDl=7eJ!!Tk!Q*#Ha*P0M%<czY?wnLPInob(f~G8$ z5WX)&S?3!~_E3nA8>#<ghPk?u8|^+wy-|jG!uv&4xJ$WOD91xw`E7i@S6W*8zA8Q` zW2NR}485sMDczzd8?AVZ0X$$xRjaYB^8`kepr<Co_7R3G#^1v*4%+xE?ef8)_=(## z?KcapB5JABS_ppY!1fXwbV*z2K0}XqLPY&FMB<a@hoWC}(X-UJGj<mA!UyBO0HLvD literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/decoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/decoder.py new file mode 100644 index 0000000..5ff485f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/decoder.py @@ -0,0 +1,1682 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import debug +from pyasn1 import error +from pyasn1.codec.ber import eoo +from pyasn1.compat.integer import from_bytes +from pyasn1.compat.octets import oct2int, octs2ints, ints2octs, null +from pyasn1.type import base +from pyasn1.type import char +from pyasn1.type import tag +from pyasn1.type import tagmap +from pyasn1.type import univ +from pyasn1.type import useful + +__all__ = ['decode'] + +LOG = debug.registerLoggee(__name__, flags=debug.DEBUG_DECODER) + +noValue = base.noValue + + +class AbstractDecoder(object): + protoComponent = None + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + raise error.PyAsn1Error('Decoder not implemented for %s' % (tagSet,)) + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + raise error.PyAsn1Error('Indefinite length mode decoder not implemented for %s' % (tagSet,)) + + +class AbstractSimpleDecoder(AbstractDecoder): + @staticmethod + def substrateCollector(asn1Object, substrate, length): + return substrate[:length], substrate[length:] + + def _createComponent(self, asn1Spec, tagSet, value, **options): + if options.get('native'): + return value + elif asn1Spec is None: + return self.protoComponent.clone(value, tagSet=tagSet) + elif value is noValue: + return asn1Spec + else: + return asn1Spec.clone(value) + + +class ExplicitTagDecoder(AbstractSimpleDecoder): + protoComponent = univ.Any('') + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if substrateFun: + return substrateFun( + self._createComponent(asn1Spec, tagSet, '', **options), + substrate, length + ) + + head, tail = substrate[:length], substrate[length:] + + value, _ = decodeFun(head, asn1Spec, tagSet, length, **options) + + if LOG: + LOG('explicit tag container carries %d octets of trailing payload ' + '(will be lost!): %s' % (len(_), debug.hexdump(_))) + + return value, tail + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if substrateFun: + return substrateFun( + self._createComponent(asn1Spec, tagSet, '', **options), + substrate, length + ) + + value, substrate = decodeFun(substrate, asn1Spec, tagSet, length, **options) + + eooMarker, substrate = decodeFun(substrate, allowEoo=True, **options) + + if eooMarker is eoo.endOfOctets: + return value, substrate + else: + raise error.PyAsn1Error('Missing end-of-octets terminator') + + +explicitTagDecoder = ExplicitTagDecoder() + + +class IntegerDecoder(AbstractSimpleDecoder): + protoComponent = univ.Integer(0) + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + + if tagSet[0].tagFormat != tag.tagFormatSimple: + raise error.PyAsn1Error('Simple tag format expected') + + head, tail = substrate[:length], substrate[length:] + + if not head: + return self._createComponent(asn1Spec, tagSet, 0, **options), tail + + value = from_bytes(head, signed=True) + + return self._createComponent(asn1Spec, tagSet, value, **options), tail + + +class BooleanDecoder(IntegerDecoder): + protoComponent = univ.Boolean(0) + + def _createComponent(self, asn1Spec, tagSet, value, **options): + return IntegerDecoder._createComponent( + self, asn1Spec, tagSet, value and 1 or 0, **options) + + +class BitStringDecoder(AbstractSimpleDecoder): + protoComponent = univ.BitString(()) + supportConstructedForm = True + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + head, tail = substrate[:length], substrate[length:] + + if substrateFun: + return substrateFun(self._createComponent( + asn1Spec, tagSet, noValue, **options), substrate, length) + + if not head: + raise error.PyAsn1Error('Empty BIT STRING substrate') + + if tagSet[0].tagFormat == tag.tagFormatSimple: # XXX what tag to check? + + trailingBits = oct2int(head[0]) + if trailingBits > 7: + raise error.PyAsn1Error( + 'Trailing bits overflow %s' % trailingBits + ) + + value = self.protoComponent.fromOctetString( + head[1:], internalFormat=True, padding=trailingBits) + + return self._createComponent(asn1Spec, tagSet, value, **options), tail + + if not self.supportConstructedForm: + raise error.PyAsn1Error('Constructed encoding form prohibited ' + 'at %s' % self.__class__.__name__) + + if LOG: + LOG('assembling constructed serialization') + + # All inner fragments are of the same type, treat them as octet string + substrateFun = self.substrateCollector + + bitString = self.protoComponent.fromOctetString(null, internalFormat=True) + + while head: + component, head = decodeFun(head, self.protoComponent, + substrateFun=substrateFun, **options) + + trailingBits = oct2int(component[0]) + if trailingBits > 7: + raise error.PyAsn1Error( + 'Trailing bits overflow %s' % trailingBits + ) + + bitString = self.protoComponent.fromOctetString( + component[1:], internalFormat=True, + prepend=bitString, padding=trailingBits + ) + + return self._createComponent(asn1Spec, tagSet, bitString, **options), tail + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + + if substrateFun: + return substrateFun(self._createComponent(asn1Spec, tagSet, noValue, **options), substrate, length) + + # All inner fragments are of the same type, treat them as octet string + substrateFun = self.substrateCollector + + bitString = self.protoComponent.fromOctetString(null, internalFormat=True) + + while substrate: + component, substrate = decodeFun(substrate, self.protoComponent, + substrateFun=substrateFun, + allowEoo=True, **options) + if component is eoo.endOfOctets: + break + + trailingBits = oct2int(component[0]) + if trailingBits > 7: + raise error.PyAsn1Error( + 'Trailing bits overflow %s' % trailingBits + ) + + bitString = self.protoComponent.fromOctetString( + component[1:], internalFormat=True, + prepend=bitString, padding=trailingBits + ) + + else: + raise error.SubstrateUnderrunError('No EOO seen before substrate ends') + + return self._createComponent(asn1Spec, tagSet, bitString, **options), substrate + + +class OctetStringDecoder(AbstractSimpleDecoder): + protoComponent = univ.OctetString('') + supportConstructedForm = True + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + head, tail = substrate[:length], substrate[length:] + + if substrateFun: + return substrateFun(self._createComponent(asn1Spec, tagSet, noValue, **options), + substrate, length) + + if tagSet[0].tagFormat == tag.tagFormatSimple: # XXX what tag to check? + return self._createComponent(asn1Spec, tagSet, head, **options), tail + + if not self.supportConstructedForm: + raise error.PyAsn1Error('Constructed encoding form prohibited at %s' % self.__class__.__name__) + + if LOG: + LOG('assembling constructed serialization') + + # All inner fragments are of the same type, treat them as octet string + substrateFun = self.substrateCollector + + header = null + + while head: + component, head = decodeFun(head, self.protoComponent, + substrateFun=substrateFun, + **options) + header += component + + return self._createComponent(asn1Spec, tagSet, header, **options), tail + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if substrateFun and substrateFun is not self.substrateCollector: + asn1Object = self._createComponent(asn1Spec, tagSet, noValue, **options) + return substrateFun(asn1Object, substrate, length) + + # All inner fragments are of the same type, treat them as octet string + substrateFun = self.substrateCollector + + header = null + + while substrate: + component, substrate = decodeFun(substrate, + self.protoComponent, + substrateFun=substrateFun, + allowEoo=True, **options) + if component is eoo.endOfOctets: + break + + header += component + + else: + raise error.SubstrateUnderrunError( + 'No EOO seen before substrate ends' + ) + + return self._createComponent(asn1Spec, tagSet, header, **options), substrate + + +class NullDecoder(AbstractSimpleDecoder): + protoComponent = univ.Null('') + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + + if tagSet[0].tagFormat != tag.tagFormatSimple: + raise error.PyAsn1Error('Simple tag format expected') + + head, tail = substrate[:length], substrate[length:] + + component = self._createComponent(asn1Spec, tagSet, '', **options) + + if head: + raise error.PyAsn1Error('Unexpected %d-octet substrate for Null' % length) + + return component, tail + + +class ObjectIdentifierDecoder(AbstractSimpleDecoder): + protoComponent = univ.ObjectIdentifier(()) + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if tagSet[0].tagFormat != tag.tagFormatSimple: + raise error.PyAsn1Error('Simple tag format expected') + + head, tail = substrate[:length], substrate[length:] + if not head: + raise error.PyAsn1Error('Empty substrate') + + head = octs2ints(head) + + oid = () + index = 0 + substrateLen = len(head) + while index < substrateLen: + subId = head[index] + index += 1 + if subId < 128: + oid += (subId,) + elif subId > 128: + # Construct subid from a number of octets + nextSubId = subId + subId = 0 + while nextSubId >= 128: + subId = (subId << 7) + (nextSubId & 0x7F) + if index >= substrateLen: + raise error.SubstrateUnderrunError( + 'Short substrate for sub-OID past %s' % (oid,) + ) + nextSubId = head[index] + index += 1 + oid += ((subId << 7) + nextSubId,) + elif subId == 128: + # ASN.1 spec forbids leading zeros (0x80) in OID + # encoding, tolerating it opens a vulnerability. See + # https://www.esat.kuleuven.be/cosic/publications/article-1432.pdf + # page 7 + raise error.PyAsn1Error('Invalid octet 0x80 in OID encoding') + + # Decode two leading arcs + if 0 <= oid[0] <= 39: + oid = (0,) + oid + elif 40 <= oid[0] <= 79: + oid = (1, oid[0] - 40) + oid[1:] + elif oid[0] >= 80: + oid = (2, oid[0] - 80) + oid[1:] + else: + raise error.PyAsn1Error('Malformed first OID octet: %s' % head[0]) + + return self._createComponent(asn1Spec, tagSet, oid, **options), tail + + +class RealDecoder(AbstractSimpleDecoder): + protoComponent = univ.Real() + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if tagSet[0].tagFormat != tag.tagFormatSimple: + raise error.PyAsn1Error('Simple tag format expected') + + head, tail = substrate[:length], substrate[length:] + + if not head: + return self._createComponent(asn1Spec, tagSet, 0.0, **options), tail + + fo = oct2int(head[0]) + head = head[1:] + if fo & 0x80: # binary encoding + if not head: + raise error.PyAsn1Error("Incomplete floating-point value") + + if LOG: + LOG('decoding binary encoded REAL') + + n = (fo & 0x03) + 1 + + if n == 4: + n = oct2int(head[0]) + head = head[1:] + + eo, head = head[:n], head[n:] + + if not eo or not head: + raise error.PyAsn1Error('Real exponent screwed') + + e = oct2int(eo[0]) & 0x80 and -1 or 0 + + while eo: # exponent + e <<= 8 + e |= oct2int(eo[0]) + eo = eo[1:] + + b = fo >> 4 & 0x03 # base bits + + if b > 2: + raise error.PyAsn1Error('Illegal Real base') + + if b == 1: # encbase = 8 + e *= 3 + + elif b == 2: # encbase = 16 + e *= 4 + p = 0 + + while head: # value + p <<= 8 + p |= oct2int(head[0]) + head = head[1:] + + if fo & 0x40: # sign bit + p = -p + + sf = fo >> 2 & 0x03 # scale bits + p *= 2 ** sf + value = (p, 2, e) + + elif fo & 0x40: # infinite value + if LOG: + LOG('decoding infinite REAL') + + value = fo & 0x01 and '-inf' or 'inf' + + elif fo & 0xc0 == 0: # character encoding + if not head: + raise error.PyAsn1Error("Incomplete floating-point value") + + if LOG: + LOG('decoding character encoded REAL') + + try: + if fo & 0x3 == 0x1: # NR1 + value = (int(head), 10, 0) + + elif fo & 0x3 == 0x2: # NR2 + value = float(head) + + elif fo & 0x3 == 0x3: # NR3 + value = float(head) + + else: + raise error.SubstrateUnderrunError( + 'Unknown NR (tag %s)' % fo + ) + + except ValueError: + raise error.SubstrateUnderrunError( + 'Bad character Real syntax' + ) + + else: + raise error.SubstrateUnderrunError( + 'Unknown encoding (tag %s)' % fo + ) + + return self._createComponent(asn1Spec, tagSet, value, **options), tail + + +class AbstractConstructedDecoder(AbstractDecoder): + protoComponent = None + + +class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): + protoRecordComponent = None + protoSequenceComponent = None + + def _getComponentTagMap(self, asn1Object, idx): + raise NotImplementedError() + + def _getComponentPositionByType(self, asn1Object, tagSet, idx): + raise NotImplementedError() + + def _decodeComponents(self, substrate, tagSet=None, decodeFun=None, **options): + components = [] + componentTypes = set() + + while substrate: + component, substrate = decodeFun(substrate, **options) + if component is eoo.endOfOctets: + break + + components.append(component) + componentTypes.add(component.tagSet) + + # Now we have to guess is it SEQUENCE/SET or SEQUENCE OF/SET OF + # The heuristics is: + # * 1+ components of different types -> likely SEQUENCE/SET + # * otherwise -> likely SEQUENCE OF/SET OF + if len(componentTypes) > 1: + protoComponent = self.protoRecordComponent + + else: + protoComponent = self.protoSequenceComponent + + asn1Object = protoComponent.clone( + # construct tagSet from base tag from prototype ASN.1 object + # and additional tags recovered from the substrate + tagSet=tag.TagSet(protoComponent.tagSet.baseTag, *tagSet.superTags) + ) + + if LOG: + LOG('guessed %r container type (pass `asn1Spec` to guide the ' + 'decoder)' % asn1Object) + + for idx, component in enumerate(components): + asn1Object.setComponentByPosition( + idx, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False + ) + + return asn1Object, substrate + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if tagSet[0].tagFormat != tag.tagFormatConstructed: + raise error.PyAsn1Error('Constructed tag format expected') + + head, tail = substrate[:length], substrate[length:] + + if substrateFun is not None: + if asn1Spec is not None: + asn1Object = asn1Spec.clone() + + elif self.protoComponent is not None: + asn1Object = self.protoComponent.clone(tagSet=tagSet) + + else: + asn1Object = self.protoRecordComponent, self.protoSequenceComponent + + return substrateFun(asn1Object, substrate, length) + + if asn1Spec is None: + asn1Object, trailing = self._decodeComponents( + head, tagSet=tagSet, decodeFun=decodeFun, **options + ) + + if trailing: + if LOG: + LOG('Unused trailing %d octets encountered: %s' % ( + len(trailing), debug.hexdump(trailing))) + + return asn1Object, tail + + asn1Object = asn1Spec.clone() + asn1Object.clear() + + if asn1Spec.typeId in (univ.Sequence.typeId, univ.Set.typeId): + + namedTypes = asn1Spec.componentType + + isSetType = asn1Spec.typeId == univ.Set.typeId + isDeterministic = not isSetType and not namedTypes.hasOptionalOrDefault + + if LOG: + LOG('decoding %sdeterministic %s type %r chosen by type ID' % ( + not isDeterministic and 'non-' or '', isSetType and 'SET' or '', + asn1Spec)) + + seenIndices = set() + idx = 0 + while head: + if not namedTypes: + componentType = None + + elif isSetType: + componentType = namedTypes.tagMapUnique + + else: + try: + if isDeterministic: + componentType = namedTypes[idx].asn1Object + + elif namedTypes[idx].isOptional or namedTypes[idx].isDefaulted: + componentType = namedTypes.getTagMapNearPosition(idx) + + else: + componentType = namedTypes[idx].asn1Object + + except IndexError: + raise error.PyAsn1Error( + 'Excessive components decoded at %r' % (asn1Spec,) + ) + + component, head = decodeFun(head, componentType, **options) + + if not isDeterministic and namedTypes: + if isSetType: + idx = namedTypes.getPositionByType(component.effectiveTagSet) + + elif namedTypes[idx].isOptional or namedTypes[idx].isDefaulted: + idx = namedTypes.getPositionNearType(component.effectiveTagSet, idx) + + asn1Object.setComponentByPosition( + idx, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False + ) + + seenIndices.add(idx) + idx += 1 + + if LOG: + LOG('seen component indices %s' % seenIndices) + + if namedTypes: + if not namedTypes.requiredComponents.issubset(seenIndices): + raise error.PyAsn1Error( + 'ASN.1 object %s has uninitialized ' + 'components' % asn1Object.__class__.__name__) + + if namedTypes.hasOpenTypes: + + openTypes = options.get('openTypes', {}) + + if LOG: + LOG('user-specified open types map:') + + for k, v in openTypes.items(): + LOG('%s -> %r' % (k, v)) + + if openTypes or options.get('decodeOpenTypes', False): + + for idx, namedType in enumerate(namedTypes.namedTypes): + if not namedType.openType: + continue + + if namedType.isOptional and not asn1Object.getComponentByPosition(idx).isValue: + continue + + governingValue = asn1Object.getComponentByName( + namedType.openType.name + ) + + try: + openType = openTypes[governingValue] + + except KeyError: + + if LOG: + LOG('default open types map of component ' + '"%s.%s" governed by component "%s.%s"' + ':' % (asn1Object.__class__.__name__, + namedType.name, + asn1Object.__class__.__name__, + namedType.openType.name)) + + for k, v in namedType.openType.items(): + LOG('%s -> %r' % (k, v)) + + try: + openType = namedType.openType[governingValue] + + except KeyError: + if LOG: + LOG('failed to resolve open type by governing ' + 'value %r' % (governingValue,)) + continue + + if LOG: + LOG('resolved open type %r by governing ' + 'value %r' % (openType, governingValue)) + + containerValue = asn1Object.getComponentByPosition(idx) + + if containerValue.typeId in ( + univ.SetOf.typeId, univ.SequenceOf.typeId): + + for pos, containerElement in enumerate( + containerValue): + + component, rest = decodeFun( + containerValue[pos].asOctets(), + asn1Spec=openType, **options + ) + + containerValue[pos] = component + + else: + component, rest = decodeFun( + asn1Object.getComponentByPosition(idx).asOctets(), + asn1Spec=openType, **options + ) + + asn1Object.setComponentByPosition(idx, component) + + else: + inconsistency = asn1Object.isInconsistent + if inconsistency: + raise inconsistency + + else: + asn1Object = asn1Spec.clone() + asn1Object.clear() + + componentType = asn1Spec.componentType + + if LOG: + LOG('decoding type %r chosen by given `asn1Spec`' % componentType) + + idx = 0 + + while head: + component, head = decodeFun(head, componentType, **options) + asn1Object.setComponentByPosition( + idx, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False + ) + + idx += 1 + + return asn1Object, tail + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if tagSet[0].tagFormat != tag.tagFormatConstructed: + raise error.PyAsn1Error('Constructed tag format expected') + + if substrateFun is not None: + if asn1Spec is not None: + asn1Object = asn1Spec.clone() + + elif self.protoComponent is not None: + asn1Object = self.protoComponent.clone(tagSet=tagSet) + + else: + asn1Object = self.protoRecordComponent, self.protoSequenceComponent + + return substrateFun(asn1Object, substrate, length) + + if asn1Spec is None: + return self._decodeComponents( + substrate, tagSet=tagSet, decodeFun=decodeFun, + **dict(options, allowEoo=True) + ) + + asn1Object = asn1Spec.clone() + asn1Object.clear() + + if asn1Spec.typeId in (univ.Sequence.typeId, univ.Set.typeId): + + namedTypes = asn1Object.componentType + + isSetType = asn1Object.typeId == univ.Set.typeId + isDeterministic = not isSetType and not namedTypes.hasOptionalOrDefault + + if LOG: + LOG('decoding %sdeterministic %s type %r chosen by type ID' % ( + not isDeterministic and 'non-' or '', isSetType and 'SET' or '', + asn1Spec)) + + seenIndices = set() + idx = 0 + while substrate: + if len(namedTypes) <= idx: + asn1Spec = None + + elif isSetType: + asn1Spec = namedTypes.tagMapUnique + + else: + try: + if isDeterministic: + asn1Spec = namedTypes[idx].asn1Object + + elif namedTypes[idx].isOptional or namedTypes[idx].isDefaulted: + asn1Spec = namedTypes.getTagMapNearPosition(idx) + + else: + asn1Spec = namedTypes[idx].asn1Object + + except IndexError: + raise error.PyAsn1Error( + 'Excessive components decoded at %r' % (asn1Object,) + ) + + component, substrate = decodeFun(substrate, asn1Spec, allowEoo=True, **options) + if component is eoo.endOfOctets: + break + + if not isDeterministic and namedTypes: + if isSetType: + idx = namedTypes.getPositionByType(component.effectiveTagSet) + elif namedTypes[idx].isOptional or namedTypes[idx].isDefaulted: + idx = namedTypes.getPositionNearType(component.effectiveTagSet, idx) + + asn1Object.setComponentByPosition( + idx, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False + ) + + seenIndices.add(idx) + idx += 1 + + else: + raise error.SubstrateUnderrunError( + 'No EOO seen before substrate ends' + ) + + if LOG: + LOG('seen component indices %s' % seenIndices) + + if namedTypes: + if not namedTypes.requiredComponents.issubset(seenIndices): + raise error.PyAsn1Error('ASN.1 object %s has uninitialized components' % asn1Object.__class__.__name__) + + if namedTypes.hasOpenTypes: + + openTypes = options.get('openTypes', {}) + + if LOG: + LOG('user-specified open types map:') + + for k, v in openTypes.items(): + LOG('%s -> %r' % (k, v)) + + if openTypes or options.get('decodeOpenTypes', False): + + for idx, namedType in enumerate(namedTypes.namedTypes): + if not namedType.openType: + continue + + if namedType.isOptional and not asn1Object.getComponentByPosition(idx).isValue: + continue + + governingValue = asn1Object.getComponentByName( + namedType.openType.name + ) + + try: + openType = openTypes[governingValue] + + except KeyError: + + if LOG: + LOG('default open types map of component ' + '"%s.%s" governed by component "%s.%s"' + ':' % (asn1Object.__class__.__name__, + namedType.name, + asn1Object.__class__.__name__, + namedType.openType.name)) + + for k, v in namedType.openType.items(): + LOG('%s -> %r' % (k, v)) + + try: + openType = namedType.openType[governingValue] + + except KeyError: + if LOG: + LOG('failed to resolve open type by governing ' + 'value %r' % (governingValue,)) + continue + + if LOG: + LOG('resolved open type %r by governing ' + 'value %r' % (openType, governingValue)) + + containerValue = asn1Object.getComponentByPosition(idx) + + if containerValue.typeId in ( + univ.SetOf.typeId, univ.SequenceOf.typeId): + + for pos, containerElement in enumerate( + containerValue): + + component, rest = decodeFun( + containerValue[pos].asOctets(), + asn1Spec=openType, **dict(options, allowEoo=True) + ) + + containerValue[pos] = component + + else: + component, rest = decodeFun( + asn1Object.getComponentByPosition(idx).asOctets(), + asn1Spec=openType, **dict(options, allowEoo=True) + ) + + if component is not eoo.endOfOctets: + asn1Object.setComponentByPosition(idx, component) + + else: + inconsistency = asn1Object.isInconsistent + if inconsistency: + raise inconsistency + + else: + asn1Object = asn1Spec.clone() + asn1Object.clear() + + componentType = asn1Spec.componentType + + if LOG: + LOG('decoding type %r chosen by given `asn1Spec`' % componentType) + + idx = 0 + + while substrate: + component, substrate = decodeFun(substrate, componentType, allowEoo=True, **options) + + if component is eoo.endOfOctets: + break + + asn1Object.setComponentByPosition( + idx, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False + ) + + idx += 1 + + else: + raise error.SubstrateUnderrunError( + 'No EOO seen before substrate ends' + ) + + return asn1Object, substrate + + +class SequenceOrSequenceOfDecoder(UniversalConstructedTypeDecoder): + protoRecordComponent = univ.Sequence() + protoSequenceComponent = univ.SequenceOf() + + +class SequenceDecoder(SequenceOrSequenceOfDecoder): + protoComponent = univ.Sequence() + + +class SequenceOfDecoder(SequenceOrSequenceOfDecoder): + protoComponent = univ.SequenceOf() + + +class SetOrSetOfDecoder(UniversalConstructedTypeDecoder): + protoRecordComponent = univ.Set() + protoSequenceComponent = univ.SetOf() + + +class SetDecoder(SetOrSetOfDecoder): + protoComponent = univ.Set() + + + +class SetOfDecoder(SetOrSetOfDecoder): + protoComponent = univ.SetOf() + + +class ChoiceDecoder(AbstractConstructedDecoder): + protoComponent = univ.Choice() + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + head, tail = substrate[:length], substrate[length:] + + if asn1Spec is None: + asn1Object = self.protoComponent.clone(tagSet=tagSet) + + else: + asn1Object = asn1Spec.clone() + + if substrateFun: + return substrateFun(asn1Object, substrate, length) + + if asn1Object.tagSet == tagSet: + if LOG: + LOG('decoding %s as explicitly tagged CHOICE' % (tagSet,)) + + component, head = decodeFun( + head, asn1Object.componentTagMap, **options + ) + + else: + if LOG: + LOG('decoding %s as untagged CHOICE' % (tagSet,)) + + component, head = decodeFun( + head, asn1Object.componentTagMap, + tagSet, length, state, **options + ) + + effectiveTagSet = component.effectiveTagSet + + if LOG: + LOG('decoded component %s, effective tag set %s' % (component, effectiveTagSet)) + + asn1Object.setComponentByType( + effectiveTagSet, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False, + innerFlag=False + ) + + return asn1Object, tail + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if asn1Spec is None: + asn1Object = self.protoComponent.clone(tagSet=tagSet) + else: + asn1Object = asn1Spec.clone() + + if substrateFun: + return substrateFun(asn1Object, substrate, length) + + if asn1Object.tagSet == tagSet: + if LOG: + LOG('decoding %s as explicitly tagged CHOICE' % (tagSet,)) + + component, substrate = decodeFun( + substrate, asn1Object.componentType.tagMapUnique, **options + ) + + # eat up EOO marker + eooMarker, substrate = decodeFun( + substrate, allowEoo=True, **options + ) + + if eooMarker is not eoo.endOfOctets: + raise error.PyAsn1Error('No EOO seen before substrate ends') + + else: + if LOG: + LOG('decoding %s as untagged CHOICE' % (tagSet,)) + + component, substrate = decodeFun( + substrate, asn1Object.componentType.tagMapUnique, + tagSet, length, state, **options + ) + + effectiveTagSet = component.effectiveTagSet + + if LOG: + LOG('decoded component %s, effective tag set %s' % (component, effectiveTagSet)) + + asn1Object.setComponentByType( + effectiveTagSet, component, + verifyConstraints=False, + matchTags=False, matchConstraints=False, + innerFlag=False + ) + + return asn1Object, substrate + + +class AnyDecoder(AbstractSimpleDecoder): + protoComponent = univ.Any() + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if asn1Spec is None: + isUntagged = True + + elif asn1Spec.__class__ is tagmap.TagMap: + isUntagged = tagSet not in asn1Spec.tagMap + + else: + isUntagged = tagSet != asn1Spec.tagSet + + if isUntagged: + fullSubstrate = options['fullSubstrate'] + + # untagged Any container, recover inner header substrate + length += len(fullSubstrate) - len(substrate) + substrate = fullSubstrate + + if LOG: + LOG('decoding as untagged ANY, substrate %s' % debug.hexdump(substrate)) + + if substrateFun: + return substrateFun(self._createComponent(asn1Spec, tagSet, noValue, **options), + substrate, length) + + head, tail = substrate[:length], substrate[length:] + + return self._createComponent(asn1Spec, tagSet, head, **options), tail + + def indefLenValueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + if asn1Spec is None: + isTagged = False + + elif asn1Spec.__class__ is tagmap.TagMap: + isTagged = tagSet in asn1Spec.tagMap + + else: + isTagged = tagSet == asn1Spec.tagSet + + if isTagged: + # tagged Any type -- consume header substrate + header = null + + if LOG: + LOG('decoding as tagged ANY') + + else: + fullSubstrate = options['fullSubstrate'] + + # untagged Any, recover header substrate + header = fullSubstrate[:-len(substrate)] + + if LOG: + LOG('decoding as untagged ANY, header substrate %s' % debug.hexdump(header)) + + # Any components do not inherit initial tag + asn1Spec = self.protoComponent + + if substrateFun and substrateFun is not self.substrateCollector: + asn1Object = self._createComponent(asn1Spec, tagSet, noValue, **options) + return substrateFun(asn1Object, header + substrate, length + len(header)) + + if LOG: + LOG('assembling constructed serialization') + + # All inner fragments are of the same type, treat them as octet string + substrateFun = self.substrateCollector + + while substrate: + component, substrate = decodeFun(substrate, asn1Spec, + substrateFun=substrateFun, + allowEoo=True, **options) + if component is eoo.endOfOctets: + break + + header += component + + else: + raise error.SubstrateUnderrunError( + 'No EOO seen before substrate ends' + ) + + if substrateFun: + return header, substrate + + else: + return self._createComponent(asn1Spec, tagSet, header, **options), substrate + + +# character string types +class UTF8StringDecoder(OctetStringDecoder): + protoComponent = char.UTF8String() + + +class NumericStringDecoder(OctetStringDecoder): + protoComponent = char.NumericString() + + +class PrintableStringDecoder(OctetStringDecoder): + protoComponent = char.PrintableString() + + +class TeletexStringDecoder(OctetStringDecoder): + protoComponent = char.TeletexString() + + +class VideotexStringDecoder(OctetStringDecoder): + protoComponent = char.VideotexString() + + +class IA5StringDecoder(OctetStringDecoder): + protoComponent = char.IA5String() + + +class GraphicStringDecoder(OctetStringDecoder): + protoComponent = char.GraphicString() + + +class VisibleStringDecoder(OctetStringDecoder): + protoComponent = char.VisibleString() + + +class GeneralStringDecoder(OctetStringDecoder): + protoComponent = char.GeneralString() + + +class UniversalStringDecoder(OctetStringDecoder): + protoComponent = char.UniversalString() + + +class BMPStringDecoder(OctetStringDecoder): + protoComponent = char.BMPString() + + +# "useful" types +class ObjectDescriptorDecoder(OctetStringDecoder): + protoComponent = useful.ObjectDescriptor() + + +class GeneralizedTimeDecoder(OctetStringDecoder): + protoComponent = useful.GeneralizedTime() + + +class UTCTimeDecoder(OctetStringDecoder): + protoComponent = useful.UTCTime() + + +tagMap = { + univ.Integer.tagSet: IntegerDecoder(), + univ.Boolean.tagSet: BooleanDecoder(), + univ.BitString.tagSet: BitStringDecoder(), + univ.OctetString.tagSet: OctetStringDecoder(), + univ.Null.tagSet: NullDecoder(), + univ.ObjectIdentifier.tagSet: ObjectIdentifierDecoder(), + univ.Enumerated.tagSet: IntegerDecoder(), + univ.Real.tagSet: RealDecoder(), + univ.Sequence.tagSet: SequenceOrSequenceOfDecoder(), # conflicts with SequenceOf + univ.Set.tagSet: SetOrSetOfDecoder(), # conflicts with SetOf + univ.Choice.tagSet: ChoiceDecoder(), # conflicts with Any + # character string types + char.UTF8String.tagSet: UTF8StringDecoder(), + char.NumericString.tagSet: NumericStringDecoder(), + char.PrintableString.tagSet: PrintableStringDecoder(), + char.TeletexString.tagSet: TeletexStringDecoder(), + char.VideotexString.tagSet: VideotexStringDecoder(), + char.IA5String.tagSet: IA5StringDecoder(), + char.GraphicString.tagSet: GraphicStringDecoder(), + char.VisibleString.tagSet: VisibleStringDecoder(), + char.GeneralString.tagSet: GeneralStringDecoder(), + char.UniversalString.tagSet: UniversalStringDecoder(), + char.BMPString.tagSet: BMPStringDecoder(), + # useful types + useful.ObjectDescriptor.tagSet: ObjectDescriptorDecoder(), + useful.GeneralizedTime.tagSet: GeneralizedTimeDecoder(), + useful.UTCTime.tagSet: UTCTimeDecoder() +} + +# Type-to-codec map for ambiguous ASN.1 types +typeMap = { + univ.Set.typeId: SetDecoder(), + univ.SetOf.typeId: SetOfDecoder(), + univ.Sequence.typeId: SequenceDecoder(), + univ.SequenceOf.typeId: SequenceOfDecoder(), + univ.Choice.typeId: ChoiceDecoder(), + univ.Any.typeId: AnyDecoder() +} + +# Put in non-ambiguous types for faster codec lookup +for typeDecoder in tagMap.values(): + if typeDecoder.protoComponent is not None: + typeId = typeDecoder.protoComponent.__class__.typeId + if typeId is not None and typeId not in typeMap: + typeMap[typeId] = typeDecoder + + +(stDecodeTag, + stDecodeLength, + stGetValueDecoder, + stGetValueDecoderByAsn1Spec, + stGetValueDecoderByTag, + stTryAsExplicitTag, + stDecodeValue, + stDumpRawValue, + stErrorCondition, + stStop) = [x for x in range(10)] + + +class Decoder(object): + defaultErrorState = stErrorCondition + #defaultErrorState = stDumpRawValue + defaultRawDecoder = AnyDecoder() + supportIndefLength = True + + # noinspection PyDefaultArgument + def __init__(self, tagMap, typeMap={}): + self.__tagMap = tagMap + self.__typeMap = typeMap + # Tag & TagSet objects caches + self.__tagCache = {} + self.__tagSetCache = {} + self.__eooSentinel = ints2octs((0, 0)) + + def __call__(self, substrate, asn1Spec=None, + tagSet=None, length=None, state=stDecodeTag, + decodeFun=None, substrateFun=None, + **options): + + if LOG: + LOG('decoder called at scope %s with state %d, working with up to %d octets of substrate: %s' % (debug.scope, state, len(substrate), debug.hexdump(substrate))) + + allowEoo = options.pop('allowEoo', False) + + # Look for end-of-octets sentinel + if allowEoo and self.supportIndefLength: + if substrate[:2] == self.__eooSentinel: + if LOG: + LOG('end-of-octets sentinel found') + return eoo.endOfOctets, substrate[2:] + + value = noValue + + tagMap = self.__tagMap + typeMap = self.__typeMap + tagCache = self.__tagCache + tagSetCache = self.__tagSetCache + + fullSubstrate = substrate + + while state is not stStop: + + if state is stDecodeTag: + if not substrate: + raise error.SubstrateUnderrunError( + 'Short octet stream on tag decoding' + ) + + # Decode tag + isShortTag = True + firstOctet = substrate[0] + substrate = substrate[1:] + + try: + lastTag = tagCache[firstOctet] + + except KeyError: + integerTag = oct2int(firstOctet) + tagClass = integerTag & 0xC0 + tagFormat = integerTag & 0x20 + tagId = integerTag & 0x1F + + if tagId == 0x1F: + isShortTag = False + lengthOctetIdx = 0 + tagId = 0 + + try: + while True: + integerTag = oct2int(substrate[lengthOctetIdx]) + lengthOctetIdx += 1 + tagId <<= 7 + tagId |= (integerTag & 0x7F) + if not integerTag & 0x80: + break + + substrate = substrate[lengthOctetIdx:] + + except IndexError: + raise error.SubstrateUnderrunError( + 'Short octet stream on long tag decoding' + ) + + lastTag = tag.Tag( + tagClass=tagClass, tagFormat=tagFormat, tagId=tagId + ) + + if isShortTag: + # cache short tags + tagCache[firstOctet] = lastTag + + if tagSet is None: + if isShortTag: + try: + tagSet = tagSetCache[firstOctet] + + except KeyError: + # base tag not recovered + tagSet = tag.TagSet((), lastTag) + tagSetCache[firstOctet] = tagSet + else: + tagSet = tag.TagSet((), lastTag) + + else: + tagSet = lastTag + tagSet + + state = stDecodeLength + + if LOG: + LOG('tag decoded into %s, decoding length' % tagSet) + + if state is stDecodeLength: + # Decode length + if not substrate: + raise error.SubstrateUnderrunError( + 'Short octet stream on length decoding' + ) + + firstOctet = oct2int(substrate[0]) + + if firstOctet < 128: + size = 1 + length = firstOctet + + elif firstOctet > 128: + size = firstOctet & 0x7F + # encoded in size bytes + encodedLength = octs2ints(substrate[1:size + 1]) + # missing check on maximum size, which shouldn't be a + # problem, we can handle more than is possible + if len(encodedLength) != size: + raise error.SubstrateUnderrunError( + '%s<%s at %s' % (size, len(encodedLength), tagSet) + ) + + length = 0 + for lengthOctet in encodedLength: + length <<= 8 + length |= lengthOctet + size += 1 + + else: + size = 1 + length = -1 + + substrate = substrate[size:] + + if length == -1: + if not self.supportIndefLength: + raise error.PyAsn1Error('Indefinite length encoding not supported by this codec') + + else: + if len(substrate) < length: + raise error.SubstrateUnderrunError('%d-octet short' % (length - len(substrate))) + + state = stGetValueDecoder + + if LOG: + LOG('value length decoded into %d, payload substrate is: %s' % (length, debug.hexdump(length == -1 and substrate or substrate[:length]))) + + if state is stGetValueDecoder: + if asn1Spec is None: + state = stGetValueDecoderByTag + + else: + state = stGetValueDecoderByAsn1Spec + # + # There're two ways of creating subtypes in ASN.1 what influences + # decoder operation. These methods are: + # 1) Either base types used in or no IMPLICIT tagging has been + # applied on subtyping. + # 2) Subtype syntax drops base type information (by means of + # IMPLICIT tagging. + # The first case allows for complete tag recovery from substrate + # while the second one requires original ASN.1 type spec for + # decoding. + # + # In either case a set of tags (tagSet) is coming from substrate + # in an incremental, tag-by-tag fashion (this is the case of + # EXPLICIT tag which is most basic). Outermost tag comes first + # from the wire. + # + if state is stGetValueDecoderByTag: + try: + concreteDecoder = tagMap[tagSet] + + except KeyError: + concreteDecoder = None + + if concreteDecoder: + state = stDecodeValue + + else: + try: + concreteDecoder = tagMap[tagSet[:1]] + + except KeyError: + concreteDecoder = None + + if concreteDecoder: + state = stDecodeValue + else: + state = stTryAsExplicitTag + + if LOG: + LOG('codec %s chosen by a built-in type, decoding %s' % (concreteDecoder and concreteDecoder.__class__.__name__ or "<none>", state is stDecodeValue and 'value' or 'as explicit tag')) + debug.scope.push(concreteDecoder is None and '?' or concreteDecoder.protoComponent.__class__.__name__) + + if state is stGetValueDecoderByAsn1Spec: + + if asn1Spec.__class__ is tagmap.TagMap: + try: + chosenSpec = asn1Spec[tagSet] + + except KeyError: + chosenSpec = None + + if LOG: + LOG('candidate ASN.1 spec is a map of:') + + for firstOctet, v in asn1Spec.presentTypes.items(): + LOG(' %s -> %s' % (firstOctet, v.__class__.__name__)) + + if asn1Spec.skipTypes: + LOG('but neither of: ') + for firstOctet, v in asn1Spec.skipTypes.items(): + LOG(' %s -> %s' % (firstOctet, v.__class__.__name__)) + LOG('new candidate ASN.1 spec is %s, chosen by %s' % (chosenSpec is None and '<none>' or chosenSpec.prettyPrintType(), tagSet)) + + elif tagSet == asn1Spec.tagSet or tagSet in asn1Spec.tagMap: + chosenSpec = asn1Spec + if LOG: + LOG('candidate ASN.1 spec is %s' % asn1Spec.__class__.__name__) + + else: + chosenSpec = None + + if chosenSpec is not None: + try: + # ambiguous type or just faster codec lookup + concreteDecoder = typeMap[chosenSpec.typeId] + + if LOG: + LOG('value decoder chosen for an ambiguous type by type ID %s' % (chosenSpec.typeId,)) + + except KeyError: + # use base type for codec lookup to recover untagged types + baseTagSet = tag.TagSet(chosenSpec.tagSet.baseTag, chosenSpec.tagSet.baseTag) + try: + # base type or tagged subtype + concreteDecoder = tagMap[baseTagSet] + + if LOG: + LOG('value decoder chosen by base %s' % (baseTagSet,)) + + except KeyError: + concreteDecoder = None + + if concreteDecoder: + asn1Spec = chosenSpec + state = stDecodeValue + + else: + state = stTryAsExplicitTag + + else: + concreteDecoder = None + state = stTryAsExplicitTag + + if LOG: + LOG('codec %s chosen by ASN.1 spec, decoding %s' % (state is stDecodeValue and concreteDecoder.__class__.__name__ or "<none>", state is stDecodeValue and 'value' or 'as explicit tag')) + debug.scope.push(chosenSpec is None and '?' or chosenSpec.__class__.__name__) + + if state is stDecodeValue: + if not options.get('recursiveFlag', True) and not substrateFun: # deprecate this + substrateFun = lambda a, b, c: (a, b[:c]) + + options.update(fullSubstrate=fullSubstrate) + + if length == -1: # indef length + value, substrate = concreteDecoder.indefLenValueDecoder( + substrate, asn1Spec, + tagSet, length, stGetValueDecoder, + self, substrateFun, + **options + ) + + else: + value, substrate = concreteDecoder.valueDecoder( + substrate, asn1Spec, + tagSet, length, stGetValueDecoder, + self, substrateFun, + **options + ) + + if LOG: + LOG('codec %s yields type %s, value:\n%s\n...remaining substrate is: %s' % (concreteDecoder.__class__.__name__, value.__class__.__name__, isinstance(value, base.Asn1Item) and value.prettyPrint() or value, substrate and debug.hexdump(substrate) or '<none>')) + + state = stStop + break + + if state is stTryAsExplicitTag: + if (tagSet and + tagSet[0].tagFormat == tag.tagFormatConstructed and + tagSet[0].tagClass != tag.tagClassUniversal): + # Assume explicit tagging + concreteDecoder = explicitTagDecoder + state = stDecodeValue + + else: + concreteDecoder = None + state = self.defaultErrorState + + if LOG: + LOG('codec %s chosen, decoding %s' % (concreteDecoder and concreteDecoder.__class__.__name__ or "<none>", state is stDecodeValue and 'value' or 'as failure')) + + if state is stDumpRawValue: + concreteDecoder = self.defaultRawDecoder + + if LOG: + LOG('codec %s chosen, decoding value' % concreteDecoder.__class__.__name__) + + state = stDecodeValue + + if state is stErrorCondition: + raise error.PyAsn1Error( + '%s not in asn1Spec: %r' % (tagSet, asn1Spec) + ) + + if LOG: + debug.scope.pop() + LOG('decoder left scope %s, call completed' % debug.scope) + + return value, substrate + + +#: Turns BER octet stream into an ASN.1 object. +#: +#: Takes BER octet-stream and decode it into an ASN.1 object +#: (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) which +#: may be a scalar or an arbitrary nested structure. +#: +#: Parameters +#: ---------- +#: substrate: :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2) +#: BER octet-stream +#: +#: Keyword Args +#: ------------ +#: asn1Spec: any pyasn1 type object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: A pyasn1 type object to act as a template guiding the decoder. Depending on the ASN.1 structure +#: being decoded, *asn1Spec* may or may not be required. Most common reason for +#: it to require is that ASN.1 structure is encoded in *IMPLICIT* tagging mode. +#: +#: Returns +#: ------- +#: : :py:class:`tuple` +#: A tuple of pyasn1 object recovered from BER substrate (:py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: and the unprocessed trailing portion of the *substrate* (may be empty) +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error, ~pyasn1.error.SubstrateUnderrunError +#: On decoding errors +#: +#: Examples +#: -------- +#: Decode BER serialisation without ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> s, _ = decode(b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03') +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +#: Decode BER serialisation with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> s, _ = decode(b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03', asn1Spec=seq) +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +decode = Decoder(tagMap, typeMap) + +# XXX +# non-recursive decoding; return position rather than substrate diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/encoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/encoder.py new file mode 100644 index 0000000..778aa86 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/encoder.py @@ -0,0 +1,890 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import sys + +from pyasn1 import debug +from pyasn1 import error +from pyasn1.codec.ber import eoo +from pyasn1.compat.integer import to_bytes +from pyasn1.compat.octets import (int2oct, oct2int, ints2octs, null, + str2octs, isOctetsType) +from pyasn1.type import char +from pyasn1.type import tag +from pyasn1.type import univ +from pyasn1.type import useful + +__all__ = ['encode'] + +LOG = debug.registerLoggee(__name__, flags=debug.DEBUG_ENCODER) + + +class AbstractItemEncoder(object): + supportIndefLenMode = True + + # An outcome of otherwise legit call `encodeFun(eoo.endOfOctets)` + eooIntegerSubstrate = (0, 0) + eooOctetsSubstrate = ints2octs(eooIntegerSubstrate) + + # noinspection PyMethodMayBeStatic + def encodeTag(self, singleTag, isConstructed): + tagClass, tagFormat, tagId = singleTag + encodedTag = tagClass | tagFormat + if isConstructed: + encodedTag |= tag.tagFormatConstructed + + if tagId < 31: + return encodedTag | tagId, + + else: + substrate = tagId & 0x7f, + + tagId >>= 7 + + while tagId: + substrate = (0x80 | (tagId & 0x7f),) + substrate + tagId >>= 7 + + return (encodedTag | 0x1F,) + substrate + + def encodeLength(self, length, defMode): + if not defMode and self.supportIndefLenMode: + return (0x80,) + + if length < 0x80: + return length, + + else: + substrate = () + while length: + substrate = (length & 0xff,) + substrate + length >>= 8 + + substrateLen = len(substrate) + + if substrateLen > 126: + raise error.PyAsn1Error('Length octets overflow (%d)' % substrateLen) + + return (0x80 | substrateLen,) + substrate + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + raise error.PyAsn1Error('Not implemented') + + def encode(self, value, asn1Spec=None, encodeFun=None, **options): + + if asn1Spec is None: + tagSet = value.tagSet + else: + tagSet = asn1Spec.tagSet + + # untagged item? + if not tagSet: + substrate, isConstructed, isOctets = self.encodeValue( + value, asn1Spec, encodeFun, **options + ) + return substrate + + defMode = options.get('defMode', True) + + substrate = null + + for idx, singleTag in enumerate(tagSet.superTags): + + defModeOverride = defMode + + # base tag? + if not idx: + try: + substrate, isConstructed, isOctets = self.encodeValue( + value, asn1Spec, encodeFun, **options + ) + + except error.PyAsn1Error: + exc = sys.exc_info() + raise error.PyAsn1Error( + 'Error encoding %r: %s' % (value, exc[1])) + + if LOG: + LOG('encoded %svalue %s into %s' % ( + isConstructed and 'constructed ' or '', value, substrate + )) + + if not substrate and isConstructed and options.get('ifNotEmpty', False): + return substrate + + if not isConstructed: + defModeOverride = True + + if LOG: + LOG('overridden encoding mode into definitive for primitive type') + + header = self.encodeTag(singleTag, isConstructed) + + if LOG: + LOG('encoded %stag %s into %s' % ( + isConstructed and 'constructed ' or '', + singleTag, debug.hexdump(ints2octs(header)))) + + header += self.encodeLength(len(substrate), defModeOverride) + + if LOG: + LOG('encoded %s octets (tag + payload) into %s' % ( + len(substrate), debug.hexdump(ints2octs(header)))) + + if isOctets: + substrate = ints2octs(header) + substrate + + if not defModeOverride: + substrate += self.eooOctetsSubstrate + + else: + substrate = header + substrate + + if not defModeOverride: + substrate += self.eooIntegerSubstrate + + if not isOctets: + substrate = ints2octs(substrate) + + return substrate + + +class EndOfOctetsEncoder(AbstractItemEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + return null, False, True + + +class BooleanEncoder(AbstractItemEncoder): + supportIndefLenMode = False + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + return value and (1,) or (0,), False, False + + +class IntegerEncoder(AbstractItemEncoder): + supportIndefLenMode = False + supportCompactZero = False + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if value == 0: + if LOG: + LOG('encoding %spayload for zero INTEGER' % ( + self.supportCompactZero and 'no ' or '' + )) + + # de-facto way to encode zero + if self.supportCompactZero: + return (), False, False + else: + return (0,), False, False + + return to_bytes(int(value), signed=True), False, True + + +class BitStringEncoder(AbstractItemEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if asn1Spec is not None: + # TODO: try to avoid ASN.1 schema instantiation + value = asn1Spec.clone(value) + + valueLength = len(value) + if valueLength % 8: + alignedValue = value << (8 - valueLength % 8) + else: + alignedValue = value + + maxChunkSize = options.get('maxChunkSize', 0) + if not maxChunkSize or len(alignedValue) <= maxChunkSize * 8: + substrate = alignedValue.asOctets() + return int2oct(len(substrate) * 8 - valueLength) + substrate, False, True + + if LOG: + LOG('encoding into up to %s-octet chunks' % maxChunkSize) + + baseTag = value.tagSet.baseTag + + # strip off explicit tags + if baseTag: + tagSet = tag.TagSet(baseTag, baseTag) + + else: + tagSet = tag.TagSet() + + alignedValue = alignedValue.clone(tagSet=tagSet) + + stop = 0 + substrate = null + while stop < valueLength: + start = stop + stop = min(start + maxChunkSize * 8, valueLength) + substrate += encodeFun(alignedValue[start:stop], asn1Spec, **options) + + return substrate, True, True + + +class OctetStringEncoder(AbstractItemEncoder): + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + + if asn1Spec is None: + substrate = value.asOctets() + + elif not isOctetsType(value): + substrate = asn1Spec.clone(value).asOctets() + + else: + substrate = value + + maxChunkSize = options.get('maxChunkSize', 0) + + if not maxChunkSize or len(substrate) <= maxChunkSize: + return substrate, False, True + + if LOG: + LOG('encoding into up to %s-octet chunks' % maxChunkSize) + + # strip off explicit tags for inner chunks + + if asn1Spec is None: + baseTag = value.tagSet.baseTag + + # strip off explicit tags + if baseTag: + tagSet = tag.TagSet(baseTag, baseTag) + + else: + tagSet = tag.TagSet() + + asn1Spec = value.clone(tagSet=tagSet) + + elif not isOctetsType(value): + baseTag = asn1Spec.tagSet.baseTag + + # strip off explicit tags + if baseTag: + tagSet = tag.TagSet(baseTag, baseTag) + + else: + tagSet = tag.TagSet() + + asn1Spec = asn1Spec.clone(tagSet=tagSet) + + pos = 0 + substrate = null + + while True: + chunk = value[pos:pos + maxChunkSize] + if not chunk: + break + + substrate += encodeFun(chunk, asn1Spec, **options) + pos += maxChunkSize + + return substrate, True, True + + +class NullEncoder(AbstractItemEncoder): + supportIndefLenMode = False + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + return null, False, True + + +class ObjectIdentifierEncoder(AbstractItemEncoder): + supportIndefLenMode = False + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if asn1Spec is not None: + value = asn1Spec.clone(value) + + oid = value.asTuple() + + # Build the first pair + try: + first = oid[0] + second = oid[1] + + except IndexError: + raise error.PyAsn1Error('Short OID %s' % (value,)) + + if 0 <= second <= 39: + if first == 1: + oid = (second + 40,) + oid[2:] + elif first == 0: + oid = (second,) + oid[2:] + elif first == 2: + oid = (second + 80,) + oid[2:] + else: + raise error.PyAsn1Error('Impossible first/second arcs at %s' % (value,)) + + elif first == 2: + oid = (second + 80,) + oid[2:] + + else: + raise error.PyAsn1Error('Impossible first/second arcs at %s' % (value,)) + + octets = () + + # Cycle through subIds + for subOid in oid: + if 0 <= subOid <= 127: + # Optimize for the common case + octets += (subOid,) + + elif subOid > 127: + # Pack large Sub-Object IDs + res = (subOid & 0x7f,) + subOid >>= 7 + + while subOid: + res = (0x80 | (subOid & 0x7f),) + res + subOid >>= 7 + + # Add packed Sub-Object ID to resulted Object ID + octets += res + + else: + raise error.PyAsn1Error('Negative OID arc %s at %s' % (subOid, value)) + + return octets, False, False + + +class RealEncoder(AbstractItemEncoder): + supportIndefLenMode = 0 + binEncBase = 2 # set to None to choose encoding base automatically + + @staticmethod + def _dropFloatingPoint(m, encbase, e): + ms, es = 1, 1 + if m < 0: + ms = -1 # mantissa sign + + if e < 0: + es = -1 # exponent sign + + m *= ms + + if encbase == 8: + m *= 2 ** (abs(e) % 3 * es) + e = abs(e) // 3 * es + + elif encbase == 16: + m *= 2 ** (abs(e) % 4 * es) + e = abs(e) // 4 * es + + while True: + if int(m) != m: + m *= encbase + e -= 1 + continue + break + + return ms, int(m), encbase, e + + def _chooseEncBase(self, value): + m, b, e = value + encBase = [2, 8, 16] + if value.binEncBase in encBase: + return self._dropFloatingPoint(m, value.binEncBase, e) + + elif self.binEncBase in encBase: + return self._dropFloatingPoint(m, self.binEncBase, e) + + # auto choosing base 2/8/16 + mantissa = [m, m, m] + exponent = [e, e, e] + sign = 1 + encbase = 2 + e = float('inf') + + for i in range(3): + (sign, + mantissa[i], + encBase[i], + exponent[i]) = self._dropFloatingPoint(mantissa[i], encBase[i], exponent[i]) + + if abs(exponent[i]) < abs(e) or (abs(exponent[i]) == abs(e) and mantissa[i] < m): + e = exponent[i] + m = int(mantissa[i]) + encbase = encBase[i] + + if LOG: + LOG('automatically chosen REAL encoding base %s, sign %s, mantissa %s, ' + 'exponent %s' % (encbase, sign, m, e)) + + return sign, m, encbase, e + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if asn1Spec is not None: + value = asn1Spec.clone(value) + + if value.isPlusInf: + return (0x40,), False, False + + if value.isMinusInf: + return (0x41,), False, False + + m, b, e = value + + if not m: + return null, False, True + + if b == 10: + if LOG: + LOG('encoding REAL into character form') + + return str2octs('\x03%dE%s%d' % (m, e == 0 and '+' or '', e)), False, True + + elif b == 2: + fo = 0x80 # binary encoding + ms, m, encbase, e = self._chooseEncBase(value) + + if ms < 0: # mantissa sign + fo |= 0x40 # sign bit + + # exponent & mantissa normalization + if encbase == 2: + while m & 0x1 == 0: + m >>= 1 + e += 1 + + elif encbase == 8: + while m & 0x7 == 0: + m >>= 3 + e += 1 + fo |= 0x10 + + else: # encbase = 16 + while m & 0xf == 0: + m >>= 4 + e += 1 + fo |= 0x20 + + sf = 0 # scale factor + + while m & 0x1 == 0: + m >>= 1 + sf += 1 + + if sf > 3: + raise error.PyAsn1Error('Scale factor overflow') # bug if raised + + fo |= sf << 2 + eo = null + if e == 0 or e == -1: + eo = int2oct(e & 0xff) + + else: + while e not in (0, -1): + eo = int2oct(e & 0xff) + eo + e >>= 8 + + if e == 0 and eo and oct2int(eo[0]) & 0x80: + eo = int2oct(0) + eo + + if e == -1 and eo and not (oct2int(eo[0]) & 0x80): + eo = int2oct(0xff) + eo + + n = len(eo) + if n > 0xff: + raise error.PyAsn1Error('Real exponent overflow') + + if n == 1: + pass + + elif n == 2: + fo |= 1 + + elif n == 3: + fo |= 2 + + else: + fo |= 3 + eo = int2oct(n & 0xff) + eo + + po = null + + while m: + po = int2oct(m & 0xff) + po + m >>= 8 + + substrate = int2oct(fo) + eo + po + + return substrate, False, True + + else: + raise error.PyAsn1Error('Prohibited Real base %s' % b) + + +class SequenceEncoder(AbstractItemEncoder): + omitEmptyOptionals = False + + # TODO: handling three flavors of input is too much -- split over codecs + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + + substrate = null + + omitEmptyOptionals = options.get( + 'omitEmptyOptionals', self.omitEmptyOptionals) + + if LOG: + LOG('%sencoding empty OPTIONAL components' % ( + omitEmptyOptionals and 'not ' or '')) + + if asn1Spec is None: + # instance of ASN.1 schema + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency + + namedTypes = value.componentType + + for idx, component in enumerate(value.values()): + if namedTypes: + namedType = namedTypes[idx] + + if namedType.isOptional and not component.isValue: + if LOG: + LOG('not encoding OPTIONAL component %r' % (namedType,)) + continue + + if namedType.isDefaulted and component == namedType.asn1Object: + if LOG: + LOG('not encoding DEFAULT component %r' % (namedType,)) + continue + + if omitEmptyOptionals: + options.update(ifNotEmpty=namedType.isOptional) + + # wrap open type blob if needed + if namedTypes and namedType.openType: + + wrapType = namedType.asn1Object + + if wrapType.typeId in ( + univ.SetOf.typeId, univ.SequenceOf.typeId): + + substrate += encodeFun( + component, asn1Spec, + **dict(options, wrapType=wrapType.componentType)) + + else: + chunk = encodeFun(component, asn1Spec, **options) + + if wrapType.isSameTypeWith(component): + substrate += chunk + + else: + substrate += encodeFun(chunk, wrapType, **options) + + if LOG: + LOG('wrapped with wrap type %r' % (wrapType,)) + + else: + substrate += encodeFun(component, asn1Spec, **options) + + else: + # bare Python value + ASN.1 schema + for idx, namedType in enumerate(asn1Spec.componentType.namedTypes): + + try: + component = value[namedType.name] + + except KeyError: + raise error.PyAsn1Error('Component name "%s" not found in %r' % ( + namedType.name, value)) + + if namedType.isOptional and namedType.name not in value: + if LOG: + LOG('not encoding OPTIONAL component %r' % (namedType,)) + continue + + if namedType.isDefaulted and component == namedType.asn1Object: + if LOG: + LOG('not encoding DEFAULT component %r' % (namedType,)) + continue + + if omitEmptyOptionals: + options.update(ifNotEmpty=namedType.isOptional) + + componentSpec = namedType.asn1Object + + # wrap open type blob if needed + if namedType.openType: + + if componentSpec.typeId in ( + univ.SetOf.typeId, univ.SequenceOf.typeId): + + substrate += encodeFun( + component, componentSpec, + **dict(options, wrapType=componentSpec.componentType)) + + else: + chunk = encodeFun(component, componentSpec, **options) + + if componentSpec.isSameTypeWith(component): + substrate += chunk + + else: + substrate += encodeFun(chunk, componentSpec, **options) + + if LOG: + LOG('wrapped with wrap type %r' % (componentSpec,)) + + else: + substrate += encodeFun(component, componentSpec, **options) + + return substrate, True, True + + +class SequenceOfEncoder(AbstractItemEncoder): + def _encodeComponents(self, value, asn1Spec, encodeFun, **options): + + if asn1Spec is None: + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency + + else: + asn1Spec = asn1Spec.componentType + + chunks = [] + + wrapType = options.pop('wrapType', None) + + for idx, component in enumerate(value): + chunk = encodeFun(component, asn1Spec, **options) + + if (wrapType is not None and + not wrapType.isSameTypeWith(component)): + # wrap encoded value with wrapper container (e.g. ANY) + chunk = encodeFun(chunk, wrapType, **options) + + if LOG: + LOG('wrapped with wrap type %r' % (wrapType,)) + + chunks.append(chunk) + + return chunks + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + chunks = self._encodeComponents( + value, asn1Spec, encodeFun, **options) + + return null.join(chunks), True, True + + +class ChoiceEncoder(AbstractItemEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if asn1Spec is None: + component = value.getComponent() + else: + names = [namedType.name for namedType in asn1Spec.componentType.namedTypes + if namedType.name in value] + if len(names) != 1: + raise error.PyAsn1Error('%s components for Choice at %r' % (len(names) and 'Multiple ' or 'None ', value)) + + name = names[0] + + component = value[name] + asn1Spec = asn1Spec[name] + + return encodeFun(component, asn1Spec, **options), True, True + + +class AnyEncoder(OctetStringEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if asn1Spec is None: + value = value.asOctets() + elif not isOctetsType(value): + value = asn1Spec.clone(value).asOctets() + + return value, not options.get('defMode', True), True + + +tagMap = { + eoo.endOfOctets.tagSet: EndOfOctetsEncoder(), + univ.Boolean.tagSet: BooleanEncoder(), + univ.Integer.tagSet: IntegerEncoder(), + univ.BitString.tagSet: BitStringEncoder(), + univ.OctetString.tagSet: OctetStringEncoder(), + univ.Null.tagSet: NullEncoder(), + univ.ObjectIdentifier.tagSet: ObjectIdentifierEncoder(), + univ.Enumerated.tagSet: IntegerEncoder(), + univ.Real.tagSet: RealEncoder(), + # Sequence & Set have same tags as SequenceOf & SetOf + univ.SequenceOf.tagSet: SequenceOfEncoder(), + univ.SetOf.tagSet: SequenceOfEncoder(), + univ.Choice.tagSet: ChoiceEncoder(), + # character string types + char.UTF8String.tagSet: OctetStringEncoder(), + char.NumericString.tagSet: OctetStringEncoder(), + char.PrintableString.tagSet: OctetStringEncoder(), + char.TeletexString.tagSet: OctetStringEncoder(), + char.VideotexString.tagSet: OctetStringEncoder(), + char.IA5String.tagSet: OctetStringEncoder(), + char.GraphicString.tagSet: OctetStringEncoder(), + char.VisibleString.tagSet: OctetStringEncoder(), + char.GeneralString.tagSet: OctetStringEncoder(), + char.UniversalString.tagSet: OctetStringEncoder(), + char.BMPString.tagSet: OctetStringEncoder(), + # useful types + useful.ObjectDescriptor.tagSet: OctetStringEncoder(), + useful.GeneralizedTime.tagSet: OctetStringEncoder(), + useful.UTCTime.tagSet: OctetStringEncoder() +} + +# Put in ambiguous & non-ambiguous types for faster codec lookup +typeMap = { + univ.Boolean.typeId: BooleanEncoder(), + univ.Integer.typeId: IntegerEncoder(), + univ.BitString.typeId: BitStringEncoder(), + univ.OctetString.typeId: OctetStringEncoder(), + univ.Null.typeId: NullEncoder(), + univ.ObjectIdentifier.typeId: ObjectIdentifierEncoder(), + univ.Enumerated.typeId: IntegerEncoder(), + univ.Real.typeId: RealEncoder(), + # Sequence & Set have same tags as SequenceOf & SetOf + univ.Set.typeId: SequenceEncoder(), + univ.SetOf.typeId: SequenceOfEncoder(), + univ.Sequence.typeId: SequenceEncoder(), + univ.SequenceOf.typeId: SequenceOfEncoder(), + univ.Choice.typeId: ChoiceEncoder(), + univ.Any.typeId: AnyEncoder(), + # character string types + char.UTF8String.typeId: OctetStringEncoder(), + char.NumericString.typeId: OctetStringEncoder(), + char.PrintableString.typeId: OctetStringEncoder(), + char.TeletexString.typeId: OctetStringEncoder(), + char.VideotexString.typeId: OctetStringEncoder(), + char.IA5String.typeId: OctetStringEncoder(), + char.GraphicString.typeId: OctetStringEncoder(), + char.VisibleString.typeId: OctetStringEncoder(), + char.GeneralString.typeId: OctetStringEncoder(), + char.UniversalString.typeId: OctetStringEncoder(), + char.BMPString.typeId: OctetStringEncoder(), + # useful types + useful.ObjectDescriptor.typeId: OctetStringEncoder(), + useful.GeneralizedTime.typeId: OctetStringEncoder(), + useful.UTCTime.typeId: OctetStringEncoder() +} + + +class Encoder(object): + fixedDefLengthMode = None + fixedChunkSize = None + + # noinspection PyDefaultArgument + def __init__(self, tagMap, typeMap={}): + self.__tagMap = tagMap + self.__typeMap = typeMap + + def __call__(self, value, asn1Spec=None, **options): + try: + if asn1Spec is None: + typeId = value.typeId + else: + typeId = asn1Spec.typeId + + except AttributeError: + raise error.PyAsn1Error('Value %r is not ASN.1 type instance ' + 'and "asn1Spec" not given' % (value,)) + + if LOG: + LOG('encoder called in %sdef mode, chunk size %s for ' + 'type %s, value:\n%s' % (not options.get('defMode', True) and 'in' or '', options.get('maxChunkSize', 0), asn1Spec is None and value.prettyPrintType() or asn1Spec.prettyPrintType(), value)) + + if self.fixedDefLengthMode is not None: + options.update(defMode=self.fixedDefLengthMode) + + if self.fixedChunkSize is not None: + options.update(maxChunkSize=self.fixedChunkSize) + + + try: + concreteEncoder = self.__typeMap[typeId] + + if LOG: + LOG('using value codec %s chosen by type ID %s' % (concreteEncoder.__class__.__name__, typeId)) + + except KeyError: + if asn1Spec is None: + tagSet = value.tagSet + else: + tagSet = asn1Spec.tagSet + + # use base type for codec lookup to recover untagged types + baseTagSet = tag.TagSet(tagSet.baseTag, tagSet.baseTag) + + try: + concreteEncoder = self.__tagMap[baseTagSet] + + except KeyError: + raise error.PyAsn1Error('No encoder for %r (%s)' % (value, tagSet)) + + if LOG: + LOG('using value codec %s chosen by tagSet %s' % (concreteEncoder.__class__.__name__, tagSet)) + + substrate = concreteEncoder.encode(value, asn1Spec, self, **options) + + if LOG: + LOG('codec %s built %s octets of substrate: %s\nencoder completed' % (concreteEncoder, len(substrate), debug.hexdump(substrate))) + + return substrate + +#: Turns ASN.1 object into BER octet stream. +#: +#: Takes any ASN.1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: walks all its components recursively and produces a BER octet stream. +#: +#: Parameters +#: ---------- +#: value: either a Python or pyasn1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: A Python or pyasn1 object to encode. If Python object is given, `asnSpec` +#: parameter is required to guide the encoding process. +#: +#: Keyword Args +#: ------------ +#: asn1Spec: +#: Optional ASN.1 schema or value object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: +#: defMode: :py:class:`bool` +#: If :obj:`False`, produces indefinite length encoding +#: +#: maxChunkSize: :py:class:`int` +#: Maximum chunk size in chunked encoding mode (0 denotes unlimited chunk size) +#: +#: Returns +#: ------- +#: : :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2) +#: Given ASN.1 object encoded into BER octetstream +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error +#: On encoding errors +#: +#: Examples +#: -------- +#: Encode Python value into BER with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> encode([1, 2, 3], asn1Spec=seq) +#: b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03' +#: +#: Encode ASN.1 value object into BER +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> seq.extend([1, 2, 3]) +#: >>> encode(seq) +#: b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03' +#: +encode = Encoder(tagMap, typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/eoo.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/eoo.py new file mode 100644 index 0000000..48eb859 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/ber/eoo.py @@ -0,0 +1,28 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1.type import base +from pyasn1.type import tag + +__all__ = ['endOfOctets'] + + +class EndOfOctets(base.SimpleAsn1Type): + defaultValue = 0 + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x00) + ) + + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = object.__new__(cls, *args, **kwargs) + + return cls._instance + + +endOfOctets = EndOfOctets() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..503c2b8f0e6f57dc585bebc07bd6da00c4e303d4 GIT binary patch literal 144 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHx4SFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358QOWr!smc1usYUwn@tJv<CGqik1(mlrY;yBc ON^?@}K*kmWF#`a0qa$_z literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/decoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/decoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d0a00b03fb15da3dfc10a48e3b6cb3088241474 GIT binary patch literal 1750 zcmZ8gOK;mo5S}F|QWU92{gACV4ctS32&io|2zm&N!g(}7QB*Ce6a^M22wL3Olqr%~ zt^zBNE_HhBkLaO?0{uI^@Y<7)x%Se|EG0uO#U0HzJ3Bj%k2}p~<FDU^_^k!-H>^D_ z>L<90F$0M3Wsm?&7;pxRumOny6BD>uVG|MyCN<!-3R{raFmZr8h-+|$C+qMsvLSNd zJ)U<!m@szX3PUus?g96-;sf`!(gfbrN(;tqxB}oU5U6)RI57SQ#v33SWGA?(p|^rt z8u}}^tzna3Y{3;4LDzRzal3H&N{8MdkLN$V0KN-i7sfq^>TuzL{IG=MJ22h@z6WA& zZ3|%+E}W$s>bQIS<^%lrGIAkm=!&Z<@9K*0g1{H6(Menxz(1yF!@hS-L+G=zCZx<H zDo!LuStPWYjnu<9RcN)QY5cadtGyAOSv?LaC%B5oC<OM5(fqif@3Lr+SUpY&CwS{M zA+q2-4iHCVU?#P)^)$;85vI?p1SB#62BSJkdYZUuxW2|!{E1?&FPdBMivc|ZsNux~ zjD-t}2FzXXi$~hd;KBs?3={wo4DZ97erBKya*9moAzpYe_b90g1LQd+zVIP^ppB+B zF36RPo2x)I+U-`s<`~<AIfg{(!@Lf^qSAoZRGmGzrgGlx4>Gl1#OYZg4zRmI?JtYo z&%;@gg^{lM`d{+B_d_Z!bAevb|GggX-!J->G|-KE-_4#B>1SWk{G>&ePB4-pRN`4S z$+J}80Gp*%h~zbQi|J{hB<}Hgh=+z4zO+?%HWaF~6Oo>&^RiYba&W6*znG@nzd44e zbh2E<Sz46Vxd@}uQem8M>vX0>S$i8MQ}GAL4b0=8<0Cc6kMcM_h*ON2BnPLFn9d$u zK0L~2bp7g&2sb(!33*iADG&2m>FZcaGElr?3k6u8uuaxx9m{7f!)0u;cYC*)bGUx8 z@09f*NW+N;g0c|=lPsDhr29eeW*R2djwEW8&N5Ef%4MdqoBm0<S=Y2CHpxcpZ{sR# z6h3R4F4MNbt#5=ze?ndz6zkszl5E&FN@rQ+pl`};bdg;WJ0z&^HK8xPgSKN_1<l`Q zl5qbXx2vXBtmstWP`CE*6u)j0z4+FRd6I|fP*bp|SmQ0X)GQavb_4+qEeQDb6U~~D z8pe}65zB0Kp}g}nRzoF`(n~Yn_?C!$+va^Q!er$@g!?AUOKX(job72IA>ZUK<|jQ$ z(!B}Ey|q}}q9EL%1nIb~$6Roa46B@a7@%~6V3dSKfvMZH`BkKQBxy)%&D6c6j+XV~ qiWXncJd00JbeR4buG!mhk!h~cW;XJUeqFO|5(nFCm$l5^=l=ofB9oN> literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/encoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/__pycache__/encoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83d37e394711e35e2ef8d2a58da278bbe1f723ea GIT binary patch literal 6943 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 N%wU~+CX$mc{|~#$bm{;A literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/decoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/decoder.py new file mode 100644 index 0000000..3e86fd0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/decoder.py @@ -0,0 +1,114 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import error +from pyasn1.codec.ber import decoder +from pyasn1.compat.octets import oct2int +from pyasn1.type import univ + +__all__ = ['decode'] + + +class BooleanDecoder(decoder.AbstractSimpleDecoder): + protoComponent = univ.Boolean(0) + + def valueDecoder(self, substrate, asn1Spec, + tagSet=None, length=None, state=None, + decodeFun=None, substrateFun=None, + **options): + head, tail = substrate[:length], substrate[length:] + if not head or length != 1: + raise error.PyAsn1Error('Not single-octet Boolean payload') + byte = oct2int(head[0]) + # CER/DER specifies encoding of TRUE as 0xFF and FALSE as 0x0, while + # BER allows any non-zero value as TRUE; cf. sections 8.2.2. and 11.1 + # in https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf + if byte == 0xff: + value = 1 + elif byte == 0x00: + value = 0 + else: + raise error.PyAsn1Error('Unexpected Boolean payload: %s' % byte) + return self._createComponent(asn1Spec, tagSet, value, **options), tail + +# TODO: prohibit non-canonical encoding +BitStringDecoder = decoder.BitStringDecoder +OctetStringDecoder = decoder.OctetStringDecoder +RealDecoder = decoder.RealDecoder + +tagMap = decoder.tagMap.copy() +tagMap.update( + {univ.Boolean.tagSet: BooleanDecoder(), + univ.BitString.tagSet: BitStringDecoder(), + univ.OctetString.tagSet: OctetStringDecoder(), + univ.Real.tagSet: RealDecoder()} +) + +typeMap = decoder.typeMap.copy() + +# Put in non-ambiguous types for faster codec lookup +for typeDecoder in tagMap.values(): + if typeDecoder.protoComponent is not None: + typeId = typeDecoder.protoComponent.__class__.typeId + if typeId is not None and typeId not in typeMap: + typeMap[typeId] = typeDecoder + + +class Decoder(decoder.Decoder): + pass + + +#: Turns CER octet stream into an ASN.1 object. +#: +#: Takes CER octet-stream and decode it into an ASN.1 object +#: (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) which +#: may be a scalar or an arbitrary nested structure. +#: +#: Parameters +#: ---------- +#: substrate: :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2) +#: CER octet-stream +#: +#: Keyword Args +#: ------------ +#: asn1Spec: any pyasn1 type object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: A pyasn1 type object to act as a template guiding the decoder. Depending on the ASN.1 structure +#: being decoded, *asn1Spec* may or may not be required. Most common reason for +#: it to require is that ASN.1 structure is encoded in *IMPLICIT* tagging mode. +#: +#: Returns +#: ------- +#: : :py:class:`tuple` +#: A tuple of pyasn1 object recovered from CER substrate (:py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: and the unprocessed trailing portion of the *substrate* (may be empty) +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error, ~pyasn1.error.SubstrateUnderrunError +#: On decoding errors +#: +#: Examples +#: -------- +#: Decode CER serialisation without ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> s, _ = decode(b'0\x80\x02\x01\x01\x02\x01\x02\x02\x01\x03\x00\x00') +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +#: Decode CER serialisation with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> s, _ = decode(b'0\x80\x02\x01\x01\x02\x01\x02\x02\x01\x03\x00\x00', asn1Spec=seq) +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +decode = Decoder(tagMap, decoder.typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/encoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/encoder.py new file mode 100644 index 0000000..935b696 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/cer/encoder.py @@ -0,0 +1,313 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import error +from pyasn1.codec.ber import encoder +from pyasn1.compat.octets import str2octs, null +from pyasn1.type import univ +from pyasn1.type import useful + +__all__ = ['encode'] + + +class BooleanEncoder(encoder.IntegerEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + if value == 0: + substrate = (0,) + else: + substrate = (255,) + return substrate, False, False + + +class RealEncoder(encoder.RealEncoder): + def _chooseEncBase(self, value): + m, b, e = value + return self._dropFloatingPoint(m, b, e) + + +# specialized GeneralStringEncoder here + +class TimeEncoderMixIn(object): + Z_CHAR = ord('Z') + PLUS_CHAR = ord('+') + MINUS_CHAR = ord('-') + COMMA_CHAR = ord(',') + DOT_CHAR = ord('.') + ZERO_CHAR = ord('0') + + MIN_LENGTH = 12 + MAX_LENGTH = 19 + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + # CER encoding constraints: + # - minutes are mandatory, seconds are optional + # - sub-seconds must NOT be zero / no meaningless zeros + # - no hanging fraction dot + # - time in UTC (Z) + # - only dot is allowed for fractions + + if asn1Spec is not None: + value = asn1Spec.clone(value) + + numbers = value.asNumbers() + + if self.PLUS_CHAR in numbers or self.MINUS_CHAR in numbers: + raise error.PyAsn1Error('Must be UTC time: %r' % value) + + if numbers[-1] != self.Z_CHAR: + raise error.PyAsn1Error('Missing "Z" time zone specifier: %r' % value) + + if self.COMMA_CHAR in numbers: + raise error.PyAsn1Error('Comma in fractions disallowed: %r' % value) + + if self.DOT_CHAR in numbers: + + isModified = False + + numbers = list(numbers) + + searchIndex = min(numbers.index(self.DOT_CHAR) + 4, len(numbers) - 1) + + while numbers[searchIndex] != self.DOT_CHAR: + if numbers[searchIndex] == self.ZERO_CHAR: + del numbers[searchIndex] + isModified = True + + searchIndex -= 1 + + searchIndex += 1 + + if searchIndex < len(numbers): + if numbers[searchIndex] == self.Z_CHAR: + # drop hanging comma + del numbers[searchIndex - 1] + isModified = True + + if isModified: + value = value.clone(numbers) + + if not self.MIN_LENGTH < len(numbers) < self.MAX_LENGTH: + raise error.PyAsn1Error('Length constraint violated: %r' % value) + + options.update(maxChunkSize=1000) + + return encoder.OctetStringEncoder.encodeValue( + self, value, asn1Spec, encodeFun, **options + ) + + +class GeneralizedTimeEncoder(TimeEncoderMixIn, encoder.OctetStringEncoder): + MIN_LENGTH = 12 + MAX_LENGTH = 20 + + +class UTCTimeEncoder(TimeEncoderMixIn, encoder.OctetStringEncoder): + MIN_LENGTH = 10 + MAX_LENGTH = 14 + + +class SetOfEncoder(encoder.SequenceOfEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + chunks = self._encodeComponents( + value, asn1Spec, encodeFun, **options) + + # sort by serialised and padded components + if len(chunks) > 1: + zero = str2octs('\x00') + maxLen = max(map(len, chunks)) + paddedChunks = [ + (x.ljust(maxLen, zero), x) for x in chunks + ] + paddedChunks.sort(key=lambda x: x[0]) + + chunks = [x[1] for x in paddedChunks] + + return null.join(chunks), True, True + + +class SequenceOfEncoder(encoder.SequenceOfEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): + + if options.get('ifNotEmpty', False) and not len(value): + return null, True, True + + chunks = self._encodeComponents( + value, asn1Spec, encodeFun, **options) + + return null.join(chunks), True, True + + +class SetEncoder(encoder.SequenceEncoder): + @staticmethod + def _componentSortKey(componentAndType): + """Sort SET components by tag + + Sort regardless of the Choice value (static sort) + """ + component, asn1Spec = componentAndType + + if asn1Spec is None: + asn1Spec = component + + if asn1Spec.typeId == univ.Choice.typeId and not asn1Spec.tagSet: + if asn1Spec.tagSet: + return asn1Spec.tagSet + else: + return asn1Spec.componentType.minTagSet + else: + return asn1Spec.tagSet + + def encodeValue(self, value, asn1Spec, encodeFun, **options): + + substrate = null + + comps = [] + compsMap = {} + + if asn1Spec is None: + # instance of ASN.1 schema + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency + + namedTypes = value.componentType + + for idx, component in enumerate(value.values()): + if namedTypes: + namedType = namedTypes[idx] + + if namedType.isOptional and not component.isValue: + continue + + if namedType.isDefaulted and component == namedType.asn1Object: + continue + + compsMap[id(component)] = namedType + + else: + compsMap[id(component)] = None + + comps.append((component, asn1Spec)) + + else: + # bare Python value + ASN.1 schema + for idx, namedType in enumerate(asn1Spec.componentType.namedTypes): + + try: + component = value[namedType.name] + + except KeyError: + raise error.PyAsn1Error('Component name "%s" not found in %r' % (namedType.name, value)) + + if namedType.isOptional and namedType.name not in value: + continue + + if namedType.isDefaulted and component == namedType.asn1Object: + continue + + compsMap[id(component)] = namedType + comps.append((component, asn1Spec[idx])) + + for comp, compType in sorted(comps, key=self._componentSortKey): + namedType = compsMap[id(comp)] + + if namedType: + options.update(ifNotEmpty=namedType.isOptional) + + chunk = encodeFun(comp, compType, **options) + + # wrap open type blob if needed + if namedType and namedType.openType: + wrapType = namedType.asn1Object + if wrapType.tagSet and not wrapType.isSameTypeWith(comp): + chunk = encodeFun(chunk, wrapType, **options) + + substrate += chunk + + return substrate, True, True + + +class SequenceEncoder(encoder.SequenceEncoder): + omitEmptyOptionals = True + + +tagMap = encoder.tagMap.copy() +tagMap.update({ + univ.Boolean.tagSet: BooleanEncoder(), + univ.Real.tagSet: RealEncoder(), + useful.GeneralizedTime.tagSet: GeneralizedTimeEncoder(), + useful.UTCTime.tagSet: UTCTimeEncoder(), + # Sequence & Set have same tags as SequenceOf & SetOf + univ.SetOf.tagSet: SetOfEncoder(), + univ.Sequence.typeId: SequenceEncoder() +}) + +typeMap = encoder.typeMap.copy() +typeMap.update({ + univ.Boolean.typeId: BooleanEncoder(), + univ.Real.typeId: RealEncoder(), + useful.GeneralizedTime.typeId: GeneralizedTimeEncoder(), + useful.UTCTime.typeId: UTCTimeEncoder(), + # Sequence & Set have same tags as SequenceOf & SetOf + univ.Set.typeId: SetEncoder(), + univ.SetOf.typeId: SetOfEncoder(), + univ.Sequence.typeId: SequenceEncoder(), + univ.SequenceOf.typeId: SequenceOfEncoder() +}) + + +class Encoder(encoder.Encoder): + fixedDefLengthMode = False + fixedChunkSize = 1000 + +#: Turns ASN.1 object into CER octet stream. +#: +#: Takes any ASN.1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: walks all its components recursively and produces a CER octet stream. +#: +#: Parameters +#: ---------- +#: value: either a Python or pyasn1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: A Python or pyasn1 object to encode. If Python object is given, `asnSpec` +#: parameter is required to guide the encoding process. +#: +#: Keyword Args +#: ------------ +#: asn1Spec: +#: Optional ASN.1 schema or value object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: +#: Returns +#: ------- +#: : :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2) +#: Given ASN.1 object encoded into BER octet-stream +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error +#: On encoding errors +#: +#: Examples +#: -------- +#: Encode Python value into CER with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> encode([1, 2, 3], asn1Spec=seq) +#: b'0\x80\x02\x01\x01\x02\x01\x02\x02\x01\x03\x00\x00' +#: +#: Encode ASN.1 value object into CER +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> seq.extend([1, 2, 3]) +#: >>> encode(seq) +#: b'0\x80\x02\x01\x01\x02\x01\x02\x02\x01\x03\x00\x00' +#: +encode = Encoder(tagMap, typeMap) + +# EncoderFactory queries class instance and builds a map of tags -> encoders diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da3fd93455e3b7cb5a6262770357e5e6786ac996 GIT binary patch literal 144 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHx4SFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358QOWr!smb~&sYUwn@tJv<CGqik1(mlrY;yBc ON^?@}K*kmWF#`a0#UpnB literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/decoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/decoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ddb226ae1f5a1eaedc3b99c09274ebb7e64ad9a GIT binary patch literal 1178 zcmbVK&2G~`5FY=;j^m_G`jgT-2Xbg55aLt;qE)L(P$Ytcv=Ukw?-Jtruj_TyoWqkK zao|z<09<_K#4B)OcAZoa^i;<?nQvx1`^~qz+v|0He&_sK2jCa1Judn$ag{F&0EVvt z2|#K9F~CsRgv5l@0%9SyV2T+VPMHm?1z$1W0&YOuf(4eeFyR1mb;8vNM<*QZyFi*? z8)6R@0Hh5Z{SI&oVjtozaBKt`_B6!L8@QpNtKiIn1(H+S2CGH^T))@7`l{mi;|Y)f z@Bze|z}j%(fw)=1cnjifAltyV*HQ=rxNw(c=wtTq@&-PfG7nfs4}>&v%N;$?4sd*t zegF#-$WXPKjQrn9*^yDZj7K@+0$sbxW>>Y-1R|ARJt%l1{SY0FY8dJOh^fv1)kftf zBdhMen#qY2vut|Y^gKBq*>#)JEKE72b%)Y4XH}y7E~S@Mm@G5HvMP#P$fG<frKlpw z*-0+aA0Y4&H0ICYSf<6em=*goEDDok{}bcY{OR?RaWN0e?D6VPjT4P=BwTv5gJLdP z*r$i9G|_Yojqfqy=3C_U|B%8_G}Q$aZDl-VZmBn(uVP&^16(T_3ZLJDhr6cmKbw=y zrI=?K<DXyiY%0Ip$wkTWXpM`)qg~Q()I88K9z<LSB^mLTVL30jurN})l;SB+s<qUU z5&s<zlO;9c$Z+~5ENVN-i+Sx-1q&r7-t8sP1rsibza}cNRSV*(ZPdrkRhU$~B)$r) zI&Tyrm-$hi7J0@qS$mX5Nm!PYVo$6)V?qrhY-R2^hPr*&T*T+<$jXOk`bOXMtUY_r X_RPR=i~xT_E3me-_rTb&_MZI($oBZi literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/encoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/__pycache__/encoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97ec98cbcaf9a78ca2fe1a72e7da31bfd67f8475 GIT binary patch literal 1723 zcmaJ>&2HO95S}F|N}?&-ahs$rf|v<lAUZ@&ik<?)aNrn0(b^~=pNJL&L#}1Y6v-^9 zAQGHQUG(SJhv=aw&==@4^wt6euRY}za_Tp$A3G>eN;{ez&d;~sjP`b?<NWorl)@$Y zhps&q^nI-IPly;_K`GHlkS|E^-k{W=kx9Ne+nbbHG-{CFz}}((JZ*X&Hz>C0Tlm`~ zO&T`o5+O~kw`ka=OCrBT61qdOLBkaqx+LL7lnA;+F%Ii2TstJ8FI`vPcYPi=DQ@X< z$ceZ$U2csezOZ!Y(jb4G;x_fW&Rd*}x}t7KrE&$ODYGb#C9BprOJ3FX%n-5T;xVD@ zW0m(IB+v_{$2YhhNCGc7EpYo5#U{#FwbPf?;Vg3`5X6r)U!1M{8{&fKD}#O{dL!rp zX#}0ONZq3!U@<7O*$CyrpdnEuXsDHQgVZ0|Xp+m?GBV)Ep~XB70pok3Qw<K7zC$%6 z0NFM@1JXApRZY4u88te0Zj$<)D%~BlZ~037%1tbOBan>Trv}|Zz&9E$g2DUdCYQ>P z3*eyP5dCg@D*L&ry#C>d7v-ZO&tz7W-iwJ>g#*X&=8yJ?Wg)XT$p&7YdDWTp!l)XD zsdsReCz14Ch3Qy&58_D{j*`eLk+!=`aJ=N!m~;C9bNc{dpy~bk?wnf?2>j<ZDa|Uj zKN<AWrv5KH4HlBiu2CDkM}C|2_+(N@yl5}ct0t1Z+uf-~#ZHkF50k8{!ZdyOB9`OH zr>{TRDJEf=Jzo6qOhr4GtDX6L^@_<mXE#mCic{|0W1Kt?Z8F95(bcr{f@Mjj=W{vf z?WTDYrsW=#Mfh8usp;MA@;bezxmvImR^GOnwvWbXl@zJ;rj29tz*8L7b!xl9@ji<c z1Muw`(=dhu;PBmntPU1U^E*p8Oo{I-*(qx?m6>AV{gp2#PjUD|{hzY@^<~V{Of%`X zn45kfBfrJ(I91)?RHf#%E0lvgY6YUc@gD}(U@kv~Alo%u(Kc*jOSqzAZW$ZG7Te~A zIlc3L6drdQbt?$CU=Y+!5RCG8oU-l)!Anfr{EdsAR!KCH)ma{^4HVSyt_enn5h7Z} zD*5oP(EIo93#NIW9qvF}zc29bz}<=a;_9Yo&aa6R-5elQJj3ck7B?aMjnm|{jGxKV zFJv~T&W<oy{;IYeoQ<>delnHU0P>h>9@TAVPq6fux!_4#j=MK}dp4`H-mT9zJw36# z2=^l2PyWi>%#)($q;3WQ20jS%aebbaqp+y0C@&_pJuc#~lC_C0C~lYE<UlwmCQ4UU m4c0WiE1^5y+MV@dkL~405bFXTqit?(tqI$>Wol_{KK>W2$%k(M literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/decoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/decoder.py new file mode 100644 index 0000000..1a13fdb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/decoder.py @@ -0,0 +1,94 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1.codec.cer import decoder +from pyasn1.type import univ + +__all__ = ['decode'] + + +class BitStringDecoder(decoder.BitStringDecoder): + supportConstructedForm = False + + +class OctetStringDecoder(decoder.OctetStringDecoder): + supportConstructedForm = False + +# TODO: prohibit non-canonical encoding +RealDecoder = decoder.RealDecoder + +tagMap = decoder.tagMap.copy() +tagMap.update( + {univ.BitString.tagSet: BitStringDecoder(), + univ.OctetString.tagSet: OctetStringDecoder(), + univ.Real.tagSet: RealDecoder()} +) + +typeMap = decoder.typeMap.copy() + +# Put in non-ambiguous types for faster codec lookup +for typeDecoder in tagMap.values(): + if typeDecoder.protoComponent is not None: + typeId = typeDecoder.protoComponent.__class__.typeId + if typeId is not None and typeId not in typeMap: + typeMap[typeId] = typeDecoder + + +class Decoder(decoder.Decoder): + supportIndefLength = False + + +#: Turns DER octet stream into an ASN.1 object. +#: +#: Takes DER octet-stream and decode it into an ASN.1 object +#: (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) which +#: may be a scalar or an arbitrary nested structure. +#: +#: Parameters +#: ---------- +#: substrate: :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2) +#: DER octet-stream +#: +#: Keyword Args +#: ------------ +#: asn1Spec: any pyasn1 type object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: A pyasn1 type object to act as a template guiding the decoder. Depending on the ASN.1 structure +#: being decoded, *asn1Spec* may or may not be required. Most common reason for +#: it to require is that ASN.1 structure is encoded in *IMPLICIT* tagging mode. +#: +#: Returns +#: ------- +#: : :py:class:`tuple` +#: A tuple of pyasn1 object recovered from DER substrate (:py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: and the unprocessed trailing portion of the *substrate* (may be empty) +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error, ~pyasn1.error.SubstrateUnderrunError +#: On decoding errors +#: +#: Examples +#: -------- +#: Decode DER serialisation without ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> s, _ = decode(b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03') +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +#: Decode DER serialisation with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> s, _ = decode(b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03', asn1Spec=seq) +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +decode = Decoder(tagMap, typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/encoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/encoder.py new file mode 100644 index 0000000..90e982d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/der/encoder.py @@ -0,0 +1,107 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import error +from pyasn1.codec.cer import encoder +from pyasn1.type import univ + +__all__ = ['encode'] + + +class SetEncoder(encoder.SetEncoder): + @staticmethod + def _componentSortKey(componentAndType): + """Sort SET components by tag + + Sort depending on the actual Choice value (dynamic sort) + """ + component, asn1Spec = componentAndType + + if asn1Spec is None: + compType = component + else: + compType = asn1Spec + + if compType.typeId == univ.Choice.typeId and not compType.tagSet: + if asn1Spec is None: + return component.getComponent().tagSet + else: + # TODO: move out of sorting key function + names = [namedType.name for namedType in asn1Spec.componentType.namedTypes + if namedType.name in component] + if len(names) != 1: + raise error.PyAsn1Error( + '%s components for Choice at %r' % (len(names) and 'Multiple ' or 'None ', component)) + + # TODO: support nested CHOICE ordering + return asn1Spec[names[0]].tagSet + + else: + return compType.tagSet + +tagMap = encoder.tagMap.copy() +tagMap.update({ + # Set & SetOf have same tags + univ.Set.tagSet: SetEncoder() +}) + +typeMap = encoder.typeMap.copy() +typeMap.update({ + # Set & SetOf have same tags + univ.Set.typeId: SetEncoder() +}) + + +class Encoder(encoder.Encoder): + fixedDefLengthMode = True + fixedChunkSize = 0 + +#: Turns ASN.1 object into DER octet stream. +#: +#: Takes any ASN.1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: walks all its components recursively and produces a DER octet stream. +#: +#: Parameters +#: ---------- +#: value: either a Python or pyasn1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: A Python or pyasn1 object to encode. If Python object is given, `asnSpec` +#: parameter is required to guide the encoding process. +#: +#: Keyword Args +#: ------------ +#: asn1Spec: +#: Optional ASN.1 schema or value object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: +#: Returns +#: ------- +#: : :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2) +#: Given ASN.1 object encoded into BER octet-stream +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error +#: On encoding errors +#: +#: Examples +#: -------- +#: Encode Python value into DER with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> encode([1, 2, 3], asn1Spec=seq) +#: b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03' +#: +#: Encode ASN.1 value object into DER +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> seq.extend([1, 2, 3]) +#: >>> encode(seq) +#: b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03' +#: +encode = Encoder(tagMap, typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4930f14925f7c370f2b105225e59c4582dc75c GIT binary patch literal 147 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHu&iFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358QOWr!smc0zi6xn3srvEpnR%Hd@$q^EmA5!- Ra`RJ4b5iX<CKm%S0|4@}B*p*$ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/decoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/decoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e725a06e6cf8a19b59afb44cf22fc9f7c932920 GIT binary patch literal 5062 zcmbtX-E-T<5nm7={17QpU$m9@19l?EOl&ER?M!CsCYCH&qe&uZBFRoMlVTv^D1ib2 z_yF1_M}Dc&PN&oS8GYy<lo!1AsqdZXv`^hV5ENiZGaZ{Gj`!QW+q>J}?cL&1tycN< zZ;bu>D!@M=^Z5$vkMRk&6aX8461V_82@DA&!Ucf~U=$K8gDXQ%0Ygc!BCraEnqXC6 z4Gb;8n!rUciU}?XTmqwnxC93{QW=;8-3qV?u#<WfP9({w!Ma@mdjfvOc}xJCgcBKz zI!dcx*MzhNtS+Ptlum+O7t(s#b_%5pu&0D{DwR&7bQ<g#A)QI3SSdnx7P@o7CJ5Nf z!%G4-;3Uyr&THrM@Pj=3Fb}Wf;Z*^rQp?x!@VbCALaRbo&-6ujBM)!p;YWG+aUL$@ z;jKLUBoA-rVJi<m&A<|LKg+{Ad3g5}I`d#Grp{l=J3kB2`3SSl&uY>6S%}WhLUeu> zqVuy5y^V0}{LclPPPss8vf6ujEmDKpgc{sGUkHeM5_d?#)OetTsVqdMvJjcdLS!ln zk*O?1rm_&3%0gr+3z4ZTM5e|tVJZuesVqdMQs`U(<30w@EZB1*cra9wpnL!ff5_r} zIKi{xA=pjWX<hm!oir^eR&BQ5KcEWZ+~-(P_N|c7fBVoPEJqgUmA>b^#DA?HvQFQP zHJi14o5gC!wGP5InM*%1RvzOMUdMs~9awl?;W33r7@k_T3_s)9A`{$cDe>I$ei(79 z9qqI&*W#<fF5he`*qc5oJ_UTf#V4#`aa@2dmJ%LCXh7P;S*dN;_gG7fm5{lexD*Vw z_PeYd#U(5B?(GDu9hZ{{Kka*Q(GMcW_rkvepGJHC{bniZ1xtYw+;zM#vRwD>zRmiB z2d}?a3I=2#{i7APmpm(SUb3ac9$yRwamh4s?yhOh(Hv>AAPujbyROBwDXtv5c~*~^ zW?V7No^SVEs#i_(Mc;B04WC6@VwRa=hGY|1kWvg+l>~kt8X7B3v=ed1J2;mCB2_Rj zkClXh2=4}@LLO0(vZ3%QHsM7q;_}$2(dcl$x8isfA0)%HR8DO2Nh<18G^m)Of@nz! zu~u5=2l%9}ogbSW%{AjyP8{$i6_=>E(1DjxON&VzNcepmIJ?7M^qJRYTYQH_XPj6< z^R$(P6Q5%xapDQU8&%XLc%#AV-@vg7t3Ta`H$^zcp9Du5@GEdE+>Da>V~rH^==x&? ze!&vE7va&1EASkvA|PZzL0oJ5y#V9Fi*^SAiz~F1lelP=F7$m|re@D9x6k7G*g!}Y zLX38Yx%PSVP^^bUJV@0-xlog;(n4W)^*o=v3t7beH5!6~3wJx=_aW=@cw!wv*H-5Y zVYGqAg#8vlmax~K5;dzo-6Yb`?OjPQgmsLF0v)wP4rXdEX3o%}SwX-&n}3KlTg3~B z;Fu9&auy5(7w7r>4mJpBUy;vil3p0zxM*4L;&UAhe}+%$bHeZA^V*X`-)XZmj?P8K zk2pxy(Ns?&<5A-A2Wezz|8Hb$pA8M+dyFb1;NnOS1aR7QoObtl419_5kPfiZU4KJT z3&Un^sqf<an`rYPSs!h9!a3)Y{4q7Sjm6np7Bh3YV)3U?LVzy?HXROHTpanoEn`3W z&_5Y_f=@{2CT{Fw08{Wl6>)uwbEObB%u#pK#Ju2pD~P8u5<DYN)RM)Xj<r#XVwA|= zav)uQj^{+C`DYqgT=!C08a75Fpw|-hc%~GQbexML^e+-Xgsgl6<9jGlXzq9qbyX@Q zRAY{jsI$6G0h*-8y=4O&l_2~*L?Uz}OcYBLy;c4SqB6bvV8%jwaDt3duRlmIm?Z~w zt3pwO`8NtY_gqk-NjRzi{|`u#6xE^I5DliFJAGO~+j!m&ri6tVIy#c>x5wT8CAueL z<DrjZPo)F@&XeFrQP9el!~zwdr75FjXO|h_G=)1l@@T!nKWGtWkN3$hG96xI=}*Fv zdd8BLT188uo?05Ye2%hd301hUHiw_vN$RFkF2roziuADU2TWfG@93|5euTM&{>q6C zb=nXp9X?I7Gu;Vw&yVz%mh0I1?eNg=ySBd1bj#C4PKMX2?so_-?`$sK(>Eg4yCb?R zgstK1o_FN=uTmxMJF?!QdC-{YycR;;_w?;SbclbWIp~iT!mo$7GED-GnOGa=pNy1k z*J{S{cU$Y6!X;M4;$kJ}hljC3%|z-ESDY}NGN(;#l$P;Ar3rHiHDh9XK!P>Ox8pLV zgRT{ZrpXt`s77`+?6~wT8;BNMqdwZMb%05Q2r2wGij<_IjDJj>6wU%3%Yh%9y-p~d zGOFm;etPg4l~HFhs0z(nktuSfzhXymwm?CX=J9g5F3lHYX|_-+T*Ln<i7p&XS}M#@ zDb)(uz)iB@O-%9L%Esuhx;Q2K2(^EtamjC0xvFrIY_`5Mv?LK1o*%g}kt_<wQ+rOA zwQ!fnJvm(~anUqIVs1=wcHo2&<KOuQ2P~n=sI9K8?5&%tYfrXT*M8tF>Y@4K%|YbT zoN_{uYjB-vH?c5^8(zc?@O9}PqPV!?`!2IQPN}3ZvDJ>)D2+Ch&A#gzjU?mRurUpD zFn!`iWzFmN7`Gy38_EyNa^q5ZZO1aPt0lLGQQ6yl`c;xF8?{a9<FrSxzKxlBWbL~w z)$cNwMeOwmPCj#N=AYv7#`43o<vO>5!?C5>Gu*EkJL}BDxw+{$d-&SNcsLf6SH9mK z=|(GCWnr5;LF99zKI-fYnZ4`um{Hu@eL@v}i`=(FE>dxYTOFg4E*b0cvNzzLPz$1) zm#H{?0}wTO4TwvRl9!~f=^_Z})@VqXFQ%QB<)(_?TC>uu*QIm5g>z(5T}bEDw{+RI N+4`y7q@U8<{vSD|^dbNN literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/encoder.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/__pycache__/encoder.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4569a0060545589917f488a7022dcbcf3284d35b GIT binary patch literal 7498 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/decoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/decoder.py new file mode 100644 index 0000000..104b92e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/decoder.py @@ -0,0 +1,213 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import debug +from pyasn1 import error +from pyasn1.type import base +from pyasn1.type import char +from pyasn1.type import tag +from pyasn1.type import univ +from pyasn1.type import useful + +__all__ = ['decode'] + +LOG = debug.registerLoggee(__name__, flags=debug.DEBUG_DECODER) + + +class AbstractScalarDecoder(object): + def __call__(self, pyObject, asn1Spec, decodeFun=None, **options): + return asn1Spec.clone(pyObject) + + +class BitStringDecoder(AbstractScalarDecoder): + def __call__(self, pyObject, asn1Spec, decodeFun=None, **options): + return asn1Spec.clone(univ.BitString.fromBinaryString(pyObject)) + + +class SequenceOrSetDecoder(object): + def __call__(self, pyObject, asn1Spec, decodeFun=None, **options): + asn1Value = asn1Spec.clone() + + componentsTypes = asn1Spec.componentType + + for field in asn1Value: + if field in pyObject: + asn1Value[field] = decodeFun(pyObject[field], componentsTypes[field].asn1Object, **options) + + return asn1Value + + +class SequenceOfOrSetOfDecoder(object): + def __call__(self, pyObject, asn1Spec, decodeFun=None, **options): + asn1Value = asn1Spec.clone() + + for pyValue in pyObject: + asn1Value.append(decodeFun(pyValue, asn1Spec.componentType), **options) + + return asn1Value + + +class ChoiceDecoder(object): + def __call__(self, pyObject, asn1Spec, decodeFun=None, **options): + asn1Value = asn1Spec.clone() + + componentsTypes = asn1Spec.componentType + + for field in pyObject: + if field in componentsTypes: + asn1Value[field] = decodeFun(pyObject[field], componentsTypes[field].asn1Object, **options) + break + + return asn1Value + + +tagMap = { + univ.Integer.tagSet: AbstractScalarDecoder(), + univ.Boolean.tagSet: AbstractScalarDecoder(), + univ.BitString.tagSet: BitStringDecoder(), + univ.OctetString.tagSet: AbstractScalarDecoder(), + univ.Null.tagSet: AbstractScalarDecoder(), + univ.ObjectIdentifier.tagSet: AbstractScalarDecoder(), + univ.Enumerated.tagSet: AbstractScalarDecoder(), + univ.Real.tagSet: AbstractScalarDecoder(), + univ.Sequence.tagSet: SequenceOrSetDecoder(), # conflicts with SequenceOf + univ.Set.tagSet: SequenceOrSetDecoder(), # conflicts with SetOf + univ.Choice.tagSet: ChoiceDecoder(), # conflicts with Any + # character string types + char.UTF8String.tagSet: AbstractScalarDecoder(), + char.NumericString.tagSet: AbstractScalarDecoder(), + char.PrintableString.tagSet: AbstractScalarDecoder(), + char.TeletexString.tagSet: AbstractScalarDecoder(), + char.VideotexString.tagSet: AbstractScalarDecoder(), + char.IA5String.tagSet: AbstractScalarDecoder(), + char.GraphicString.tagSet: AbstractScalarDecoder(), + char.VisibleString.tagSet: AbstractScalarDecoder(), + char.GeneralString.tagSet: AbstractScalarDecoder(), + char.UniversalString.tagSet: AbstractScalarDecoder(), + char.BMPString.tagSet: AbstractScalarDecoder(), + # useful types + useful.ObjectDescriptor.tagSet: AbstractScalarDecoder(), + useful.GeneralizedTime.tagSet: AbstractScalarDecoder(), + useful.UTCTime.tagSet: AbstractScalarDecoder() +} + +# Put in ambiguous & non-ambiguous types for faster codec lookup +typeMap = { + univ.Integer.typeId: AbstractScalarDecoder(), + univ.Boolean.typeId: AbstractScalarDecoder(), + univ.BitString.typeId: BitStringDecoder(), + univ.OctetString.typeId: AbstractScalarDecoder(), + univ.Null.typeId: AbstractScalarDecoder(), + univ.ObjectIdentifier.typeId: AbstractScalarDecoder(), + univ.Enumerated.typeId: AbstractScalarDecoder(), + univ.Real.typeId: AbstractScalarDecoder(), + # ambiguous base types + univ.Set.typeId: SequenceOrSetDecoder(), + univ.SetOf.typeId: SequenceOfOrSetOfDecoder(), + univ.Sequence.typeId: SequenceOrSetDecoder(), + univ.SequenceOf.typeId: SequenceOfOrSetOfDecoder(), + univ.Choice.typeId: ChoiceDecoder(), + univ.Any.typeId: AbstractScalarDecoder(), + # character string types + char.UTF8String.typeId: AbstractScalarDecoder(), + char.NumericString.typeId: AbstractScalarDecoder(), + char.PrintableString.typeId: AbstractScalarDecoder(), + char.TeletexString.typeId: AbstractScalarDecoder(), + char.VideotexString.typeId: AbstractScalarDecoder(), + char.IA5String.typeId: AbstractScalarDecoder(), + char.GraphicString.typeId: AbstractScalarDecoder(), + char.VisibleString.typeId: AbstractScalarDecoder(), + char.GeneralString.typeId: AbstractScalarDecoder(), + char.UniversalString.typeId: AbstractScalarDecoder(), + char.BMPString.typeId: AbstractScalarDecoder(), + # useful types + useful.ObjectDescriptor.typeId: AbstractScalarDecoder(), + useful.GeneralizedTime.typeId: AbstractScalarDecoder(), + useful.UTCTime.typeId: AbstractScalarDecoder() +} + + +class Decoder(object): + + # noinspection PyDefaultArgument + def __init__(self, tagMap, typeMap): + self.__tagMap = tagMap + self.__typeMap = typeMap + + def __call__(self, pyObject, asn1Spec, **options): + + if LOG: + debug.scope.push(type(pyObject).__name__) + LOG('decoder called at scope %s, working with type %s' % (debug.scope, type(pyObject).__name__)) + + if asn1Spec is None or not isinstance(asn1Spec, base.Asn1Item): + raise error.PyAsn1Error('asn1Spec is not valid (should be an instance of an ASN.1 Item, not %s)' % asn1Spec.__class__.__name__) + + try: + valueDecoder = self.__typeMap[asn1Spec.typeId] + + except KeyError: + # use base type for codec lookup to recover untagged types + baseTagSet = tag.TagSet(asn1Spec.tagSet.baseTag, asn1Spec.tagSet.baseTag) + + try: + valueDecoder = self.__tagMap[baseTagSet] + except KeyError: + raise error.PyAsn1Error('Unknown ASN.1 tag %s' % asn1Spec.tagSet) + + if LOG: + LOG('calling decoder %s on Python type %s <%s>' % (type(valueDecoder).__name__, type(pyObject).__name__, repr(pyObject))) + + value = valueDecoder(pyObject, asn1Spec, self, **options) + + if LOG: + LOG('decoder %s produced ASN.1 type %s <%s>' % (type(valueDecoder).__name__, type(value).__name__, repr(value))) + debug.scope.pop() + + return value + + +#: Turns Python objects of built-in types into ASN.1 objects. +#: +#: Takes Python objects of built-in types and turns them into a tree of +#: ASN.1 objects (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) which +#: may be a scalar or an arbitrary nested structure. +#: +#: Parameters +#: ---------- +#: pyObject: :py:class:`object` +#: A scalar or nested Python objects +#: +#: Keyword Args +#: ------------ +#: asn1Spec: any pyasn1 type object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: A pyasn1 type object to act as a template guiding the decoder. It is required +#: for successful interpretation of Python objects mapping into their ASN.1 +#: representations. +#: +#: Returns +#: ------- +#: : :py:class:`~pyasn1.type.base.PyAsn1Item` derivative +#: A scalar or constructed pyasn1 object +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error +#: On decoding errors +#: +#: Examples +#: -------- +#: Decode native Python object into ASN.1 objects with ASN.1 schema +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> s, _ = decode([1, 2, 3], asn1Spec=seq) +#: >>> str(s) +#: SequenceOf: +#: 1 2 3 +#: +decode = Decoder(tagMap, typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/encoder.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/encoder.py new file mode 100644 index 0000000..4318abd --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/codec/native/encoder.py @@ -0,0 +1,256 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +try: + from collections import OrderedDict + +except ImportError: + OrderedDict = dict + +from pyasn1 import debug +from pyasn1 import error +from pyasn1.type import base +from pyasn1.type import char +from pyasn1.type import tag +from pyasn1.type import univ +from pyasn1.type import useful + +__all__ = ['encode'] + +LOG = debug.registerLoggee(__name__, flags=debug.DEBUG_ENCODER) + + +class AbstractItemEncoder(object): + def encode(self, value, encodeFun, **options): + raise error.PyAsn1Error('Not implemented') + + +class BooleanEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return bool(value) + + +class IntegerEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return int(value) + + +class BitStringEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return str(value) + + +class OctetStringEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return value.asOctets() + + +class TextStringEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return str(value) + + +class NullEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return None + + +class ObjectIdentifierEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return str(value) + + +class RealEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return float(value) + + +class SetEncoder(AbstractItemEncoder): + protoDict = dict + + def encode(self, value, encodeFun, **options): + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency + + namedTypes = value.componentType + substrate = self.protoDict() + + for idx, (key, subValue) in enumerate(value.items()): + if namedTypes and namedTypes[idx].isOptional and not value[idx].isValue: + continue + substrate[key] = encodeFun(subValue, **options) + return substrate + + +class SequenceEncoder(SetEncoder): + protoDict = OrderedDict + + +class SequenceOfEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency + return [encodeFun(x, **options) for x in value] + + +class ChoiceEncoder(SequenceEncoder): + pass + + +class AnyEncoder(AbstractItemEncoder): + def encode(self, value, encodeFun, **options): + return value.asOctets() + + +tagMap = { + univ.Boolean.tagSet: BooleanEncoder(), + univ.Integer.tagSet: IntegerEncoder(), + univ.BitString.tagSet: BitStringEncoder(), + univ.OctetString.tagSet: OctetStringEncoder(), + univ.Null.tagSet: NullEncoder(), + univ.ObjectIdentifier.tagSet: ObjectIdentifierEncoder(), + univ.Enumerated.tagSet: IntegerEncoder(), + univ.Real.tagSet: RealEncoder(), + # Sequence & Set have same tags as SequenceOf & SetOf + univ.SequenceOf.tagSet: SequenceOfEncoder(), + univ.SetOf.tagSet: SequenceOfEncoder(), + univ.Choice.tagSet: ChoiceEncoder(), + # character string types + char.UTF8String.tagSet: TextStringEncoder(), + char.NumericString.tagSet: TextStringEncoder(), + char.PrintableString.tagSet: TextStringEncoder(), + char.TeletexString.tagSet: TextStringEncoder(), + char.VideotexString.tagSet: TextStringEncoder(), + char.IA5String.tagSet: TextStringEncoder(), + char.GraphicString.tagSet: TextStringEncoder(), + char.VisibleString.tagSet: TextStringEncoder(), + char.GeneralString.tagSet: TextStringEncoder(), + char.UniversalString.tagSet: TextStringEncoder(), + char.BMPString.tagSet: TextStringEncoder(), + # useful types + useful.ObjectDescriptor.tagSet: OctetStringEncoder(), + useful.GeneralizedTime.tagSet: OctetStringEncoder(), + useful.UTCTime.tagSet: OctetStringEncoder() +} + + +# Put in ambiguous & non-ambiguous types for faster codec lookup +typeMap = { + univ.Boolean.typeId: BooleanEncoder(), + univ.Integer.typeId: IntegerEncoder(), + univ.BitString.typeId: BitStringEncoder(), + univ.OctetString.typeId: OctetStringEncoder(), + univ.Null.typeId: NullEncoder(), + univ.ObjectIdentifier.typeId: ObjectIdentifierEncoder(), + univ.Enumerated.typeId: IntegerEncoder(), + univ.Real.typeId: RealEncoder(), + # Sequence & Set have same tags as SequenceOf & SetOf + univ.Set.typeId: SetEncoder(), + univ.SetOf.typeId: SequenceOfEncoder(), + univ.Sequence.typeId: SequenceEncoder(), + univ.SequenceOf.typeId: SequenceOfEncoder(), + univ.Choice.typeId: ChoiceEncoder(), + univ.Any.typeId: AnyEncoder(), + # character string types + char.UTF8String.typeId: OctetStringEncoder(), + char.NumericString.typeId: OctetStringEncoder(), + char.PrintableString.typeId: OctetStringEncoder(), + char.TeletexString.typeId: OctetStringEncoder(), + char.VideotexString.typeId: OctetStringEncoder(), + char.IA5String.typeId: OctetStringEncoder(), + char.GraphicString.typeId: OctetStringEncoder(), + char.VisibleString.typeId: OctetStringEncoder(), + char.GeneralString.typeId: OctetStringEncoder(), + char.UniversalString.typeId: OctetStringEncoder(), + char.BMPString.typeId: OctetStringEncoder(), + # useful types + useful.ObjectDescriptor.typeId: OctetStringEncoder(), + useful.GeneralizedTime.typeId: OctetStringEncoder(), + useful.UTCTime.typeId: OctetStringEncoder() +} + + +class Encoder(object): + + # noinspection PyDefaultArgument + def __init__(self, tagMap, typeMap={}): + self.__tagMap = tagMap + self.__typeMap = typeMap + + def __call__(self, value, **options): + if not isinstance(value, base.Asn1Item): + raise error.PyAsn1Error('value is not valid (should be an instance of an ASN.1 Item)') + + if LOG: + debug.scope.push(type(value).__name__) + LOG('encoder called for type %s <%s>' % (type(value).__name__, value.prettyPrint())) + + tagSet = value.tagSet + + try: + concreteEncoder = self.__typeMap[value.typeId] + + except KeyError: + # use base type for codec lookup to recover untagged types + baseTagSet = tag.TagSet(value.tagSet.baseTag, value.tagSet.baseTag) + + try: + concreteEncoder = self.__tagMap[baseTagSet] + + except KeyError: + raise error.PyAsn1Error('No encoder for %s' % (value,)) + + if LOG: + LOG('using value codec %s chosen by %s' % (concreteEncoder.__class__.__name__, tagSet)) + + pyObject = concreteEncoder.encode(value, self, **options) + + if LOG: + LOG('encoder %s produced: %s' % (type(concreteEncoder).__name__, repr(pyObject))) + debug.scope.pop() + + return pyObject + + +#: Turns ASN.1 object into a Python built-in type object(s). +#: +#: Takes any ASN.1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: walks all its components recursively and produces a Python built-in type or a tree +#: of those. +#: +#: One exception is that instead of :py:class:`dict`, the :py:class:`OrderedDict` +#: can be produced (whenever available) to preserve ordering of the components +#: in ASN.1 SEQUENCE. +#: +#: Parameters +#: ---------- +# asn1Value: any pyasn1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) +#: pyasn1 object to encode (or a tree of them) +#: +#: Returns +#: ------- +#: : :py:class:`object` +#: Python built-in type instance (or a tree of them) +#: +#: Raises +#: ------ +#: ~pyasn1.error.PyAsn1Error +#: On encoding errors +#: +#: Examples +#: -------- +#: Encode ASN.1 value object into native Python types +#: +#: .. code-block:: pycon +#: +#: >>> seq = SequenceOf(componentType=Integer()) +#: >>> seq.extend([1, 2, 3]) +#: >>> encode(seq) +#: [1, 2, 3] +#: +encode = Encoder(tagMap, typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eaa57d4384b1cf755d102f3644805dd11e6260f GIT binary patch literal 141 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHx4PFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358QOWta1&Jm4@$s2?nI-Y@dIgoYIBatBQ%ZAE L?LcN012F>t3=JZX literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/binary.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/binary.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f9cbe1d8fe1ca62e3e5cc522f9210021ea51954 GIT binary patch literal 601 zcmYjOJ&)5s5Ph?DoDU^jj)Dk5k6eWK5J(iK;}D`l*Ia>=2HCfJCnwI@>^i3yCDn01 zgo1*<!2h7xmMVXNidjpMZsmQRc{4lnc6Krv4gUO8>bC&?;=u~oKId)UF-ZOh1+XH_ z38bi{1nvc%$}X0Gc>@_jcJLjT3+M<+ctb|GjC*@7f|%U!RvDX@`b(~_%RTqRK4Q2c zALr$}`u%~o{lRbp><HVo|1yMm1}U)P`Y#S7w?2goJXyn&cZ40h0M^6g=DjD)eVgCG zIZIp$m?gG^1>Ym`2S|?&ez)~~#|}Pmp|2nD*{2HJ0kq{C^{@zhHlLeZ#{CQ9)jN@7 z--2n9&4VOM_ANyxjuMABbU~U~7o}CDv~*pg{1}uA7iF&Fz;$lZVy))=EU#^Ca(&~X z%Bbsn^9yFowg0`H)vIb&<<&ITwoZ#;nn|^8UT<E_swTDi<nX&HS5;civRtR8d090s zU~}My`J4e1i6QlAND&>0Nc3q;V=)qs#6XzG9KVQ#@#8lk0}BgmV~u~MHri@=0LL6~ Wz0*}G*M&OkvS<Bcj>Qu?n*0Y*@_9=D literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/calling.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/calling.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cab3839d017b07e1c7786bc77ff1659f50fa98b9 GIT binary patch literal 460 zcmYjNyH3ME5S%;PiQ^<nI>Zkkxd;}B280k&`ZRQDEXQ|5hVw&r4vGaG@F^605RF?Z z{{j_z7Dzd1XGi;(9o^A%8hm|7`OJWC96Xo!Erk&T6oNqkIm4QP363o>4&g&G2oJ)+ zJIAr>JObqv#0W$R4$kztU-zIKtR09UX!{LVyC?>bt|cUJ7X}?&Lde?5lhh_Fi#RLp z%hpd5rIL-39jA6TBv^G0VM><!XR|FVDa@Rp23`mm9yne(NwZbxv_WRF!qiET%66QV zO3AdQE2j0Ae;4RB+kZljN#o}-s`DzUvTD(9DYe)Lxoa-==TX%pra1dgX_;3^9a)=M zu|2ICZOzQA8S5A<<l6qG_6Ud%EVqTwYaP=VZKv8{9FssCYu~o5LT}>$CU(rf&P%aV S^2Yvy2?*wV<eabxpLxIAKwgso literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/dateandtime.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/dateandtime.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..351c88c71704489b557d32460c82ebc94e04eff2 GIT binary patch literal 594 zcmY*VJx{|h5Ix&1O-m}e0Agd!P%023AS5KlF5R+3p*AQbU$R})NZo*qzrnx{V#x?o z{sI$sZc&S6pYO}>-t%F<-}`)5>Wcw<!`2e$U*j<|G!i$16d+vr98v}ugOCBEnt+r; zCLk0Tx8MOQEl`3U$u_)lIFem>WS~Qk9l(wkgla?XgY-5bc29y{gY#e<u-cQcRW`{K z`u>yBCMohL$?uEWGgg;WX*l*aEi_Z|XwglH8$9M1jm6Di#$gGtWbn)#EACjm0ZtTS zjpCu%K@$i~0CkJdHQ@vt1GTVqkLcVMI*aWG=v^%RT#js3j>@DQCb_Y3nhx)znpfwG zvr$>aCO`eVrbSl9c0>qqE(!ajtQ`CRag5{6{z;(kcM_-pCCu1{|0H1JfIFgVin@zk zx<`hHt&C3|N!Z7;o`KKWly+Kov`4-ZEKFrI4Xry-gi4~wJ>7zHz=T<Q7g-_ask-W5 QWGLmc0UPkHIN*EjU(fz*+5i9m literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/integer.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/integer.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ce6ba05404e7b9ac39656d8cf9f32cec92f5179 GIT binary patch literal 2505 zcmZWq-EJF26h5=N{#)B|{^}&96t_@XBee+;2r5trs)|6WQiNNemQZAS$H^w%T{Amw z8)QpB$_+2jC#Vn-FTfSgzy&vR%avb&8~DzwlSX0fnVp$)=FB<YeCO;+wd()%LdxID zM1Rwnr-Jb|T6$3s1^5dZ5VeVpE}cvTwFOB*2M!%W<kDC1W%8s)GDm%f4t-Lek`N+r zSokOw^feoDX^^L=K<xrWMQRr*Dp9*cLJ}SL*0x7KIkXlm&>_zMnWRfFap;noT5+BR zWr`})u258^cJ<8GwZNl8kJRrZ=crwypg=*9f)YK0v-5Te4{%DEp24dH3Mv#-=^5N# zr1+*)nERhT?40Vu$ca86X*Cz84BCz<-1+=S?<aB7HHD<7H^W#PFCGmBrXu5Xq-0C0 zFy5Ow(4M;JnvN-SHoLp~@~J6wH#<D|q{m`@Si?iRgO)x*H^v)&<48@U1!;$ujs^dL z&ap!itO!yMNxLk9>Ke;j+Q!=0AwZ+O*`^>z%Ui20thSo@9fd2V={$Geb7!YTjG8&) z4U%|Il`v5`?$|No4kQPfN1#%tCZC3Tu?$S^ac3}+zmi&l(m%J?bu?TbhQpg-oa)YC zaI+i8(a}3kH`j+poiu*?<kd@}VMnh6F}Wwzt>KaJ`znccyGL54YcQ2E8A;@Y=e*)v z6m>^kz`Vz<@B`|;#OfC~pG6PyfPW0hZ31Q)S`*8qu}fPMi^bTZ6}0*!N8b(^SKtNI zeiRhnII-i93M_zv4(%A&w*W6}!6<ez;5mB{9ut(wJIT{HPY0M=fqKDHW`FHOtaH4S z-QKqPg95u_g*U?49P>T>laEy&iI=(sTAmb0LkYJHS8?q{8slHEynj`I?%8w|tXKu} zFXFwjjHB3ee063K`mnHyRN!>M35dKri(EsNIXg?lian=fv3xGZB~F2D^@Et<oFnzz zo;y3EegYgW0D?KT#)oUTW+R^XH1@%~`HXprulKt*d!6{YZuFA)u~fPd%e{^cAIk=4 z(a=d_6lWw;c_<rk&xnmFCrI1b*icmrrUkZA&(xDfH{9cGGjqy^P%%-A)9+9J#nUXA zQa9B1WW1;MP4zxb?GKVCca=(%V#~(m)GW$4NS}myU)Ahd)Ol)L9HMM~l+_{|USLrk zNx`N(SWVkSD1OQ5(5~97c#zzUdr2To5mqxn38U=zc4^oNW<$Rps#M?S%xYJ%1lzS1 zY*uC6GM`t}NtPmSV3uy7BT+$;R9s&yxHYkgbjgdnQx`Qc@5~F|UBtWQRKyig7Zqm> zQXf02XueZ%)HPV>aqjcO$;IssTKWyTtn6f21lCTn5|q^+L91EyIk4#kvHF1dg=Bi4 z1$MNp?$1W=&DK1+osC+}+>X6iRmVw|4{8;orl&6BW!z3TwfL*ocomf=9z|WL6o;-} z=Z;IxOK{XBOdp`7T-C@y<UqmCevXx%mRc^kT-t1;ybqBcoGGx#bfggK$gv|@O?St* z;Fi7ermL<%-&P}&v*oJkC_d4O&-=thtBaP}A}>zs7sGt&Ko1i*0G#2&F$QOA`@0rE zL3KF9r6`-bWC6vF3~E6a8F8qoFZc?E4>^Dp)PEGClQ>ZIIcsd`&j7!{Q)V*4YT#vj z5P3HvwdDrZPuZ@nvi3R9nLrXP<=h}~0o3!IQ${hfIC6_KgOr5{vSg9Anqmj=Sw!E0 zxGB_iyv`rOHx!}GP{a;Se9NBZl5x|c)D(w<j_xNaG8cySqr4kN!-0%stWi^v*vy@q zmp_Y!iPARr&D_TtpX%;NOFM5bXJ4yZ*=OojmXh{6Xv>8CESd_+M+(!sVcbtlu^Yyn zv=@f9N@QP88`m7W$~>@uS{|N>&%(J3sVROKCBbMQw>Y-6fv)1X$k};kNtB&S&NX}l Rmyp}F^5RBquI4Tl{{!qq<$C}C literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/octets.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/octets.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc95b651fe01d92fb1b48148b3bd12892f1e836 GIT binary patch literal 2026 zcmb_cO>fgc5S_IX=L4rrTcN6`5)wiPBht_cq#{)n5}eaRI9Wm{jkn<9*kRW}O$Dd& z2lx>j_(5EJ<<uMJo_Mo~lNQnzS`zPgX1x1m=I!h**J{=8U!~kB68)f4KMVRZ4E+-# zz#}Lk>Iw1%2`SjM5?J(3kUAo1k#AFgr$C>H`~n3<@{1%L@=FvrxxY*S%+Z_*1u#c? zl>(R}{RRavN4iV0M*bYdA<20Ii?5?kHpv1VAy$zBH+KTOmg@kY%XNUy=Q_aaxem02 zTt_T~z>-C3drQZtnmm!YAEeS@62A`Pz2ull=?eaYAHQvk=NS4H1Sr~vw3rC6@R8`n zksv&6uh7b-3mK(=(dLD#5O2)nSBvyXPzv2F`eM<0huYsbi&7Y;8%a0ytjt<_l!*g{ z?II&iHk)a$-|UC|Mi}d~6Ge^PKn{kF4>p?pVMoX7`Kz1s`kk~17@6v|{_v!_6@@xw z_qNNaa9$NUT-}N~z1^U*y|xu4-A<%g$tNP2!hRCQcndwvLRGLfE9WZ>96Y3IEV$S+ zv~eUu+X58O2F|90wLQBvnf*^(nS7Wo)VKl4JWG{0ewoFDF_WvR!pG77s_HSY;<|nZ z;tCBA-e;@i1~FA~{pg0aCt5kutdtmO2}5ICAL-^yq)EeaFzz)-w3}s;Lwi+2ZQ3aA z%FNcO^2E7CFV76XwVI;2l1YHnqCIO8##ZzAsOk_|X%L6qB#;*bTEV<OIhpj(w35B? zX%j6pK?Mz<`Os)UpGWuYnb23+xI6z1>F!LVGv#8}_@)_`YqbusZAoKu^U2f3I!bqB zJf`%#y6;^-Mj$VVaerovOB&F0MpoP%rjqyVyaV^(%GjpsE<k>mBe%RdPQXwrW<ImK zZ<TVOsYNym@gRyaJ5hm}gY8$i&-lvGei^66w4GlzPME$M>K$|Kz8v-?TkTYZ@f)^G zKE5ksJy3GwR(y0%T{Gt98eg!zBp5_;o3Ay^B-E|Ca4c6i!m(W||5q&bRVFt3e*sxD BGk5?1 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/string.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/__pycache__/string.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5506d46b20e79a155c7973ac26852c8d762e044 GIT binary patch literal 578 zcmYjOO-lnY5Pg&M+tzwg3Z8{MXi*eAhzQziFM?kPvNo%%Zg)en6&LDB{V5*&L0)q8 z)SsXyCo6u0%*)K?&1B~7Qm4~;dx@eC0^ad&N%r^H?0`Y>CM3X^a7Lhrpahh}vp`QZ za7!>-P*tcJo`5rfv<+4N3z>ZwG-q520lD^FWNe(J7jb%(4QGPC&Z-O}@A>6}IktT^ zd%{pGV+z~=Q+}E7C~z+Dz+2)tT|p%$+_qp2KtxRR%?U{185K`DP3t(}T#lv!Q$~p^ z$vw&8j3<XfAY9ezB+gyyC`=~Nz?jSgRadjQiPLK*ZKNHAjz*3yUt#7s>vOxGk9A+i zdNodM9wy1^rHUrS=KV%r7oknpe~wW$)?wcNuC=BM*VLiO<D5nCbJ{ioNYb+CP*2u` zS>X6r4lj$hQjQKgzgj#J&p^X~%7j3eCf}Nt2jAc~biL;b_SkHxF)`KuVN+oUBu`gZ g<8MmdzudBlFW?$G<4jGGXt&OhtuZW!MbVxA0``w=zyJUM literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/binary.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/binary.py new file mode 100644 index 0000000..addbdc9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/binary.py @@ -0,0 +1,33 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from sys import version_info + +if version_info[0:2] < (2, 6): + def bin(value): + bitstring = [] + + if value > 0: + prefix = '0b' + elif value < 0: + prefix = '-0b' + value = abs(value) + else: + prefix = '0b0' + + while value: + if value & 1 == 1: + bitstring.append('1') + else: + bitstring.append('0') + + value >>= 1 + + bitstring.reverse() + + return prefix + ''.join(bitstring) +else: + bin = bin diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/calling.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/calling.py new file mode 100644 index 0000000..778a3d1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/calling.py @@ -0,0 +1,20 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from sys import version_info + +__all__ = ['callable'] + + +if (2, 7) < version_info[:2] < (3, 2): + import collections + + def callable(x): + return isinstance(x, collections.Callable) + +else: + + callable = callable diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/dateandtime.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/dateandtime.py new file mode 100644 index 0000000..5e471bf --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/dateandtime.py @@ -0,0 +1,22 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import time +from datetime import datetime +from sys import version_info + +__all__ = ['strptime'] + + +if version_info[:2] <= (2, 4): + + def strptime(text, dateFormat): + return datetime(*(time.strptime(text, dateFormat)[0:6])) + +else: + + def strptime(text, dateFormat): + return datetime.strptime(text, dateFormat) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/integer.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/integer.py new file mode 100644 index 0000000..4b31791 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/integer.py @@ -0,0 +1,110 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import sys + +try: + import platform + + implementation = platform.python_implementation() + +except (ImportError, AttributeError): + implementation = 'CPython' + +from pyasn1.compat.octets import oct2int, null, ensureString + +if sys.version_info[0:2] < (3, 2) or implementation != 'CPython': + from binascii import a2b_hex, b2a_hex + + if sys.version_info[0] > 2: + long = int + + def from_bytes(octets, signed=False): + if not octets: + return 0 + + value = long(b2a_hex(ensureString(octets)), 16) + + if signed and oct2int(octets[0]) & 0x80: + return value - (1 << len(octets) * 8) + + return value + + def to_bytes(value, signed=False, length=0): + if value < 0: + if signed: + bits = bitLength(value) + + # two's complement form + maxValue = 1 << bits + valueToEncode = (value + maxValue) % maxValue + + else: + raise OverflowError('can\'t convert negative int to unsigned') + elif value == 0 and length == 0: + return null + else: + bits = 0 + valueToEncode = value + + hexValue = hex(valueToEncode)[2:] + if hexValue.endswith('L'): + hexValue = hexValue[:-1] + + if len(hexValue) & 1: + hexValue = '0' + hexValue + + # padding may be needed for two's complement encoding + if value != valueToEncode or length: + hexLength = len(hexValue) * 4 + + padLength = max(length, bits) + + if padLength > hexLength: + hexValue = '00' * ((padLength - hexLength - 1) // 8 + 1) + hexValue + elif length and hexLength - length > 7: + raise OverflowError('int too big to convert') + + firstOctet = int(hexValue[:2], 16) + + if signed: + if firstOctet & 0x80: + if value >= 0: + hexValue = '00' + hexValue + elif value < 0: + hexValue = 'ff' + hexValue + + octets_value = a2b_hex(hexValue) + + return octets_value + + def bitLength(number): + # bits in unsigned number + hexValue = hex(abs(number)) + bits = len(hexValue) - 2 + if hexValue.endswith('L'): + bits -= 1 + if bits & 1: + bits += 1 + bits *= 4 + # TODO: strip lhs zeros + return bits + +else: + + def from_bytes(octets, signed=False): + return int.from_bytes(bytes(octets), 'big', signed=signed) + + def to_bytes(value, signed=False, length=0): + length = max(value.bit_length(), length) + + if signed and length % 8 == 0: + length += 1 + + return value.to_bytes(length // 8 + (length % 8 and 1 or 0), 'big', signed=signed) + + def bitLength(number): + return int(number).bit_length() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/octets.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/octets.py new file mode 100644 index 0000000..99d23bb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/octets.py @@ -0,0 +1,46 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from sys import version_info + +if version_info[0] <= 2: + int2oct = chr + # noinspection PyPep8 + ints2octs = lambda s: ''.join([int2oct(x) for x in s]) + null = '' + oct2int = ord + # TODO: refactor to return a sequence of ints + # noinspection PyPep8 + octs2ints = lambda s: [oct2int(x) for x in s] + # noinspection PyPep8 + str2octs = lambda x: x + # noinspection PyPep8 + octs2str = lambda x: x + # noinspection PyPep8 + isOctetsType = lambda s: isinstance(s, str) + # noinspection PyPep8 + isStringType = lambda s: isinstance(s, (str, unicode)) + # noinspection PyPep8 + ensureString = str +else: + ints2octs = bytes + # noinspection PyPep8 + int2oct = lambda x: ints2octs((x,)) + null = ints2octs() + # noinspection PyPep8 + oct2int = lambda x: x + # noinspection PyPep8 + octs2ints = lambda x: x + # noinspection PyPep8 + str2octs = lambda x: x.encode('iso-8859-1') + # noinspection PyPep8 + octs2str = lambda x: x.decode('iso-8859-1') + # noinspection PyPep8 + isOctetsType = lambda s: isinstance(s, bytes) + # noinspection PyPep8 + isStringType = lambda s: isinstance(s, str) + # noinspection PyPep8 + ensureString = bytes diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/string.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/string.py new file mode 100644 index 0000000..b9bc8c3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/compat/string.py @@ -0,0 +1,26 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from sys import version_info + +if version_info[:2] <= (2, 5): + + def partition(string, sep): + try: + a, c = string.split(sep, 1) + + except ValueError: + a, b, c = string, '', '' + + else: + b = sep + + return a, b, c + +else: + + def partition(string, sep): + return string.partition(sep) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/debug.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/debug.py new file mode 100644 index 0000000..8707aa8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/debug.py @@ -0,0 +1,157 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import logging +import sys + +from pyasn1 import __version__ +from pyasn1 import error +from pyasn1.compat.octets import octs2ints + +__all__ = ['Debug', 'setLogger', 'hexdump'] + +DEBUG_NONE = 0x0000 +DEBUG_ENCODER = 0x0001 +DEBUG_DECODER = 0x0002 +DEBUG_ALL = 0xffff + +FLAG_MAP = { + 'none': DEBUG_NONE, + 'encoder': DEBUG_ENCODER, + 'decoder': DEBUG_DECODER, + 'all': DEBUG_ALL +} + +LOGGEE_MAP = {} + + +class Printer(object): + # noinspection PyShadowingNames + def __init__(self, logger=None, handler=None, formatter=None): + if logger is None: + logger = logging.getLogger('pyasn1') + + logger.setLevel(logging.DEBUG) + + if handler is None: + handler = logging.StreamHandler() + + if formatter is None: + formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s') + + handler.setFormatter(formatter) + handler.setLevel(logging.DEBUG) + logger.addHandler(handler) + + self.__logger = logger + + def __call__(self, msg): + self.__logger.debug(msg) + + def __str__(self): + return '<python logging>' + + +if hasattr(logging, 'NullHandler'): + NullHandler = logging.NullHandler + +else: + # Python 2.6 and older + class NullHandler(logging.Handler): + def emit(self, record): + pass + + +class Debug(object): + defaultPrinter = Printer() + + def __init__(self, *flags, **options): + self._flags = DEBUG_NONE + + if 'loggerName' in options: + # route our logs to parent logger + self._printer = Printer( + logger=logging.getLogger(options['loggerName']), + handler=NullHandler() + ) + + elif 'printer' in options: + self._printer = options.get('printer') + + else: + self._printer = self.defaultPrinter + + self._printer('running pyasn1 %s, debug flags %s' % (__version__, ', '.join(flags))) + + for flag in flags: + inverse = flag and flag[0] in ('!', '~') + if inverse: + flag = flag[1:] + try: + if inverse: + self._flags &= ~FLAG_MAP[flag] + else: + self._flags |= FLAG_MAP[flag] + except KeyError: + raise error.PyAsn1Error('bad debug flag %s' % flag) + + self._printer("debug category '%s' %s" % (flag, inverse and 'disabled' or 'enabled')) + + def __str__(self): + return 'logger %s, flags %x' % (self._printer, self._flags) + + def __call__(self, msg): + self._printer(msg) + + def __and__(self, flag): + return self._flags & flag + + def __rand__(self, flag): + return flag & self._flags + +_LOG = DEBUG_NONE + + +def setLogger(userLogger): + global _LOG + + if userLogger: + _LOG = userLogger + else: + _LOG = DEBUG_NONE + + # Update registered logging clients + for module, (name, flags) in LOGGEE_MAP.items(): + setattr(module, name, _LOG & flags and _LOG or DEBUG_NONE) + + +def registerLoggee(module, name='LOG', flags=DEBUG_NONE): + LOGGEE_MAP[sys.modules[module]] = name, flags + setLogger(_LOG) + return _LOG + + +def hexdump(octets): + return ' '.join( + ['%s%.2X' % (n % 16 == 0 and ('\n%.5d: ' % n) or '', x) + for n, x in zip(range(len(octets)), octs2ints(octets))] + ) + + +class Scope(object): + def __init__(self): + self._list = [] + + def __str__(self): return '.'.join(self._list) + + def push(self, token): + self._list.append(token) + + def pop(self): + return self._list.pop() + + +scope = Scope() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/error.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/error.py new file mode 100644 index 0000000..4f48db2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/error.py @@ -0,0 +1,75 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# + + +class PyAsn1Error(Exception): + """Base pyasn1 exception + + `PyAsn1Error` is the base exception class (based on + :class:`Exception`) that represents all possible ASN.1 related + errors. + """ + + +class ValueConstraintError(PyAsn1Error): + """ASN.1 type constraints violation exception + + The `ValueConstraintError` exception indicates an ASN.1 value + constraint violation. + + It might happen on value object instantiation (for scalar types) or on + serialization (for constructed types). + """ + + +class SubstrateUnderrunError(PyAsn1Error): + """ASN.1 data structure deserialization error + + The `SubstrateUnderrunError` exception indicates insufficient serialised + data on input of a de-serialization codec. + """ + + +class PyAsn1UnicodeError(PyAsn1Error, UnicodeError): + """Unicode text processing error + + The `PyAsn1UnicodeError` exception is a base class for errors relating to + unicode text de/serialization. + + Apart from inheriting from :class:`PyAsn1Error`, it also inherits from + :class:`UnicodeError` to help the caller catching unicode-related errors. + """ + def __init__(self, message, unicode_error=None): + if isinstance(unicode_error, UnicodeError): + UnicodeError.__init__(self, *unicode_error.args) + PyAsn1Error.__init__(self, message) + + +class PyAsn1UnicodeDecodeError(PyAsn1UnicodeError, UnicodeDecodeError): + """Unicode text decoding error + + The `PyAsn1UnicodeDecodeError` exception represents a failure to + deserialize unicode text. + + Apart from inheriting from :class:`PyAsn1UnicodeError`, it also inherits + from :class:`UnicodeDecodeError` to help the caller catching unicode-related + errors. + """ + + +class PyAsn1UnicodeEncodeError(PyAsn1UnicodeError, UnicodeEncodeError): + """Unicode text encoding error + + The `PyAsn1UnicodeEncodeError` exception represents a failure to + serialize unicode text. + + Apart from inheriting from :class:`PyAsn1UnicodeError`, it also inherits + from :class:`UnicodeEncodeError` to help the caller catching + unicode-related errors. + """ + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__init__.py new file mode 100644 index 0000000..8c3066b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__init__.py @@ -0,0 +1 @@ +# This file is necessary to make this directory a package. diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dd823747086ba6e6b243f738ed8da555ae821c9 GIT binary patch literal 139 zcmWgV<>k7%G&R+lfq~&M5W@i@kmUfx#VkM~g@GYhlhJP_LlH<ALHx4NFUc*?FUTy= z&CDw<NzBR7O-e~Etu(1H(l4k?EY358Q6-fHsrvEpnR%Hd@$q^EmA5!-a`RJ4b5iX< JCKdxR0|3D>A<O^( literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/base.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/base.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5104ace91184a31faa90c02b43fc763dd6d3730c GIT binary patch literal 23507 zcmeHPU5p&rRle2T(>*^uGxpdX+iS;L>s@Evv-UWfY}nv9&U)>2;=qnK851X+wR(EG zYCL84bhmHS*q&xL39<8w0ttlhr$j;s6okYhAS5CoAtBxX5u}vF1MtGWAYOPNJcRE% zxBj}P=EvD6D9CO1om*A+|DJR1Ip;go2PY@TzxM~OtFJ5dZz}UCA^#G-{{J9x@ZVBx zrRpYMP;E=C6;!>TEIuo$c2TXBRJ~-bOR7Dh*2=10HrFF^T~YOlxh~7~sH%_Rx}uy> z<%}t3T-`(yW9mcBgu>m2Xt<)>arL06>JzwIWkKE@Rqlk`ttz*w>XUdjshlZ!HWk-E zW=cK4kf-r@njNs}7;CV>J<8pq>U;5Q4}0db@%Y({a%WV1ALqPS+xr$4KrPg)aKzQR ztC6X+n(emNxryv}tK0Dd-Sj#Eu8KjEH_Q05*6f9&7yQoiR|0p<<gRV>+;D2qTkEx5 zK9TEv7o~yqR^U4E%@%u%KP6;d!q-26#Kn9pZU<K0EpmWPfy@8UQV%RHzf;1HM|1^c z-?EUj3P||j-wAv#;_JT;$;LhvC{?;;sW&Y3VxeKF>zyO26cp6$ai!m-EX%?J6v2~E zb}aP?WKnprW-Zi;(m}o22r#9K-Stl3>Tv2p5NL0CJ#b%<bt;6#R@)E9yiQBIYi=j_ zBc-R&@ef`&6Rh>l^t|3_4{L{|JiY9=>l-iJfA^W*MiUDY|6%KAmYcpi-`fbsZn^<i z?25CWQy5303Po$5HEB&*{h4^F=aXU!wUKbN(dabS+(siDZ#34r&U%~qYNK&yz1fbQ zOtjif-(Pcs)vlxWqE#7XCfUP#T+w~_`rMDIRkZRqX&Q^3-6ZT#y{O!hx-}xiSXORD z-5QlVNFFRS&i%u-fdWD0&WLi#k_WX5XYl?cY1yy{F1gdwatGzBEX+F~Xq1WhfOqyP z(mnoz!uP6&=xZjvgUmj;vroDE6;{+a5VvzcIkU<+sGLKjsygzAmGguQ2{(@@=cwcl zDd!!^IVO1&cv3mG<eyN^Q_49mc@!>yV4l{aShMDNEX~W<Ok395Ug>HZdvC5>-_~wV zyFSPSjAdU~T$q2}=KlNh<Ks3yS2}jE>e}nRtL;|TaZlNANTD~P<~-l-boClq++ZQc z?skx4CxI)>Dy^7yyUVxSR^Zz!y1Qm~(X5VpS?C6?6g-WOWG-`<zTNI(RQPKeKxg3l zma99ibINYo_nI4a(8ayAUQ@f-(MuaBj;9!veU@Z)cFFS>L6xND>t3+BWH&ob=Fxi3 z)qHk!Wyv;ViQ#b#7FuL!ev0^(@clV_{g;t|&fWljB2$ozrM!ZA6ZwL=g;d0Y#S%ri zE|6p_JjAUAq=v#a6&FNsExJKC;jb@q@fUk;3({m39q5Bd!t#30X$CI&%JEtOcxkMm z-KKLDi(M;*CEsnYgyq}!n);?6j>b=hc!{;Wj)&Us;qVP7k6F{j$-<sOe{U=W=i^c> z&Xynk<@X}KJ`>Cf6F-bO-!3ZsZeE*JxLxLDU~#fwFWjHSgg=MJW_je+Ihl58L333@ ztI>ao13oQ;Ba#U_Y&T<}W*<M{AFq}46DX`HO~Z-THaJ$1cKR^xKrSBPgAyf6IC8hy zUU!G*KGA6SZopO>jSr%*Uq+&=C#`*j{{GC=lS0X!bCmqb?73)Wst>q#kjYj!0R{?! zjn}jsMlzJ)-Ye*xJ->qLz8no!e^0hoKFsft0?_nmx|4;dS$W;)ccAQtlP<D*8k58> z`slxhyccsh$<YQQxp&q*EG*;%d1?+PEeLi_*n=#B0g+ns#}!VyD=Xl9@2-1I>iv8& z#!~-KvJ69o28LQh4cP$pVopRZicpm&T!z)@-~E^ytm}^5w9ksLJG=C0bF$5I8uLay zn8z4iZT6OIBaUon484r(Yu*&8F(|R_L0otpoBD_AMiq^0kjWP{si|HzEpN9HR8i3R z$1)2roh*QPcCAGT!w>(GSY+bokinF}QnyD{@BQScDs&S=8n_D?bi1Iscu-VTJ{Prt z4^V^0fz|vV8hhn_bIt3xgZoQyjSX(Ly<o%UT#a<j2-N5_;B3vxV647<@@#M8EROfh z>%3GG;hJh`enKi+R7#7oE~L3@M(Wu2R$VT=)*INSq?zt|5Dx`=%Y%W3faiBRnX$gM z0qp{nscG0=2PcjfG$~%R+inIPRKQiQNAg~{dW}bm?>Vk^ooowD4WR-(E1dw(DDz1N z!^7+>=+2OvoS+ezBxSgE7o&kd{W7D-J$p0V8-m`{chczDgwmJ0-S$#)pPiirfuCKv zrq|si+gq{c<iwrhY_rULDyPonX4^+4sc_GO9+;G=71C1)LRrM_h?EP*)|x?U6)fO~ zdn9`?QPKTjc{nwA5`O};Z3OcEs&&}vA52(cuv|W8{0un*+|YY(#0^Hb217isR2MhN z5at<9WjTT%IPi=-(cX?HqT_gwS|0Pqqw@#JQK)1WJi@X+c0OUF+wqD#-;!UNc1#J~ zm2H?OZDbn;DhUJCr$O1GaLR#rb;am;lkr`Mw5ux-gXxnXa9v|E$Are5NyI`rh07kk z5d&4M16F@F%Rs4K+d?t<@Kh<{`yqVAz`cKrymRTsta?)nQyj6k$7p>)&s)4xQP;(y zC@x&S28E~6>3*C#R;>`0McMN8aWphEFj%1ef+_eVc0*%C6(+5!H5%ECRJP}nLZS{1 z*v*O7HHn%S(E~+QQnW`=y!OFtxI(L*R<7$r=5HjF{8ktG{LorGgNA+;-&hArHNT7w zH=uYVW7wpJZKLmq%`6-HjZ9}^E6bc|E6d|ucJ)rQvW03jgSK87)UJLr)8~<d5H^?F zW#`Xs-FY-mC^Wy5>2r9Vc)ZK5XzOe-&nb+5F}04qmFX`%Ee6Z%uG6sM`G%Tvb?R_* zwP~LJUZ%^`Sc;$4j_Mf{(DYU4{YXOS{7$#kXy_4KiEapu*_@tK?81YY^YIEjIX+e7 zZbu|Ry-bbuildLQy{DO+V5QNXCRqm?qU&oChUNz8=a^6wgjFaPf!B&0D`$A0WDmOx z2`xYU0+aVLd67xVBa#!LLT05k;j@S8c)3_DRg2|9wOTD#i!-H}GX5RHzsmGTwJ85e ziEu#;bpYR&@b#(cyO_W5Exc!tC&n=YH^u|x;dhy(zcTWCpd@5Y;`xAsGVy%CZ8M7_ z`&d|sq)M|7=DY~YCV;tU`%n(sZUAjBu^}O>qoPIwjP$B&@Mp|L59Vy+`f%H^Igt26 zd}y!(Z5hSaZ>_p(O;Ly<0|M@eZm-v+^8==lDJ5btF%+aUZT0A>Y2&mgp>&yGM~yZL zHMe6gyEbk>CtnkHim4+_n0isOvG3%1Q+Hy;IIEXl=xn4d)1G$MdXSQE(1=H8u482L zTs-l69=t;EsKQ+WZC3i5%UIfTP{><uj}&UuLAW3qe!Cm^@J8%uG{Ad_&5k>;x1&4Y z0Mak-IMljn>awmV<#<R67iMwWcmS^Hxc88Ovw~ZJRJaMgLo9bxCmi+GOnv$neXs9! zS5O6cDDUen`Wh#byn7#)Q!*U1Ob-dJr{$X7kmv^5$9Ty)k*5-lfaof9|B!EK=@s$y zzkmb>8`Mk(hvlf!pCNJMoP4Nwh<;J26<mss5k=t>fr~dNs-UD+O6n45A8w-ib1E32 z@`}q#H;$?|@x07dp|iqtLy8A*n_G8YRo4UYVB#U}A#KFn!||LBF+SPFXUZcg8i$Mw z<1oiNy-qD2ZTxUH{62}VPZ1o5>4?dom&kvEDK6Fu3;i<}5;~$^CPQE#t1N>=R0Vs1 zBhogK#7!e!s>1Di5cN;-VIp?IQm?&!^Lw}#AJFp=pTa36WHEoP-GvqIpQpe1H55*7 zu&OkLKBd{$;<n>{DA~eFRPi6#3pZ3*GlhOED7NfpV6`f!B@5g^=BC)?Hykc4Ru0>S z{ke4GqmdgBYe);cq9FRQ(R7T-4n~)tkN6Ul0dF<-pF0nd5UMc6zFt&!X4RcCO_s3G zXw)iU(eX4KhPS=mtKvfU!*S574t&}t;i%hjB&WHv;V3;9&E>W$(<cwYYgm|n7m$;U zo~#zuh+0;<7e5$3*Y^B?X7%~+<B4BIG6o0y9&1|u^`G8yZ_=8zF|c|pki#OJU||t% zvarOq!xEjDxC_^31qsI$mW@=^7ttLQU>Vd$k*|+-djcx>Dbd7(mLrQ5{sCW~R|-R{ zj!av#m3`I|1#Iy2&|n7?O|B8E`(jFB^@XkJ%zToJ3r@h6M4SLFh7Cz~Z*ohRqqqQ9 z7A7D_jD3P`@xYGE`$uP+lD>xVXs&sNfeJ>qEpeeT$F@wLPR)Pk94MeTefV^tAd6}P zs!oJ)Ldax)@}^9D3K>pQCJuU?6>gt6hk2O&I1jG6fI_0>VBKl?4-erI?)?Y8G4t+8 zyEme|wqJjM_0BWlfQ@GJ5_8hHXge?SlB3dWP{hBc<5XW}@*yT4W^#qeN0`tZuc>M1 zSCQ1lhg305+)X!`$f~~1oOB>#kY4hXpmQkq9en*4kW?qjAbzYE9QgPb|20=bcgCnH z%~s2rEwu1WK1JkS!q<Ni%b%+kK_dce1^U9#@em3UR3luD2(Say2$urU0>X6!zI_PR z5D*vWE%U&&0AWo^9yk@SscFgMrop37MsTfLK&WQm#NVfGTS|W`MWX;|bx>N+D7FYZ z3#ij!X$251@L7OOM|cTASKlwgJxW-L!#yCE$B0bv5{=kIrq~W(tmDdgTJmTRSlBbl zIU&WM@Zs{E%6V2U(f&z@x|$xtQZ@e)OO*p)`2y$~%?|#*L~qOZa_Jb1ls<DdIgmPd zzV7*}s6rLnx0it-t-2oIre#kYpitsgyKN{+bn2zb7One5$k8UCEvZN+<?T-Q9{kO| zJ!ggk_gZugM*Tj<&ulx9wG>SR!v#M3HZnLb>8um~-B-axkf{X1p-i0=Sybeq+VLb` zijG#?+1M+0pg9?U?Rw`j5cIOTRS^*VYXs4QQFUvKE`!(62>zGUn<x*-jsDOSIv!WI zCe%tH7VHAHqd`1sfcztcXA}~!89<)bCIwD42H9zhJ*+zJN^`v(h=`?SMil6ZvENdm zjpJ<tm>iU6oP$v6Mb6Pw49g9%5^7~5OpoK9K8mDXcJE&Uh1DzWeQCR1!j0u&X-ipI z25b2Hkx@97t5&rz4H>n!um?V%rwaXpgE0>{1q}R`904U%9Kn~e(ElzHE>3&|FjG(% z8)Q)r3|*A9!s_3DQ3?UkEOC7=-FT;ZT|iGPGZq+@C05bF8sm&Km0m=xJMUH3qbC1U z>I*P$6kZgAD1nf>T~hixvP&3CS$)0$`BYH{xowbZN^TrvHz+;Ia<gn22t97#$eLK_ zSFvCCA1M)B)39vJrherVpPcaDvT^q<9-95){QP`>>XhAUZnV2i$Ntm_|3<%rQ}4X@ zpFjNJ4{MclyEJtJvAV+%54MyqR&`heBo;furxF<?)||$GRi0-|&b0&FIx6T2TXwu~ z)GAwt3S-#B8SA(;mA8533{9A+fU5k;=23UY>S7tlJdmXp_sr}iZxR41EWmlEJ(R>* zF6Z}2<cG)#RM~LvG#V#3JT|Ya{(((i=fp}v-OTcpAYjC41>c3^m&+_qPi*iEl7 zGP|2z+knHL+qPGh*iEm3C+u>r42PNDzSmvOm2pSAUE!OU$@AOx$`ZSo>&T<@ikZBy zeXl4X-ru)KaEWw6ofLSdxn<}I1WW1$jgzR03)e2k^p&fX((lmecKWXFHX85CjN^$- zRGk$2aSs8$48n7b#``n<Z<fxc%s}S}gOjgtT5<_uxO)Nq_Y(Y%tA@_=XOFH~q|sm) zP|VPqyEbLE?%FIpY$2cmgw6UmI<9nJzR~#>tm1@>F-0SJQ*|tk-I22{gKS;_A{lvJ z1(P&rWdxi+^P-muQ03<4Zms))c&Dh4WnB(CHg2F$wtb3fTGMeny0hrD^AMJlZ7b<u z1@6Ul1W2747!KWZ@IrLytCOgwws+gLn|6dZFRy#;08w_)=#$1yy7M>Z6T}vF@Y1Q| z3Z`-9iiYu$?FOy+T4q{r9}SMy7jSU?!VWA#3j1=Yhv4MR^|R||(0}91lm&u{+>9c{ z>|s(!qQBS;U6{#&U4sTL;U{#(uJyVaxOre3Enb}E*nr@k3u1w%a&h5#JMxe+uuFQ0 zrWpltv3)c-RM^Y}5d`Q&f{+kL00+9)BW=g(eAII6vrR^r@!gu;g;EGD3sGwl0w?AM zNXNCYzX&!3DcNvK^9BOCnzecR)ozBIyUTaI?z&H!0_m>|>;{2*P%4ZU2dyEJ0pS|H zC>n@daNL%UKnbs%Y0T~5K1Ol|4<(b-f*06q7D65ZU}v$BG_*bgD=5n|Hy1Mv1ODdb zpg0XI)mk&_bWXz-yw2Tj`z}{SyEoTqLPeYsuf172#BT(v04}`NDT(LME_l@^i-Hrt z2pk_j&|j#=XsY2`_#&vST}VXU(f;g^w2wqja@bK7F5)Yu2@_~dkhj#Po}?xVRShz5 z(a2xuoXm(P=mC7HqW3}@rq_;E44#Q?0tFRT4dvw$1bG5gAY#T_@vsSZ0s3%u8B{rT z@#_Kl&By@K?@|kKk?zS_9H(eETXfBXK1gVYSHVsP2%@>UPGl6EmxO#IODLXnJ80e} zp~W~y;2C-{o_@3jxsHuaTS}@&G`x8rq;CNUn(fS>ucIXwvrSu)5FdZN*K1=TC|unQ zxh28^WRBQnvR@N)(A&s%yTn+>C61ir1f#3vI-qoP%l5edSQ_CVfn$vCkrTtRN!84- zwiY~>)^V(Lr8#eHZ9Smx)b7Yp5cBWgfrk@i1@bMOU@~U93DSw82prkNr=?&oI7`f| z9g&{VMENLb3q@dMBE${E!<iv&GQ$;RVF<$-1n<HU7f&BTR_vHKp5Qod9A$wj4MGYM zs7ITEbVh{A5QeUNx(C&sDr}TeVGKs*B!VV~7)lB!>@<q<v@C_4{vMe}WGAo|yk0Qv z#19VR9X31ij7eA)-WyT3;3$Uy3RZ-5SXAf0e5@no9>5+22LfC)b-o$bsqki6=RVvF zs3vjYmu@^Ec5GR_iBe$cvKl%3Mn%0?Ja^~!jqNISX3W$h&A$Z>kTA86m|a;(!$ObB z(s6*vKww&YxEWz>yiU;6NN26Cj*CjfUP2<<HWW!+X=y$>19-u+WeqP=0HMU`f>>~h zr=&@E$fzG7<nN?kGeLhMJ~oH_F}8Bi4Wj5jbAIS%=ca)ZDY_YCXWrY0!UywON(;?z z0g^9eP6J3pV3z3`K`01D?m-NY`NU6XLPRo>FpV(w=WW{ryK{hO4T8c%8vNuWEY8v4 zFvD2H=8R<vA<Mu`3cv)YjYU;@5;(5k0z?7vvFx_H_eAhQr1$}fCi@*rt5lfnAfMUK zfLu<RdVBJjd$H1OW1y7v=`0|bvs;v$6@~_44q$|6W>&GhCcU3c_xmbV4C=_{^^dUh z<WDju(i7A}hVUSy3=yz-Bn)ODGYm##UWsag%@A~q^d>^0W84%qVx?T>$7Al<RD~jK z?$8-IPj<8;FFlYHu(j||g6xygvmKs5M)P_$Hha)Jm^*Vey7zz7S-uk0{ArkFL@RvZ zV(Y!!g*X~m-V07fzfPoGWH4cGp`gT^X}IQDF)!WDKr7IMgqxEs%-gnfXjvV8M>}z# zBT_>Q(Q;fdqvWfiDd+tE(w@SJ3|}t*c87X2kzoR$iZnM;?MnY5ixhj^o+&&D7D^dB z<YmeUdX052AgPTGx%)ND1*JdD<TFUZBIF!Ua8aU%owJpQUK#o1Q-f1y5~Zv#1LyH< zlpbbK!?4X0RZf&NI+xIp@gUOxf|5pWqVyX3h(%dU(NV#gS5Wr590FT_gLv4V6hk2c zJ+bUXeC5R>y0TI~mZfjt!8SdHW2VWg>%m`T`aLwHgC>RYJLcGFo0&B2zM#K=C&r5w zdB&gTjiFgTgL{9S>3!INXnL2|fCl=fSt%1|Yz=hU>=0l>5`hx5olw*1^Msm;LQyI9 z5U)(msKV(?x7TpA{Y_?s$8y(4M#!QIwIjJmxzIVlX=T8!OU(6{++m`b_)M^gO0P3P z3=E8k$ecAe*FE09&!o@fEE9oH-em6cOh`s%>AAG}i%ilrmz<CrQQ-f=*Jt=MaQH&G zFg;z}69pbh_~Aah#>VTJW79{bFEKY=Y@u}W;U>I<uYU#WgSia_B*ISMTfBHd8SuLR zi4RZ)06T6P>>U_;g1rNaO0aie?6@@8J77cnH`u$p5gK9d0O1qtT~K$v1&a1@GkygW zC_7$$z6Ef77MRyT!Q}ru1HA7SOg;wQ39|!QH>kV8;eoCj)E(^tT~APVK<f$Wj_S_{ z<c>1H^#pGR(*6)YJ({X1XHJHN7fhd1&MC>G&C|-6mpooJJ)@j=NgnMJ+<9J)V^N!b zhedrk=N(f~_T?SxpDa#)Z582|_Hj4@2=^b)1?<hyDT8~A+ULCWdU-HHu!MaUYyQK? zBvK4~Lvfb8_9|X6NcOLqNJH_E89{HE@HUi&#Z9c=AxwvtUnd!229>BIubGFV4Cj;= zV9WZ;=t_SD3Bozo;NMw{9vPPgeGDR@qQF9NX_&a^REmfIAyod~l#3)*MGr=4x&R-> zQDa>W{0KlkN>1@1v%iiECUh%V0~{mq8^3xneq>g~_$~}6{y|O~j>68k_!bK4MdLL@ zTUf($_`}7J$w~k?=JZ)~mAPTwwlb6Cnn<yXyp);#G9FZL(wZQ+!U1?}_#G>b7sd<y zr*h|;UD*Ty;&zYVdl6s%50NBWZUQ#82o3mvkV6_8aB3hl0I{z0;OrP6@NH=Y;djVj zedOJI#C9MQ0CE?ClO$J`7+Sb;215YG^FjbLwo4iO{{tuVCcwV{Z!@SvKGae;_eFd~ z!@|*q?rzKsgm-?uAi<bMQL@4kp?MtApG2k5x<9-rpTg~@xG8LWO!eQDyA4sea~jZ^ zMp2rO1Za*I(11Cz<tU|-&uErBviYMJ5hwX!=~mZ^0~2(Y<-l)BA7?Ve9hY!#mcwII zibNw6k3y9^B&y_*ExBa7a0I@UO-`3^gx(?9Fmowyq7o(l6%>i}nw&TUQ8-S-i>9pp z6Zwnw$dL#;^-CS+<j(y*axB75{Zg%ZZs&d<IT~T7eyPdL@1oyFjYrt2Un-B!@7(Vr zM<ndjFZI<IcF}Jflc4XSLLwe0CQ#Xk#Ytpn$jAW*NhFaNz~qVJ8~V=0<TX{}_hp9g zWIk!<ha>FJyZ#y)->!42<nPaPzQq~1T`U4)F)(i&1UM8h@A#!WydN-Yg3%@Tnf7$_ zY91J!<JLBkEdV?2+xcW%h5oU;MM(wRz>iaKSLC3g<c6F}jac)`5cSI1#zjJA;grA> zALrYPm)lMAzJQU3JU+t%c&h}(F2-_H3i>Z6!?OCdykX_mN@#}1Xuke{lRr`(WHoW7 zK1k3+339{Y3YrM~15hHK3C2i00~G*p7|0Q^$jCu|XpW(u1d-Sc%qYLelJWY{<GLBt zdyFprDCpvAUElYJ8ww60cz)z0Co0hqJQM&Of#3+c1oEFQKEe?aH=TqfByMgx>|*EK z@CN>PTz~YDpOIldqPuT*P${Mk$az<IDS}3J2badUXo`pGuY>U}BfR#r_-pI}y6jRs zRR0<-@jE*b3we}}Si|_^#7i-xDDmDalm%1BsDm>CgiaUAeAVJ`o?I}PXslY&jX_x; zcEmp;Lnao+C)dMdFh84<fSw`&AQNC{I{-RiJ{TCZBuexzNOjS)BN!AVN5qm~9r!9t z9Rq`!I$w_K$V~_r*d(k&7!;kCDSifFP>d=AgMQP%pnykV!ePu3f~&tTts*a%7^j8Y zVy)7gC}*V6&iLpsDT^$Me3p-qxHy&rsLnQ#5<hiFT;}X~jKrB=Uwe$iZ3%R?lIVdg z0|SyXlR)SH84{O_;_-Q$EQL9b1?e*Qn&4fvvCPr@S)7Un`}ig1KF4H@$pt2IT#sdr zYaF1_nVrCA8b_GY51Hg0;h)EYRUY9y?$z8hUJV_F&7uSSNZx^-hoGS~V|=_#vnYDG zv*<a)4y14vZ*L|x$;%s1EG2OHJDdo+hkIl$Z@Br@w)lauw>kXCJ^AYxjd+>rdjSV| zD;s89{GrxO0cNv^Qp}mwAMZ4+{A!841+7C|cvtb){|J)%&xn~Wwkm((=5_JJ8f^+B z1k>u=ok?~5{!!{Rmu~Er*fD56BkC|8LqWPTFPe`S_*OXPb`V&JpKNgBcefTeYm$^s z<{w(Oha7F;WOm^GpKzMvsH5<cS5x>o)fp?_K|4?@nI*MKelOxH@39Zqy}6Eua6g*5 zWL{cJ*4_WJ%yOU1qoTY@`NKdwT%^>Rl@bSjzP%sr$r2~g$iK*p<C(m13|AN!11g)P z*qe+2d-ov58RQii;;&nbX37w23^05*GnV6dV;L-7dnyk{t?xzb2jcj%93Y4Wy%hRq znS6x_(Fsk*y}TE;3#3(liG@>uRj^h1Peei*xko{#zro};nEV!#-)6#J>e0W;B(-iN zC-?#B@n1kz@hi_IfUU)9p*mHa#y^2rO=<ww8T=|t_37$Mgj=g)$d~YnH^Ja~+58fo zxP9uA(XTMJ;8$q|@{<JhiOerEYFQE5M)E_7{1Fg@9pj~-7H^TN<lW19mA_`hA9g0z zC@)u=m<(E0_1O!{jJ0V6Dd^3j0#MeE#1DryQ%dA4L^yiR{A}@g_U_wAs(7t3`iJ-Q X#)`A!vtKF~XFr16Kb2=^|Mh<XfBpH2 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/char.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/char.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e84bc575ac7782823667e7c444bb23b1fc68cb42 GIT binary patch literal 9180 zcmc&(&2!tv6<>fKA}LbThb`HO6C+L?o2^C1pLIMQ*N&XHYFgP7DoM*34+H@#2{Z{X z3otP?N)L6?nNBb1bb9L{mmYHJt;hZcy|vRR4!z{WOAkHf)Zg0$AX3qX)7BCtEEf;E z@4bEddmmWNRVt;w{ekn(E->~L8~Rkxzk@6Ilg5~Xe~q;nYpTA^+8XQVtf@1No@H1& z!#Y{k%&PmWyw9;_4);0c<e4+ZoC0%-%qcNvoH=FYRG2ftoGNoBnKQ-KE3BDkJjYsN ztT`q-1=cLE`_43TX4t2YG9#%)_B6wqB|JFBz?&ZA7%xfcIH<=-98tkdQOlstk_JQt zYelVqI!8(owZM2qa+m=11nEiCVluW0>Pb?asHKED3F-^98lsLT)G1J3qy-YSoKUAh zJw<CKYK8G>DQyPSm&go6ok+$W1NCLH3{k5I^*E@f$yh|4OsKP<8e~7BP9;>VOJj}N zD+AilrJ5GyxDdWTClgxh_{#P?_oJw?)a!8J+Ko`S-g;Dhh_BFEZS$B=S>|mX@+a|a zaryeCxI6K_>u`VQ(c;}}$)x+j>TaY=EAP93yUnt^*m!XL>h*Li_qedy@on`zXvIa4 z5{hsB<YD}*^xpE@H&oxIRVAMcI(Kjde@DZCP>s+EV8Q~;4C7hW0swV(5+Hr7G0|d9 zHpUI`rjQBS0dfkT)CW)#lzs{>3bYcgbX#KHn-aGYe8fZom?i?)K&u2#%w$F)A!P!{ zVzVU^0_rSnTNAzjb+KnB<Rb_I)?Sd0;2<wzBTq$hcUOZ@Sa!IuVbK>C$`;m_ImQ+Q zw?ZBmTX!2v^-EhuU~lk_W%$DQ$ZGev;jgy19o9=F1D|A&-L`_ja06r23b<qVo^ex> zZm#^i+qVMmQa$W<d7Ylt8*ZoD=669{25senWaNfH%sDVD!40?5=}Gh$mgg8w&we~l z9E^wka0A>gr~I*y6;dvKa7A)Ugs=9ol9jsg!3Ot?9%<%!hK~h@^O(o2j$!*AfEQj! zS0bfgF#vNQd7atfp6xrp^wt?8>Bh@{hxb4Bg=5?m>uT`)&_~XeHoKW>3r_(rEIOr- z{@Zs-VOmdOS!Hg?iwvHuEMXKI%{ZSJrbd&KQPMccqboIKYGPxxvFV-_!b95q-G^Tu z;S?*j%`4SN@UGwi_d-}`)VBVb5g;O1ZI>(`YivL#j7+DW_u%=)N@Ca*qYFrO5GaI{ zpO_&Am=}bWXY+bGeR0iLkv3i-^nsVLjx~7~QrJqg8Xvpuwz0|$TY}q(w-4c~!9(m$ zx1U&S1g>~qUzTH5Qh^T?!;w{czBljiHLKSS4e2!oW}Xjf%146UDuJre<@Vm9fI}F@ zLddKyq}^Z<;1mJe&Go%+t3oW65FT@eMs;I|d%7lsNq5b)0SCC&+7S4pGx)aM6Y$Dj z=yx#0w%ULU2JS$nEB7XJC70O1$*zv9n?RY0Mvx|lfR+xojm3LL=qo4V7eSyW$<CyR zPcSF}nleg;5%<&^uGEZhg9B3iwr@Gc#}oz<L@D(NH53?9K6?a+ctP)4!1A!G%XtZC zWL~VlPhoP~%x_V$ykLxudDy4;Cm*GfA9zE1WqjoNZM7lTk5wq|dM=FHb~m|D@E541 z*g!{PQ;$A$GmdKkSFnnvKgYHhYvEs$9i2TzF8{#0$Fd<(Sc!>8Ow+VbCbp-@`Wid= ziN?Y_RZd7GYBIGtThrO>md2jy>=zpQnWwRzIt=L~vos*_o3AZc-nlT|yx7Z)b7zBd zaK3OO-r%!Atq|o+>9J8>!h=VJ1SZjR42QQU;&N%8C=>Jp40&Rkt_N(=5~CB!e%~Bj z)1z#_+iOt<6TW2PWsLs%>cz0rz1VfT^Ae-&_WY{Dd;P0VE?-p1DfuF}U$l`E>)n1d zW}3i~Y2E~jU;+)(GWwie(I&OLmeDp(?~z37@w{|X$U3C8+!U&WLniGCQ&L@}EkWtA z7~SGHp4T*S3SUxr)tts{G;W&lDARl!gn*bbZS&Q=6-me2ax8{Zg;T~QmH8Js{V$|G z*mJqHVwPc#8>AvgfQ!z=HR`uAQt7NzI)0oZpa2#$s3RW(G#HAK2Q^5BiVn=Yhh?h& zgl&<vP&Q-I?<D7O2IP(M2U?YRKJe}Xs$~{dNDu*bAOSnUT2-2c`s?H;ItwRRYl<o{ zOe3^r6<VcgBWTSpMWgPLg$)|G0y6o!+?hwyjC?>U55<3@vk&vEA$Nj`UVB4e$MpK^ zk@jTA9(`T9g=81ney4l;Au%Ph7un|3y|xIcGYtESUj0_vM_>(ZqmwWY$1pi@t2h_} zk(6e4ajWU5gxWaHkKz?fh3AAK%Bz`TjwrdXhtey`l8mU32#>NY-}MApA{u`{)loy$ z@C7T7w?XQd_hd{~jye8g-+$ce${TSKlf?_v(2{pJ=+LZMMq)e4$q*o3q8a3*+c+2V zxLw2*5FJjZRkbXxN$t4ysy407>J$1*;)KRQhFwmPPkPZMkzYcGHkhS8sEHbAHC?GU z*0mfe`F85|I>tQ0mH6JC@)OIAh$jn6@w9A+hp)g<;3e=qrAq886jklvp#JSqin0`o zISWDJHEMPk`5b5#t^}di_A;au;Jt1YRmg4-g@o@B^C8nAT6{xVR7|<7Br*}WUO7-^ zYJ+Epp;C!`;-@em+DXOhDQ^PB;U~=z?^cO$zoaP_hTsg_k|&E3)QmcvcoDQ1z`HqC zR5VRl#+&8_MkYB;o72*qw&#wdGgCZgz#>f~|HMuI^Z!pGc@!rSBp;Ono^I!(0&C&K z28rV{nK+O{4oDp147npt9RHAsqrzGfGI3C)gTzr~Exd6{S^FlA%+kn?9T<<N#CaG+ zf-=fUvy1N%LGGS(8XS@_8SG@_6&LB2;)}RM&1GtKZ15G(;s7eH((}E-r@+Hq!spD6 z@R@GrfwA!olB{CmZVoQ>{v`<|PD~qNOh}PYZxS6uy)@X-#>(<X1(Abfd>_+)g=;q% z6d$Av3Y35i@s%MjQCga7GzLaRl>i^~!q2za?j4oV(dp`FWob&G4I>1pR#q>-*OscG zHTJm35RGx$0I*fDldL~0sK!(tK21FXO`0eJ+wXF<-8=LjR~pHKw%=k(P(Z`<X&nhu z-@7avnw7@DXNa#+L2x=x<IX-oHY%HDGR!o8Pf967Y<_32U_U%zsaA~&rs?4Tz%-+h zX?A?4*QP%Be%Q0x@e|bMj&EZoIY?9{weaeyUJwkB#2IR+kWd~)&=EJNk(Rziz1!4m zTU7R_&K9%<REA3jDxb-t+9;RHnewq}W;$EWmP^#Dj+Hajq8w{uZ2G|g8oPrlco)s^ z2_nx>Rf;oh>fm4+2g+kqDN~E1VYE0U1Zpx=k>IEsAqgjdG`LLRs)>WV3}BrVBw;{0 zZWemMycO84yHuMHKLADCq2?|%5=U>M7v<F{M^wT0B2M01+YQ@&LD-ElINgY*@L++? z@9;XM4osseNN@WBulwq-PF0V^bsjF`6=~4{Q~ABC{Yb$ta0OIkm9=87sJ*P`Gly)Z zJcJKs&^() J6D=(S2(M%<^~52>M2R7LF{QSTjUc7qKG{3EWTUG^9>7#u^hiPr&t z{>F`KZ_HoX4<G;g!b#+x4_G+Gmpe4(EE*0tCkN}>ZXtbwkS^aL8wlJK&X#J0ozNzE zf}pKHzW=TekH6pwC@}zxhYiCb#11H$9NvDA$iLz`S|F1152#)}EdL{cUmf|f=|y5d zS?Tchn?(Nm$QMrU0s}e#IIR69fg0k<elY*9!VVqL?GkoK-ZO_C;xS3e9Z}e!^U49e z4;~&2N#yJS`;o(#JGh=-byNlS!6`JG#a_5Jf93N0Du2G|k0hQw@^#a@)qu(pweCyT zpZmH=;?*Nx_Y|$0Tyrx=`+ej2?lnnU_~x2xC*+GrGp~M5kVl}+@u45SRZU5;fPPlM z4``;@99#0`FGbBUPj%D@fGpg}PXrZ|LKZtz#0X03f|8t|fG=b?qA(-K@dTkz(3S|& vakm0BD%?_UQ@4p{Z~;wOpTt4xB;FUx+O%Fob#(IAvsL*w7JpY~^Q!kB7;i1o literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/constraint.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/constraint.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e4e9de33c75e318ee5ba2a3ed33d54c4b674ed7 GIT binary patch literal 25455 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/error.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/error.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d8159dc5a1123a6a69f201581f8225a83fdad2b GIT binary patch literal 363 zcmYLD!Ait15S=tDmfD3q2!2C_-J<ACWJScA2!e-RLbN#)(l(|o*t7nM2S3P5uAck> z51xEU+1-$NnarDc^N!~8<m*GJUn2TOY|jkY8qpmCN?b;osAg0!Vz*^PC8u|kIVnbO zoC;KC^pNfSpr1144(`XRt~t4}wzbc`wmA&R8qqBPio787{XD~b<PIOD9@KT)biI{T z(+7pSjJsHfM%GFQmk3d}<)D3@3h^>XJu#nT_n{i#?>z5olbgycD`-irmrtb{#<SPc z+>8?5Hcvkql`C&_Wk$;(ka&L)AZ6i?^+h@jtwN*qWT18nrz{5H;)}`OrFRpA7W^OG CZc+*W literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/namedtype.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/namedtype.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7907ead5c839234d5d56fb4859789c08a68510dd GIT binary patch literal 19908 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/namedval.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/namedval.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19efda913912d16b863e66ded1946442641a8eb0 GIT binary patch literal 5860 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 N?_tFpQiFPr@jpvjx9<P| literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/opentype.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/opentype.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8619d4fb5a10246034411a06034a89ad4be92ba GIT binary patch literal 3478 zcmeHKPj4GV6rZ(S$8nve4IspA5QoI5cGQXkvS`)NI;cW81qX=+iS>GC5^uBK-OkLW zaS3o}zX}IF0w08nuY3zm{NC)J*sUwIXV`XTXJ_7fzxUsh4>vZNfBh~czslI(Y~iV4 zeGfx_f=MuT;;<vez7h_7ytG@=VK1uesKP{r4cpau;~<gI;Vh9pSjwl0)jbUT8z#xv zk(EGPkXR*Nfw{(B;<Lu&6(;b%P7p7!Q)gn0i3WWhVX@9c)2<s#TxFtV*Vx=(;+kDI znb>6Fx?O|d1`}I$-O7}FPdU)S`*V%4`$~F7^1b1pdy5-r&8J?%gGk78DfoECJ$~ke zscbemp2LacpBDCg%H#19=^H+cg$y<KBA!MhLh$22hJwe(;P&H48<qM7+ZM$NBC;-j z80Elv78&oH2Zjflr#kh*aK@EPl+-dJPAFm~(z1^B29NoJ{{F*3{{jE<@rWPCifi8s zJ*7F8qhbG$AMEp2$ZlrL!~VD5_Xqd;D=4fWsB63+lFB+mb3gP_Ep?Y8q5(j{nU#Y* z!A*Q3p_Ss#0yE(~kZRo<{hG`?9o_0$6VoU->+VIfQSPg5=EuT?`L5<7^-nv*0goXf zq7z5(z@wRD|(1imQ*>CB!<{7jyavItB9cxW{uG2eK}h<q8v1`$XCDQ@y{YPdGB z%G{~su~ahhW!D;XIPnlj=|$Sgf_;kni0IUdf+P(oM=k|}RHYF&!Bp~zcNRn^U<$Mq z1i2xS0wB=*^;{WCVu)4l2ui4n!W$RlZLR;a`SdnvWV0$uqDP+crqW22IlfaqHVzTa zdc2p+io8S>j_e5)^1dxlqRC|CIkUuI)2-y#vyA~IZQDWT?q$b79h+^vDz(rOgw3LH zR=R{dO%0Msa7roUZH#n32{f%E`HV0Uq?69mqkryAlTa=jm}$I^QZL#~Uj4o7q}xTx z3)vZmv47g@@x)e9c19Y+d4J}2c#(NKrI|#q9f<9l{O4OeG$<oaq}pj`)kcR4&+Q&R zK&G3aQP6p({YxpOU9N`mX-ZYLjNr%9B#zM94pFOj1_*<om0qSIsPb$l)2h^Hg-Q#w zuzd_0(0QPHY4M%H^h^B+<MONhx^MG#ioRo8YuP<V{0wCtEB(LM^XTnt=UyL5b8x(~ z9Ag`a6)_|KXHOBEw+Iq341Bs$&_nME#(fOk#dP7Y3&vb5aI0YKw87NJEWjr=9Tu(A zezwNxu<Z=mmHDPy)Pn0$TbOSxY~<Ymmz$cF;qkmi6h~|M_8&~uf%?zqyJni~CPC5( z@RN_9%FbBGboSZ#?cMArv3L>RE}2V<ZZexUTsMdU<GNpy2@OolS$A4atMdFtp;ot` z@#*eD54~wvyK$8vo1WwbIf^{ec2o^7t6nw{nYx1MI}A-Utnz%L#2~v?%ijQHCjSZU zdxhH+`F>uvEm6M#Z5<>(U}R{{^UV@1V|#bJ+Nqqq39SjF9~aOrZ6l_4$GQ?2Ieilt zZp-Ya1+Z(SX_m{k{>3@HY1l|vPudJcuukh)0y@@{?TU@pyb4`k3EI5ny7}EqyRNqY z`auc0NU<856wacE8u`ek{t~ikf#6l-tFDWC9$DnND3~&k?=JwC1WO)Xve{(N$R4LC zx*CM4%<`3)Y6}A-P+$RfsU+-adxIz`d0ltjbX{D?(~#D1+EZMn^OH5`AN#JWsKVxr zM8%0zW@hU_QJN~s9z{-46eV?yrt36OfiFz9jHvdAR&QZy-K|$P*S6}dYVmJ?b^%26 f0Vq<>{#3AkcPz-UVoBJ%@kOTeUDC~#%6j!*018>a literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/tag.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/tag.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84947ae4409db4b0cb621e90bafbf48ce870b53b GIT binary patch literal 10769 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/tagmap.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/tagmap.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f81c4fa08dacd45a9ee62dfe000fdfe14cfd6402 GIT binary patch literal 3428 zcma)8%Wm676up!vS(4>P?AS@VB2WZ~)L3rXq5+H`h>`RG6cLQLMH{yOLu<x1Es11j zsI(H&ESmgE7yW?tPrBi@tNub)J$LvJ?Kr6^&2Tt(cpvA!cx`E^_1AAw{<%o>H<d0M z>jxP6V@v{ni$+9aiw-QZM1_vAs?ZmrN_cn;dWB?_URCM9CSlWlr}htCq>h!;q*9?u z>R)@ukG*KXyZKea;sJ*K1Cu1?4N>3=X$OWg*zzB1n_j2PYb5F{@c@ej5)HGilW3A? znKd>SNwm$nK@$5*B$oN{71*}S&I*aud}q<@Tp_WR@3cv*lelU);N1-pn`XUC;u?wT zW(^J%n0Z50p}Y4vW?1KRVdcJzyH0p`DhIK4;?UXM@AvLF@idaU)pBq>RMLy3;|19% zXY56h9~_^5`|QiT^ktR+NplIFl8!$fPh#(I#7u=FCWGM?%X1(|Y=yyS>g-M9lQ1yi zcLpO*>z!x9AH>fJMNh(!xIhQ(c-k4tDemBGOfgIh``kzzdG3uSQfE5udCD8hSSoGK zZWWh#jFi+eh`(k)cATAPdPX60gi&HR!y_jrzKo`x4({|=a4+_bdnwY-<{;(T48lPB zLMkZ=UQqB*vUQUHRN=>d7<ePVlIi03ffJud;{XOXvqKO4=>OE*bq3*R1Yd*YrSyHb zn%*H}b6y`uK9_;>(+Q@okVoERWZ>&MzRpd^R4!3>N|Bejxd3E0c$4T10EwJ~far-Q zD$veRsNntSJUkH(P7ubq=z=Ry?3TUTb#6_9k<{8b_Spb_Z>}*L*)1UMc6x?Se_$h_ z_~Ls7;~|Fr0MiSLq9*xR5V@Eu6kX3BEqYNk`=}O#ytMkAYO>*`$>O?Yt&+83yO5q- zE%r(XcI?E~a&(lm&%EE9zqVL9{W~dCQTq4O?RXq*M}D;B2Ra6(TZckUrl0)$(RLcc z`He$)8=;K!??uz3;ktg{$FBQ68(hak)(U>JmDGw}P9HETeDVD}Lcr#fXjrGH%Xplc zk~(Zsh(~~goeB*XGK3UktXP!dTHL9q1>BN4ltL9V=A=`bx7)6Z?1?>?<+``9qm8Rr z#q~nP`H3@XGBU=ILoB8%MiJxD8~fh|-;f<!G;EPNBFnN;CE><lgVYXz^or<Li-KFZ z2~{>weNVAXr)UE>V3`98nSuLH1B<>hfl%qs*1zJo3!Fe6doco$>uslQY)=}XeZ~!H zj)G!H4;J^PyQnvYmf@n7K{yY}qU#>Z*pKDdb#H^NS22-Q1u9DzZH%?bY^}hjI6ScU zATGWaUR=UMY$6<<gH<MyD~SyO%4poNjE~N%!NG$gu6q{@G_#{Kfn#WeNT##zj7MH# z0SME;fz-`k@;Ff+GT`WQvB@n&4m8@lo6&7jdxl=k>Gl~q90M0NNj*2G?EF-%I3;RK z+1&5c`?KavofWBB`*vPgoSS;qyzOwl@e+hA-}uSCcT?Z*)RQK{k~^B~ata0LJg%EM z*H$u8CbErpGdCVA^S0?h2!}AZ07^dKx;p?SbLVQMX<aj81@}@$rY8$v*_S*Fu$)UN zs_^3M-V;+!=T-E~rvb-gVKrj)TrGyz*<TksUo}Ab5+n6{waCVD)w+y|kIt)DYHjB` z=e$w9sj8_Z7sjb-Le0k|RadjbC`#&O^xVz#%!6V6g_X7Wv~x*Ow63wQb@}TCKyuZ4 z3!W{Io|Kf#v$s_2FQH~1+}Sf13rU)&1bd;z=f=}Qlr_uoD2SI7#JIjgP+#&#;|~`L zN{N>g#Mrz=P#sD?l1FIGMFm>Q+?!H5t7-$pq~*HfP)tThRBkFiPP|c?w#kC)ig1AZ z<vOTVc)G&VI#1UyC5=dhkyP>2U~A$@u}<nbPd9jak0)+8rHLDu`BdkH=Cke1y0uYj z+wH}6wY|Jn!*2nrYQIxEsHctEbOP21O&qG$(@!_Uro`GvG7YkEFE#5vXTE8Us2kP) E0N@7~^Z)<= literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/univ.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/univ.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb21afc51e85dbb9a48507d0e24e5e18a80993a2 GIT binary patch literal 101813 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�W;H4FS4_B2B#L+*>SN`{u6xJTjXPC7l!a`o~j^)JLEJ zoSlUjKQ5F%qC3ZtS-ciAk;zu&;%6(_-((y3;ZBuy+l3R#QMh<Jjr_<q4ed~yHs|GW zkT@n1DUMV^x=vEKydt24uAy7GV%~lSFZC#Qle)fHUEiYk69+6oGX#d%O2P!oq#Lbq zsf7+nTx#J=dl!$kD;L_MPz%M({c<NfSBZD-lRM$*O1uM`e4~{53LUV7fwfD{SVDCJ zu``z3A$1+DupRIi9uSY=&n6;2TKL7{**>;>a=$9UUl!i6!}1fZvBs4a7si!#nPZmf zYwAquW0zPu+;3s^g~OL{eOMLrflIiCE3Q6a3D<SUD*^E*RN<r`{xMZJr3$0+I?5SS zh0}8Vgfi_z^C&tNa*TQGeIQwQN)?`#OsMRvD!fCk-=+%BsKT>yjf$UBg>kt)t_tT= z;k;ZwsS58@g$r{1c2$^Ag^O~1BC0Gz=AR}D&#S@<^7y1GfpjjZ!n@?>sgTY_)#Ruu zyjv9}<vw74k1D(<*AQzjtHOKb`iv@MRpE+U19bYYPr<bWD$1!hnTk>ZQ(C7*QHni@ zU_Olh03Z9s$mzH&8W$gave$CATt~v4<;-@E)<4o~`S!J9{+g4|`H=T3T8s{y_#usW zt}~m1%EtF|`<*G~$(0HYtoF(!2*j^<f2v;j88)h^b8@g_)l~gC7}Mx2h1e_xLdav0 znu6+iG*GUTN3_d&I3hv)O|ZumXfG$`+<eTZ^lRo8bAIXI2%XVKu&#xk7}hD3kx_Fg z!5I-=I!|JX7D{@ueM@O-oxkPWDwb!&U!TM>1wSXt$tf5W!AVkjM1`>mg%DTgOnSaJ zc)`uR@!h@iMbUg-IDPWjXwgizF;{egXYVtE+&O&kk%LE`2*&!s1N+TbcZQEZ*=Yt6 z3$V4FDC{_j8ypM^;Jd>|f`fC$YbhLOUri4qeXSjQH&0=opESOZWwbQ=94@eIdJz_g zqRgPB><HIVI8GcX1l?ZnZt5(;-}iC(1FP4RdJLHvwVf+3v2DcClLGK-TpdTop<1Zb zrhT=<toJ!QttH$#*?n>&PJQR`>@zrL^c2|M!2^$AqR=aCm;?7gmPb_UUUm?arFB`2 zsLqCQPjD1pe-8wAEn)|Y?7xf_*=QMCg*zg@qmg}BcHc>=F8^|P536Zd>&EXPkY{iY zr@jV@PZ)OF;mWKM5eN;Hd`4ELF!aL(a7v93R;t>l*xZtEX{Zsqh4f4PwXkql7vmi+ z>`gqh;0DAzHsQ~tbP1UT@k}pHL%$Y*-s_ihN+kzHL->%192sU3ApN6>iU^)49L0G5 zZ~W)o#Nq~qGu2N~i5)@>!QK!;&02^@po)$_x7K@=!P}yi%g+fw15LrgUMdN6;Ye|G zjQ6X|4RD`ei)5wsIE`dKosa<P?NNT@!SkR=u;dPUe7&H)(+)`15W)gA1Rdk>ag7lz z1M*b2KZ}S@4oOZ&-F5s$7#J>yvf$5{Vdr_Te60veWGEG6u7-la%Fm3|K00OMh^wV# zV2Q_S(1Td+1<U47@Wv}hYF#j#N1T$p1fueOp7*2m^GW7NXEC^Iy;%adWJu@@by;?E zO|4CBDS+9lY40!iC|WVeVu?$sV;p;9xKN1)6Px8<FCxqLBZd$i_BJC*m5x}|o46lW zDcq$Q?iLvAr(sdOMMmobvI0j`s&z7I!*#W=1~X#WCgW%H2!0qpBic;M8V2+TO;s;6 zRa%SmFf~;ez!Q=CV{*LOajcA^8X#HReiBWTrJ!JG-MQelC=`J6U8uzS5|g@y(=H6F ztT1Gf_D`&Cuz(lG2*XLqQ3<{<n@BHB5*O}*os#N*G^*Y6&ptmfe0KcI+3~X%-yItI zNLagw$KONEDh?W%;byBAN+Vgqcjjj1=^{MM2{Z~J!|7!iy{VaofWRTNxz?6tIcH1L z&?X2*<H&@?zJFe4fch!e`0A{#7i5}8YeMB04Jw~IJN{LI%h_V-bs&?t<|o8udsfP6 zj!fvEpJPqPv0$*-QSA<}89rMjIs=nx-I16A!4n$yVM~!U-ZeEQs~tg&xE&k8sc;yG z2@(bXX5Mi4f{)klmvUf+BXKvb>qjD0KOZ#JCaPUhZKFL>GyWnIVT2uD#W@y-QN=e} zRcIcCb6l3$hi%-rdNb&i8b>qeZ?<X<8+VWGpFd(%VH&rzjum>20fg;+=9L;p4*rT& zbJ#enkzfGL-r|RU)A$PKjIatyF;uhGijSbU@3bm5O<r2_3Qgwr$y%EHIBNbLtLCuD zv*p6tn!MJEpFqVQvnn=C)-|)4{O~VwX=GF2-~=V(6Z5H_VS#waP+GkxO%MDVjv}`w zT^{U@$zbK70QDpG81B7l!4e{2u6(-=2?msY8x(eZ2n}TBunU&Jv5d9iag_H73j~7> zfgv6Og#@?)8SDsQ2rMjCqWn`R^82moLktv(x9Tvk0_Cr@;!#xm8LMK`?xi)~<0g-x z<{z?Z)}m52Tfz43(#r2~vrnV)&svpl4CV;0aqTNKeft`F`zh4^qgL&DD$Zun>@|=3 zwbuPK>i%)7?hx&ssXT!k{P3@7I3-jpjtqy5T6`8y^e}HI2S~`(pR_6rNgK*6koFoY zduD~op2hQ@u__D6xxuMD8Du5(`)q*bYD^(~W3#+3xWka=`WcoCT;vBof@L^Fek`uR za%37Wa5acMJhn-Pq$b0J;~iyQ5tRf_9vNd}p-Fr~eva@{B2h3AXvOAZAow=+%P|9^ z4=-rw&`A+Hloh$nmdBBAx&Atb=f7y7Fzm0~6kOvP_t$2-YQO;E=!gh}`^w8z_)a|k z<pvebmDf^X=jtoGfC_)5L4`0EwwNtR-;n<S{IJO%GY)#420T!A3<}<Ht*0LRF;15$ z?;_sR-A+7&>*wcr_XQ^Lm5+A`_r4erz!t2F;a#j(K9DbQRvG02d(;>L=*O#u0N~`O zsTF9^|Ahw902Y<Li^;p0oJ7)u7ANuOH!L)TKwy<zwj&l1nAZ)&dsYDAMLhp+77*cp z&bvjZEj;=(+#77XcLhMQc>dolKtgO_!YJh}vY~LmudtSYYw95ZQb8yb>4t>H`!e## z6%_H?R&|}h1hwR>-{y4%g6PV1<xtn}HL9!rVBY3+af?nIZH1neY1b6$`kxKzT5?Qu z^SXlbpI2^I9(DaugSwU+_uRa$;JDzG>jLjrf6}0?C8q;7uPZp)cjdZV)b*#0>Z(7= z*RZdqvv(~`E4yX50ON1L<eq25WwU=_RT|0-=3#6Yu3WSCcWA|O72|AH!j{ecl~rpv z{PmOAlF%TQi*wBfnd<pmtl1cEL%1RA+e)2b9^)eqHK2301f^P$`$MAPas$;Z1Cq%8 zQEW12jbf1$Xd|#|Qdp>G=&vHv->?OgH#npBBm=ErGxvG&Q{f)1xX=v=1{cFEHfGkf z^+qiwnz<I#7TSw%3e+xvMopf_I;(kwf786e?ntX7CAL{LZVqY;RZDBB@^7102}KrE zM^ad)Ra>aY3ZJ1jD0j)+F!XdI^P<TP#1}z)!c*8P5)$;j%oqMYCV$C9l-^V<BSI;X zc_z1*+-9=CgaVp%$N~GR{#1kC=e@sTA_hj(5ZBt~JQ7o7(PL+NM6kyuH*^zzgb%2j zK$svTT(Wz|m~gdfxh<dKPm+u`#^f{;t}(o)nY@Du1!L`TO!>~E%;ixI5`n|xRPVjW zgwq^MMUik;u+Co~gY#S_To`x>CSS{+uQEyTXPQY1lZSXON(T6o+XsIFIl%`>tFFC> zrUKEn3;#ACeo9B8lWur$TJBEvv~>-3xAv^->FP;~iB&2}yK&9K5%@R!7aW!#zq?y` zw+}h&f147LKZyesa6gaw%?Be>oxs=U{Ez0{6A!;TC?{@bg=GSk2Hs{=lDi+Y`(|>p z!$QrnU=dyZnq8b(##+7SLJv7ze{@pUTOM=32sj~vsJw}dKX@KaK|-m+e){O#V%Xa; zyBEoX8F^$p%Ds9^7k_bfs*DrwaqdA8oZff1!5Tyq)7xfm0=K<2n4nz96^i9k^OXw1 znxB>pV0eWT-mvSQRjin%oF0GvxziU;UOYVp|GX)w?%?179511-4-Fn1+HZFJWUFeq zM89-+@DRQDVz2qIYr`QDaOPVy9-sBF1l7mhv+Z11vqfnzda)>JF!ma=4h{qb4(xZ> zqVV@2{BG2$@cCgpKNN*dXHi2@W5R|YMq@T~T|MqtO$m!R7`p2J8Rm)C=N(@sme2y( z@`)GYn)mUZ!z7xa<w~Y$PEp;Mp|p4WfzaByD;=9QkwH(Jm@gYln=s74jCU8)ARI_S zACgH}HiyQ=FkFr-i{bwvmc`5ub7ON@4_x12xhw|7JZA@H(8vb&_)StW+)?mIj^@Fk zJba25jb}RylVPyDU2>ujm@4<nwM@%6izhgL2XAepK{W5^|Bf8QlMald%~?EmU`>o8 zh+w?DJ2;Vtci>e2P<SX0{P4}8JOBfgYI|a2gDot6YI|b*?2~dvg420e4veW$a%fo0 zI{>&FBEunX3oxBK2D#}gEi!1s!g-FklQ2A_<;WF1j$vmSSONqlrt=k^9woM=h57uA zVcIA<fzfBk$LVjfcCjH}p4GOhtlnupF-(D<2Zu<Ut+=ySoC2&}Zi%zM8Pq2oZ9=)k zih-65+I3t2hpj{THf(Tsup10)L&r5f(_^@jyE@@kngfI9BNrvl>gT4Q{@hiZwx?@( zvm1iub0w!-nn4(ve16`;C2bKg`xYyvN3M);1xI665C;sBufUEO@j!I@8yjHCyQ{On ze70PHNVGWS<!%p7xHsn!q24_=J#^G@b~z3@@Z2<AA^qZPaVDqFi6Woor+&r=;tIed z7tZf+t%QB;(TJV%4XZAh6DLl;^ZC=`qo<v7XPmR+7f(M0&vxbuKlL@l=^QTSIzYvs zHEYa7&B3%~RftSsu~wcD9ASlXsR!S4@X+D?&Lc-2-S0g1_!F0P-aNRpe7M{JFHu|s z`p`y-{`wiUaEjV(m@jF)_Sofv>P4uxVb}>*LJ3C6O_Af={()i{933nQN)(1F#m|H~ zcC!~@YGrpMn+}W*;Z28?9-e=g;VP;4%#7F8#Tu?x(p7*_-3#_J4Qi1X577Jv7V^Sl zZn%rL5#n5*2jxEq9eOJlnX(M$%R_CoRJAx~S-9PgyR{7n=@)PlEoVv`?AoRVjLzH1 zVuAp)@T$G)%c&Z*6sm6M;>7%moF%DQQ!rY~;Lt^$sIflTo~%9)k>ANuK}e6P26L=N zOm9Us1J~|8lf{jZS_(LZ<=Q@2t_jxZ0{Nu4S;{fXhzN{jCU>QDU)bhsviXFdsJ(Ci z9}RJEYB4-`(n8e7P-o;t7h2UM<7;@43tmOe53<FSFc{2wV{${Hy0d9ZBj58BU%-cd zO=HjC2hRl&YXVRm=mZ-oiMsZlTw{CvHMTb}Opx~O21J%b#70y3i6UX4Ih)OXi`{tI zFfP-0^OEUlHlE*6e0{2Pbj#7T3>5$YK`f|Ch$SCxIHFti{*oR=$7Bd4_3k2uKs)=0 zbS?&;;l2_ZQA=U`)V0L>Ej;*W)Pn9rJ2WlT`<is04yJ2>PvT{M1^9kkfLRcJq02k6 z->0LEl4Q9LkoG>0TmoY)gZ10I>wBNVoshs9;98#lOG3z+RHEA71hzc(z@i}C#3{c5 z+EH9A>>v{xyNq*kLrjvkz=L=eriL0gCe|NSMQKMCw!*>2OiB<HAveV9Mq;}G)Hnx4 z*zUiIP`eHzqdU<QwK~7-5s&B70GJ=V9Sx0d!VenB>m!o31;{2jVBm{g9C$GB4a6hs zi{R4;KaHbwz>MYCXk0G>3G$P1!)0)xKv?MX1q?+_OCUq}fDEv<;Gi9pxEw?2)GqIB z#0AL@@e(jHeBIZ72&gT_a+N<}D5Q^lLG15cye0;Dd@|0_t)=}+dCvP@-WKdW#4AaJ z->|$-6RW~usVGeDNOeJFxPwEl8FA>)3xG{N{L8Np$3|SR`-N`NQavY0@CRv3YY>96 zv4Y*}ML|D7cmndgzX^E;rJUh`FY@7E@=O8Z5nN#Kpc{j6F5dcp26#tDVcjIennZ8o zKfuijA@Gb4uL}?e7(*?!G(tX9YVB^g%7?3X*@NV+DVO*RDc8JJ#}R;kyz$d)5x&CF zw;&inlU6Zro~Y!9e+@er!4HjA&C3vPUjOX!u%H4z2pTF}0_}r=CECIw^ekm_vTwlM zCg}eV9{pSdY#+U^n{`1LrX_@zuyUm3@%3pPy0A~g9m`-4bI;i2&Efz7`amxT{t+f0 zat#I|;^Z5~`+uMSJrLHRf{>#%nle9*od2FMvvLLd_vHiwh_2X0Cb95CIgQ;SM8i#o zg}E5<j$O`L5*kD<a5Nl205=N=VfZO02B1;c<VRC@P`uoSOh!TjKU4`kP2Aj2{}`kg zJP6xeTc3yZj4LA4nVH;Goc<$o&nC29Pe3OCpFU%xgZI`m8N|I%plY369Ay#S4n85K zP-ZBWNV)a2xg{%g8ren5Z@)xbcA;S6lJPS#iM~{Ie-n~zSj5E`%Vk-_xKDix=QN=R zqU~v76u1N;KPa<@9+2R)A5iK83H1SS8UZdr(cgd<!E7OkF?vPdiUZji+au<6Jl(3j zYoHeio@tMgP?m<|hngrfqad*GOQp9%@&jj<Y(WT&FOpq<5T`r;sQMtNk}rh5JBira zA`K!7+;T9}`G3Hv;d-a?{)iV7d>6t#B=X#$Hl?)VKy2X)=ea<14t7AN7M)Nkw}Qo- zzB!LoH^P-y7-qEI?Gr0nKkpUixPEfX7HSZd<;r_5UkStUaXE87JnVHzXc#!-nFS9v zSg92VPQT^OfO*7148dRnx8N=~gWR_so`URM7#eY&oA(hI6{~z4OpAalNC7lft?mMr zqfiROii!{br7`l2?>lHAWw1Ey>@``atk^4yOSgi0&f);kYjEMsaXlI@6p%PMr{vzY z$`U06#AW(b(51Cfq}o<iK3WdL4*<X-1KmWdOg~uaTHUf_dxp3PeH!`K6cDH*Ba~{7 zk2qG(PCF221t5==VeMY9;FtJ9e*T&}n+sGe`+;6Y`4O0}1a-vA3_MHNVizt>L2#Z1 z#aqp?&=Uc?G)fS_wF3nW2K7UoTP%SIS&-i@&dl&&;@o_tJd0&MwGoT4UWi<Yi9%Dd z4y7B?Qb<2m$)p+dS4gPiW#M3<J`AcRsn~P_3)d)f3s!?y;nCA%<Afw{>&Id>osGyW zq$mq?AxFR;bYX+WVZ_e|sxbl{Q{3=INNJJEWF-X--`WLbPzhT#zMK_3L48dOY8ms+ zbBhtXk7;>gd0Ad;bV7q-1@gDmEX?ZTajalV4a4WV0%Z76q0X)YqA+x*(+WB_+}d}9 zJYoR(BaN5h*f)u=6t8L=Gv+GG*bnvRbZ&m8a-1*KmFSP;XWX1u-{z=IB~6^GuFD#R z$EBrp749Ops6!R_R}BAQ=uY7pv6^><>RLuF&@>3f80ip+q~_S<7&kohI3tCv4mhpx z6T%Maj{)V6ph;$Oi8LvL@R}Ytd1`bF8#l2RBJA4D4zh+uMH2BL_S$M2)(Gu?AN@?^ z^JA6*6s;+z(zwIlg9Ph7i2s*&P?V-bB0?494G1k*f7Zpi3Iu4zx{_#nnB9j`wbp=` zYn@hKT5f`}Jp3-av#k}C5`y+b^<=~rVk)=B!>&<aBUzJFABxI(Sa=W!ijo8-x$=C4 z^OTn>U3JHYy1Wyp+4~+QpI{QL3kZ^qR3(D)HU1Q#Sk#iO0lx^>#IkaDfReGp<a?R> zK3+Y9E3D$8N4xk)T2I9N8l_?8QKz~S+u$|Zg@b%IKrYTC+ObUDnC!(>8n!h(IGYcv zrQxV$tH4m6y~@vee1T`Z5_vD07L$`9;)ZfEx?Ky&NMFW+0}A7}F{L~ULAh@Zv1IV1 zRV_S5p;jwp#x4)ZI;Ks%3_%u4FXV>^+@`j^gx|7ep;Ds-OO<ia-iUZDhP2*~i^@Z4 zwZv=lOoF*VJO?=Mm!&jB<(CoM9F^c4-%im0{W>*3FL$bvuDpZSFLg3_5=ulKECpW1 zHJYgNKbCk2Tab|8vDWJ2H3BT%K?(3Je=7MBg4OA4PbKw1#zs+I+K?dHP|kWDGmK*W zU$%;RNuB~KJjIy_Sbw|}6i$`Atkz;xp!Oe@S5TvQ<%bgh0Pxhk5<mjHiaIQcZdZCq zMU4UUY32V;0?77o4IFJ$-d_k1J!<Z+<pLTtxY^@B3QDQ+I=;e--XyyyrF^^yjBHkw zEllZ$ZxDe##akV60Bz7A_zh%Z?|^@x=#Z|N7;4LX4vXKDzF)i=-;1;6-q*7jp{mNs zNwKqBuQXhb7-kIlhZ~q9S^ys$at3c-b4!T+yWku@?qI<)h)w<Jq1Uy5iDcJ%v3?2V zGXuKtXR~^1uz0Ckpy*gab&HZ%X-yU=&DTKt=?s3gcncVli8WSQDEZ@Lirfw4kbs<w zuQ{~bk_R${-qEwf<JB*7WMYr-9xQUiWqp+bbfXPsV)|sb>eaFX<Q&?k79|o%1L2x` z%uaK}MLT;e8%SI#m&lq`j}BB8ZdMy%cgcd~iU5XqsXjudS9GuJcVf%6a5<t^dD!ER zhMI+K1VSiIFY3)RMk1owR<I6Vx(2IXDxt<3#W|D<=}h7n`4obR1=(ATL?<l5^4GAH z{`$%eH5S;9_YoooMR8GYh)?dkQTW3;?3OI8YNdr6nMVYeWrfCW*UKjZc4!cXBh$*> z$O~M1MU9ZK6#Jcc9(}sHJTj%Q;BzIb1D1`6WL`tm1b1O+NtZ%q_+-Qj%{yxoq^jGE zT<r*>A(cV`ES8|n=6*r-2o^QN_CVO<38#Q7l+G5Bt1f{-S-t9TRIVPI7y+P+;UWwW zX6Hb7FkwNA70<clBOU5(F3)YFG$sOEB-zOhw1{^i)TJP2YS${tO0_mx(9keNOu}m$ zLG;kqN8RSrUVj2MjTfOgx&)q3TZiBCFbwC7bJO0-D8=hXGPGVxz9J<O9kq>124bz< zjGNkqdMX!zauO%DV9(`jVL{|<{%wPHPKZf1(`(&^gUC(4)&(ODMp2fZwe^8@%IGyW ze*=_Axl<=1j}kct(Q^Mq+*kW4k8VfQC7zSH9<pa7m$qYTtUc8ZnUt2_-AH?IdNg&p zTX>z=lFDFfc~f#*vOR%+$laZyo)<A<k{#SyZzjbyUZ3Rwmwfn_oi~cFe;*QxIM{W; z9velu;3qaTjptrc<0S)<c`i5Ccvr&08kiQcy-FO2wx3&o)><MaaT`?YmtsJs02{x) zgX9B>N5dK|Gek(NqyQu&C{Z;xIyqieVr=16y%K}ehLxDKmXdhg3XBwtEex)}L@^(0 z=K$|=q4oW27SV@=){!R52-7IP(c%hq^r0%*Ik4*puUS>CBP!!ltkEFy!4>O_;m~w6 ztsjFeUO~nLV(NVAf;)>?KTtHyM0^8t9<&WpE&#w2XoPv5mzi8|k>>_#0c%2hItPXV zC7;hYPww<Ij8$p%6i&&3oP$h7FtjqvkMS^^F~vI0aLlRs;tUSCC`FSu@FHE)(51T8 zA{w2~7#wBLFU@vDC2Mo^a9IN3TNX$}&rhw49@D~@5Md!^!iDCOXX72cvQ#%l8|>LK z0#(AriXq$d=76Y*4L%B@kC(WH=#<KB7h<CB1a?!bTHnH1Qg25shd7=iQ~A+VAx^U9 zNlW~2Lyq()4CEuYz+l3_e2kkqGPp1-xw{z{9bkbsz$MSbLO$}t9lQLzwP`0NvM6Qq zV|+*U>}Zs5OUi?(tY%I4DF#=}bn_8eMPYAGR@LAF!CfBxJ2BKUE<38#<k5~VC!A{Q zF`?ooaoFB>177V1^&khK%x7XcBD2_U;%Tr|Cy}jc>rHr0=^bGVkxIg1`+W0rL}o88 z6vB3G0NYL{`@r;R3$-q}HQCfiMhEoLF|k4<lkpiOm+&J(GH|Q$%v9`7xRMR9t&JtX z$Z@iI9Ig5-D<r-kTQIs6>v&!Mw#{3yXvW5LCct1PBD)Vi$@uQ?>+lW%Wwk^{E%7pt zBsOOeI*Gqpx78F*-{H>tm(T$3FcDriTRw_=|AA=Jdzl@WDPcGU1G1(wMqLeNI1_P1 znouR?vj9hdRS`^zF`?P}@A?{q!^Jt`5aaQ}!H|H(qGar{6NCW_w)5XhB;iDXE*wYA z{5MZwN1WuA%6aH32#EUd2|0DJj`tZl^6iC;#VN3%vNvE6vVRskcmceXY=N3L(Ud|P z3_S20DBroxtvoFgYId+<q0|LmA-^tBN9-U_lb9HCIYs+syDVqg&0+h>^&>Y18w`7! zVjeq-&=lOjtPw5*LuOvDN7koNgcAUl{&9z>=of7}t~hQbKVs__R$5amw;YS%wTLr7 zR)bJ38N!dfq1N#I82-qmi6v~U34$;OLcbsZIyE1+dTYE~iMBandy^NjPm5`SbF)*# zy36C<sMBa}z=CID90!5vJxJDWPubQKfg;gOc4mzU>{g%>v0k2ooD8F7ED$(F#pq(# zbFruE7R)?lbVz=%sVxf<37m)hKkSq85+vt9{)b^bNGjau#KJen9qF=PiAtM7m|6sc z1Ij@1)3K_F22kqN`C<X3VI_{mv#;mQe7WG}ea3~Ju?mCnbGd-(AI3wuFmHiib!TA- zOCxNc$ADnrCx$^m&)&V^py4*@-o3QPwNZsQ&M^KCJ*A^<{9@@=dFB>T;kj4mVS62p zlo0oNWaK=ogCI2&^ZP|G^IVKopQZyC2^a_=DW16qK5SNA+7d?$$Q}e+4b5?k0^ORe z`24?+?TSU&4uqgg?!dPfjJK`1F;T#t49le;V60d_TgP$(<0k}y4UC^STZz>kr*`;v zfN@geoKOpo3fm3Mzs4@_5z#=5uAx*7ICxIoJR@pwG1@tXAD03PVN7hY4uHk%5bQ+6 zNQ4G`|5^<CME89M>l>K-(S#de477bP7&uN1q5yDVz63jjyo*rb-lBt%lfNM(2Aq>l z>o_^p9b&VeU$n?&Oz%26IW4Mb8r93w`T}xSp)&%{W<j9_h=UsZ)ATIVx>qbOh$~i2 z%d1ElxDR5D3T=tjgj7U<fz5ZYeUK;>0AXv27;4iDs$zgRb5Yx+wQD1D5tC?Su1QXe zo;d63{T)uZ9?W?{`Ki`A3ym>IUCT_n`S@3v#3cZ({%t>qzadq!Ce=y9Hd1CL*^dQr zD!D$HO48DL0~W*8Jx$g@@zR<csj-uAyvn2--LLIjKgFLt{P~BxqK%`soe9nDypJ=v zpFaf)+;q}vkPNRzm^{qn0F#4EC=hxSZ#)h*?{Owk)8%S_S+*c~A%jLgf{U)5nM7B2 zS1bOt!#}&Vr@JfF(}Dx6(_I}sms42#rxM*WJuSG`-qqf{vAexzAdmOVhePrNzW#fV zxY$dCD2_C#Tp3>QLBpXMkeQj{Pz|JQlES}Cb|oPX(X$M`U^qHM_E0c%CfCdB*sQ@d z9K=NA@hIqeKZs;}Xk&e30X7P8osp0~)I|=cZH6M@j4XIYWeA9)m6j((3UA{(i%f*t zz&L_q%Nya3U_6L7w3A+<oxbxe85~9O4~3Vl0O&PZ*sc{X-V>w|5v$jZ2G;ucif90x zY4Ug#RoUc$-k(e<SKCUWmow@qbTfG7UE!QKdIh^$^hh)wjG!3f!3c^mXQRLu5kEWm zBE1le2P1al;P}@q_i+I-f*&LDz;V&|G2*5;G4ei+N`V{UR>^}5a0}>@Ye@1qws(hI z!wV5^hyC<d#4Ds-yn=I89+0P7m5a9=Ix)g`@h)f@-iG=PZsPwgIU5E3jqo|t_xI3= zkvVsScXZAHIyBxzP8{rl8i(l67}SV^U2q3SrtA;z0D$4}m=u77vt95L6W&2NvjhcV zwQ*P=1YkJn<cM7FRMD|00PJzhPEWuY0v?ZdTCl3|Acsd&QMm4h#&)SfCY-Odl@Mm4 zDH{FRDwj}4P9^gQp9V)M+%u0yEw%?jO)z&Y*`f+<ql~0$bY5IKLWXa$A0<xA0=hUb zGjn86cTS7**UB>#`Lx4xAms5CNYHT?M_J9}%QN(^hJdBzKkz3QJT!*@&;QYRIl^Gn zh$BV<5CJA|`;(9XA#D+t(L&)L%FS`iHAc0@04{QJ<U--zxHww%#9bWUXD}6t<d7Ii zpZt0D<dF$%c9gD0Yv(Z6bkXxG!;;bDa?YK<c=p`*$!C{l&s~)QrBLlr>5QE|bMpCT zFFKDLh=CA4{dXl-OEZ4_rT+is+2BCXCOGyRU<Zd91U5J)=FPbo>(!{CE502_&~Cwc z9S!Gufk)^g2ZBR6LNr>IW(AT0Y!|JrvYbQZ>3d8=E+gZ>#4HwB0|t9R77Jj>^^Wqj zlFk&9Cn)!xz}LTpWa&g|=FWTK^v~%KbE=s#F~#;^de{{CP@ELk%2VXzV~eHSY%xzH z`qd}S6y2Euw!8W3;m~TGJHjHG%aAr)cX$RXpg<qun?)W3g=o8o!j{=Z2rfjzguWa{ z$JV;C@DjaP#-<u}fba`OA{WbG{P-1aZ$vVjh`&2g;`=GLq;a9J(N#4gxk;lU*HMDT zPYgtEbZAY!-W}4A>9z6Okh2LKl=8oUaIj}pqB;<+FPcLE)0bw!4*O9C7NuPBLU)}} zbK;4|pU^j&u<-=PJ4Tpvl)ze=mO0icK```tDC<KOWX8#(Ib>MWRk+4%5FRsy(!^Bm z14}m4u+aV>APjvx8g8rc^}{SeS_tb#Ie(F_NrU^~CKPySfgTcJ<35TvWEmJkzO?TD z!lMs|t;?wD+g8RqkOcoAYisSQTY`VR$Kxs@%R|AdwPzGoEwz3ewSH4rD|&l1G^f3i zggo#z{~Fx~F|yblbT|5)zJ>RRvoiG%Bh*8%??qA3XPveI9Hl&=f@>%t#MUleA17_p zjg?pN;9CeazMxSo1(WL%)qN{t3_J3qtU78n;6H}a>cM}|fPYBTDB@<xHDZD$gtmuu zbvq?6;}R3I4TbkB`@xgu5oLCaK&=>vx3RVnu#$I0hQ%LU(&B?FwRlMxX74K2ZBI66 z_n>L_6R~!qSL;sWDQI7~>PCXg4H8;whyn$zjyiQotN$(0(4f`l15f``i!AVCudCJZ zGGeVJe;vhF20vOuf>d1f<GS})@Rv8`PUvD?ZJXu{GQ6h%9#zk;8g^hCG@~->e3C8D zTz%szMp*b7&57rTqMJ-SCZb5#$t%&tkRfV?%&WY5k_7g4CMV)!MsUpGUhA?a#jhh= zJ-AKtU?^5}cs#0HTD_Af!OVQ@Ir6(_@bwuC5Yvj@Zv&cuwGYFQS_gW-o)E?b?q*@5 zicGK^JsKDtWHYp=<%v&tioHsCI`_O>v{9kL`&dhpn7|G?EayRK@hhlTn_p~<VmNTX zJ?oaV9!?Ze1iZE`Td*eoQ2)D!CB*5?W6_@`9`v@`CYYPF!)O|_ukm`dW|u6^M=CNx zIWfWy{~GQ=2sLJa6QBVB73&nU6PIp&D~6S5pvVxPlaU2CZSlPZ4nTcj=mz9`7u@}V z6682)lo|MHn-ac7N&sFPlu$~jcLifpt1mmEBb;hIU=5?8MW`NWmZ$bLG$r!X_C(9~ zG29DLDV9fdsC*UAe<UO+o|P=&Ad>f|^xw!cH-^xNBa_1T;a`JOn$pK`dNGU;A#(_J zcJDAk#LbV|Xg$9iT0aW3o(c=mr+f#6NLUSn+3$GWn2nnqk%u+MtXPl<W>*M1Aqv_r z#L<g@6M|m;ZGv9F(qO_P*^c51djuJG;D69!2E0%UX2B1*5JO4}2W84TMb08hxlvq& z<RJd!b>u+i^lOASgA0XGg^=YY21<+snh0qI$mImt=5`&zB5MRd1}jdSZZKKadxfJ- zaTy=9M^2Scb3Jk)GNCZ2l=r*HY~jKZu{4)40@jx-D4MVpEmN_2eh4v#K^|ZKQ6viw zN1{AL=wSOEoAbhG#x8fu{=6__N}dk{4(i~eX)Os#zmY+CcE2?m#@sghZ33J|Zk5=R zsP;8LoM_vctc^PGp2iy)mJR_<T!n&XoKR|Mtd#uUw@|dTL4C}Vx6woB1U=Vqv5;FH zJtqV7pdS(WmK}=yFR)rh!q7;A;fUak&%^|TCn_>a_&|HU1EHBl2-RdjfhHUhjZn*t zqSx3^d<C`biT-4DTZ86u%tq~PL2kBJ0yK@`V&Q(mHg>t!G95yT0C5Uomk`oqp`S)C z61@Pe0jtEGU-)>?5QmUyVC6H}⪚VRH9CH1*>BDRZHCPej9bx&78H&{2Vr{-Tx<Q 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/useful.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/__pycache__/useful.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cdc8449e532e7f1b4a41bef2572255ef18b303c GIT binary patch literal 5076 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/base.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/base.py new file mode 100644 index 0000000..994f1c9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/base.py @@ -0,0 +1,707 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import sys + +from pyasn1 import error +from pyasn1.compat import calling +from pyasn1.type import constraint +from pyasn1.type import tag +from pyasn1.type import tagmap + +__all__ = ['Asn1Item', 'Asn1Type', 'SimpleAsn1Type', + 'ConstructedAsn1Type'] + + +class Asn1Item(object): + @classmethod + def getTypeId(cls, increment=1): + try: + Asn1Item._typeCounter += increment + except AttributeError: + Asn1Item._typeCounter = increment + return Asn1Item._typeCounter + + +class Asn1Type(Asn1Item): + """Base class for all classes representing ASN.1 types. + + In the user code, |ASN.1| class is normally used only for telling + ASN.1 objects from others. + + Note + ---- + For as long as ASN.1 is concerned, a way to compare ASN.1 types + is to use :meth:`isSameTypeWith` and :meth:`isSuperTypeOf` methods. + """ + #: Set or return a :py:class:`~pyasn1.type.tag.TagSet` object representing + #: ASN.1 tag(s) associated with |ASN.1| type. + tagSet = tag.TagSet() + + #: Default :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + #: object imposing constraints on initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Disambiguation ASN.1 types identification + typeId = None + + def __init__(self, **kwargs): + readOnly = { + 'tagSet': self.tagSet, + 'subtypeSpec': self.subtypeSpec + } + + readOnly.update(kwargs) + + self.__dict__.update(readOnly) + + self._readOnly = readOnly + + def __setattr__(self, name, value): + if name[0] != '_' and name in self._readOnly: + raise error.PyAsn1Error('read-only instance attribute "%s"' % name) + + self.__dict__[name] = value + + def __str__(self): + return self.prettyPrint() + + @property + def readOnly(self): + return self._readOnly + + @property + def effectiveTagSet(self): + """For |ASN.1| type is equivalent to *tagSet* + """ + return self.tagSet # used by untagged types + + @property + def tagMap(self): + """Return a :class:`~pyasn1.type.tagmap.TagMap` object mapping ASN.1 tags to ASN.1 objects within callee object. + """ + return tagmap.TagMap({self.tagSet: self}) + + def isSameTypeWith(self, other, matchTags=True, matchConstraints=True): + """Examine |ASN.1| type for equality with other ASN.1 type. + + ASN.1 tags (:py:mod:`~pyasn1.type.tag`) and constraints + (:py:mod:`~pyasn1.type.constraint`) are examined when carrying + out ASN.1 types comparison. + + Python class inheritance relationship is NOT considered. + + Parameters + ---------- + other: a pyasn1 type object + Class instance representing ASN.1 type. + + Returns + ------- + : :class:`bool` + :obj:`True` if *other* is |ASN.1| type, + :obj:`False` otherwise. + """ + return (self is other or + (not matchTags or self.tagSet == other.tagSet) and + (not matchConstraints or self.subtypeSpec == other.subtypeSpec)) + + def isSuperTypeOf(self, other, matchTags=True, matchConstraints=True): + """Examine |ASN.1| type for subtype relationship with other ASN.1 type. + + ASN.1 tags (:py:mod:`~pyasn1.type.tag`) and constraints + (:py:mod:`~pyasn1.type.constraint`) are examined when carrying + out ASN.1 types comparison. + + Python class inheritance relationship is NOT considered. + + Parameters + ---------- + other: a pyasn1 type object + Class instance representing ASN.1 type. + + Returns + ------- + : :class:`bool` + :obj:`True` if *other* is a subtype of |ASN.1| type, + :obj:`False` otherwise. + """ + return (not matchTags or + (self.tagSet.isSuperTagSetOf(other.tagSet)) and + (not matchConstraints or self.subtypeSpec.isSuperTypeOf(other.subtypeSpec))) + + @staticmethod + def isNoValue(*values): + for value in values: + if value is not noValue: + return False + return True + + def prettyPrint(self, scope=0): + raise NotImplementedError() + + # backward compatibility + + def getTagSet(self): + return self.tagSet + + def getEffectiveTagSet(self): + return self.effectiveTagSet + + def getTagMap(self): + return self.tagMap + + def getSubtypeSpec(self): + return self.subtypeSpec + + # backward compatibility + def hasValue(self): + return self.isValue + +# Backward compatibility +Asn1ItemBase = Asn1Type + + +class NoValue(object): + """Create a singleton instance of NoValue class. + + The *NoValue* sentinel object represents an instance of ASN.1 schema + object as opposed to ASN.1 value object. + + Only ASN.1 schema-related operations can be performed on ASN.1 + schema objects. + + Warning + ------- + Any operation attempted on the *noValue* object will raise the + *PyAsn1Error* exception. + """ + skipMethods = set( + ('__slots__', + # attributes + '__getattribute__', + '__getattr__', + '__setattr__', + '__delattr__', + # class instance + '__class__', + '__init__', + '__del__', + '__new__', + '__repr__', + '__qualname__', + '__objclass__', + 'im_class', + '__sizeof__', + # pickle protocol + '__reduce__', + '__reduce_ex__', + '__getnewargs__', + '__getinitargs__', + '__getstate__', + '__setstate__') + ) + + _instance = None + + def __new__(cls): + if cls._instance is None: + def getPlug(name): + def plug(self, *args, **kw): + raise error.PyAsn1Error('Attempted "%s" operation on ASN.1 schema object' % name) + return plug + + op_names = [name + for typ in (str, int, list, dict) + for name in dir(typ) + if (name not in cls.skipMethods and + name.startswith('__') and + name.endswith('__') and + calling.callable(getattr(typ, name)))] + + for name in set(op_names): + setattr(cls, name, getPlug(name)) + + cls._instance = object.__new__(cls) + + return cls._instance + + def __getattr__(self, attr): + if attr in self.skipMethods: + raise AttributeError('Attribute %s not present' % attr) + + raise error.PyAsn1Error('Attempted "%s" operation on ASN.1 schema object' % attr) + + def __repr__(self): + return '<%s object>' % self.__class__.__name__ + + +noValue = NoValue() + + +class SimpleAsn1Type(Asn1Type): + """Base class for all simple classes representing ASN.1 types. + + ASN.1 distinguishes types by their ability to hold other objects. + Scalar types are known as *simple* in ASN.1. + + In the user code, |ASN.1| class is normally used only for telling + ASN.1 objects from others. + + Note + ---- + For as long as ASN.1 is concerned, a way to compare ASN.1 types + is to use :meth:`isSameTypeWith` and :meth:`isSuperTypeOf` methods. + """ + #: Default payload value + defaultValue = noValue + + def __init__(self, value=noValue, **kwargs): + Asn1Type.__init__(self, **kwargs) + if value is noValue: + value = self.defaultValue + else: + value = self.prettyIn(value) + try: + self.subtypeSpec(value) + + except error.PyAsn1Error: + exType, exValue, exTb = sys.exc_info() + raise exType('%s at %s' % (exValue, self.__class__.__name__)) + + self._value = value + + def __repr__(self): + representation = '%s %s object' % ( + self.__class__.__name__, self.isValue and 'value' or 'schema') + + for attr, value in self.readOnly.items(): + if value: + representation += ', %s %s' % (attr, value) + + if self.isValue: + value = self.prettyPrint() + if len(value) > 32: + value = value[:16] + '...' + value[-16:] + representation += ', payload [%s]' % value + + return '<%s>' % representation + + def __eq__(self, other): + return self is other and True or self._value == other + + def __ne__(self, other): + return self._value != other + + def __lt__(self, other): + return self._value < other + + def __le__(self, other): + return self._value <= other + + def __gt__(self, other): + return self._value > other + + def __ge__(self, other): + return self._value >= other + + if sys.version_info[0] <= 2: + def __nonzero__(self): + return self._value and True or False + else: + def __bool__(self): + return self._value and True or False + + def __hash__(self): + return hash(self._value) + + @property + def isValue(self): + """Indicate that |ASN.1| object represents ASN.1 value. + + If *isValue* is :obj:`False` then this object represents just + ASN.1 schema. + + If *isValue* is :obj:`True` then, in addition to its ASN.1 schema + features, this object can also be used like a Python built-in object + (e.g. :class:`int`, :class:`str`, :class:`dict` etc.). + + Returns + ------- + : :class:`bool` + :obj:`False` if object represents just ASN.1 schema. + :obj:`True` if object represents ASN.1 schema and can be used as a normal value. + + Note + ---- + There is an important distinction between PyASN1 schema and value objects. + The PyASN1 schema objects can only participate in ASN.1 schema-related + operations (e.g. defining or testing the structure of the data). Most + obvious uses of ASN.1 schema is to guide serialisation codecs whilst + encoding/decoding serialised ASN.1 contents. + + The PyASN1 value objects can **additionally** participate in many operations + involving regular Python objects (e.g. arithmetic, comprehension etc). + """ + return self._value is not noValue + + def clone(self, value=noValue, **kwargs): + """Create a modified version of |ASN.1| schema or value object. + + The `clone()` method accepts the same set arguments as |ASN.1| + class takes on instantiation except that all arguments + of the `clone()` method are optional. + + Whatever arguments are supplied, they are used to create a copy + of `self` taking precedence over the ones used to instantiate `self`. + + Note + ---- + Due to the immutable nature of the |ASN.1| object, if no arguments + are supplied, no new |ASN.1| object will be created and `self` will + be returned instead. + """ + if value is noValue: + if not kwargs: + return self + + value = self._value + + initializers = self.readOnly.copy() + initializers.update(kwargs) + + return self.__class__(value, **initializers) + + def subtype(self, value=noValue, **kwargs): + """Create a specialization of |ASN.1| schema or value object. + + The subtype relationship between ASN.1 types has no correlation with + subtype relationship between Python types. ASN.1 type is mainly identified + by its tag(s) (:py:class:`~pyasn1.type.tag.TagSet`) and value range + constraints (:py:class:`~pyasn1.type.constraint.ConstraintsIntersection`). + These ASN.1 type properties are implemented as |ASN.1| attributes. + + The `subtype()` method accepts the same set arguments as |ASN.1| + class takes on instantiation except that all parameters + of the `subtype()` method are optional. + + With the exception of the arguments described below, the rest of + supplied arguments they are used to create a copy of `self` taking + precedence over the ones used to instantiate `self`. + + The following arguments to `subtype()` create a ASN.1 subtype out of + |ASN.1| type: + + Other Parameters + ---------------- + implicitTag: :py:class:`~pyasn1.type.tag.Tag` + Implicitly apply given ASN.1 tag object to `self`'s + :py:class:`~pyasn1.type.tag.TagSet`, then use the result as + new object's ASN.1 tag(s). + + explicitTag: :py:class:`~pyasn1.type.tag.Tag` + Explicitly apply given ASN.1 tag object to `self`'s + :py:class:`~pyasn1.type.tag.TagSet`, then use the result as + new object's ASN.1 tag(s). + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Add ASN.1 constraints object to one of the `self`'s, then + use the result as new object's ASN.1 constraints. + + Returns + ------- + : + new instance of |ASN.1| schema or value object + + Note + ---- + Due to the immutable nature of the |ASN.1| object, if no arguments + are supplied, no new |ASN.1| object will be created and `self` will + be returned instead. + """ + if value is noValue: + if not kwargs: + return self + + value = self._value + + initializers = self.readOnly.copy() + + implicitTag = kwargs.pop('implicitTag', None) + if implicitTag is not None: + initializers['tagSet'] = self.tagSet.tagImplicitly(implicitTag) + + explicitTag = kwargs.pop('explicitTag', None) + if explicitTag is not None: + initializers['tagSet'] = self.tagSet.tagExplicitly(explicitTag) + + for arg, option in kwargs.items(): + initializers[arg] += option + + return self.__class__(value, **initializers) + + def prettyIn(self, value): + return value + + def prettyOut(self, value): + return str(value) + + def prettyPrint(self, scope=0): + return self.prettyOut(self._value) + + def prettyPrintType(self, scope=0): + return '%s -> %s' % (self.tagSet, self.__class__.__name__) + +# Backward compatibility +AbstractSimpleAsn1Item = SimpleAsn1Type + +# +# Constructed types: +# * There are five of them: Sequence, SequenceOf/SetOf, Set and Choice +# * ASN1 types and values are represened by Python class instances +# * Value initialization is made for defaulted components only +# * Primary method of component addressing is by-position. Data model for base +# type is Python sequence. Additional type-specific addressing methods +# may be implemented for particular types. +# * SequenceOf and SetOf types do not implement any additional methods +# * Sequence, Set and Choice types also implement by-identifier addressing +# * Sequence, Set and Choice types also implement by-asn1-type (tag) addressing +# * Sequence and Set types may include optional and defaulted +# components +# * Constructed types hold a reference to component types used for value +# verification and ordering. +# * Component type is a scalar type for SequenceOf/SetOf types and a list +# of types for Sequence/Set/Choice. +# + + +class ConstructedAsn1Type(Asn1Type): + """Base class for all constructed classes representing ASN.1 types. + + ASN.1 distinguishes types by their ability to hold other objects. + Those "nesting" types are known as *constructed* in ASN.1. + + In the user code, |ASN.1| class is normally used only for telling + ASN.1 objects from others. + + Note + ---- + For as long as ASN.1 is concerned, a way to compare ASN.1 types + is to use :meth:`isSameTypeWith` and :meth:`isSuperTypeOf` methods. + """ + + #: If :obj:`True`, requires exact component type matching, + #: otherwise subtype relation is only enforced + strictConstraints = False + + componentType = None + + # backward compatibility, unused + sizeSpec = constraint.ConstraintsIntersection() + + def __init__(self, **kwargs): + readOnly = { + 'componentType': self.componentType, + # backward compatibility, unused + 'sizeSpec': self.sizeSpec + } + + # backward compatibility: preserve legacy sizeSpec support + kwargs = self._moveSizeSpec(**kwargs) + + readOnly.update(kwargs) + + Asn1Type.__init__(self, **readOnly) + + def _moveSizeSpec(self, **kwargs): + # backward compatibility, unused + sizeSpec = kwargs.pop('sizeSpec', self.sizeSpec) + if sizeSpec: + subtypeSpec = kwargs.pop('subtypeSpec', self.subtypeSpec) + if subtypeSpec: + subtypeSpec = sizeSpec + + else: + subtypeSpec += sizeSpec + + kwargs['subtypeSpec'] = subtypeSpec + + return kwargs + + def __repr__(self): + representation = '%s %s object' % ( + self.__class__.__name__, self.isValue and 'value' or 'schema' + ) + + for attr, value in self.readOnly.items(): + if value is not noValue: + representation += ', %s=%r' % (attr, value) + + if self.isValue and self.components: + representation += ', payload [%s]' % ', '.join( + [repr(x) for x in self.components]) + + return '<%s>' % representation + + def __eq__(self, other): + return self is other or self.components == other + + def __ne__(self, other): + return self.components != other + + def __lt__(self, other): + return self.components < other + + def __le__(self, other): + return self.components <= other + + def __gt__(self, other): + return self.components > other + + def __ge__(self, other): + return self.components >= other + + if sys.version_info[0] <= 2: + def __nonzero__(self): + return bool(self.components) + else: + def __bool__(self): + return bool(self.components) + + @property + def components(self): + raise error.PyAsn1Error('Method not implemented') + + def _cloneComponentValues(self, myClone, cloneValueFlag): + pass + + def clone(self, **kwargs): + """Create a modified version of |ASN.1| schema object. + + The `clone()` method accepts the same set arguments as |ASN.1| + class takes on instantiation except that all arguments + of the `clone()` method are optional. + + Whatever arguments are supplied, they are used to create a copy + of `self` taking precedence over the ones used to instantiate `self`. + + Possible values of `self` are never copied over thus `clone()` can + only create a new schema object. + + Returns + ------- + : + new instance of |ASN.1| type/value + + Note + ---- + Due to the mutable nature of the |ASN.1| object, even if no arguments + are supplied, a new |ASN.1| object will be created and returned. + """ + cloneValueFlag = kwargs.pop('cloneValueFlag', False) + + initializers = self.readOnly.copy() + initializers.update(kwargs) + + clone = self.__class__(**initializers) + + if cloneValueFlag: + self._cloneComponentValues(clone, cloneValueFlag) + + return clone + + def subtype(self, **kwargs): + """Create a specialization of |ASN.1| schema object. + + The `subtype()` method accepts the same set arguments as |ASN.1| + class takes on instantiation except that all parameters + of the `subtype()` method are optional. + + With the exception of the arguments described below, the rest of + supplied arguments they are used to create a copy of `self` taking + precedence over the ones used to instantiate `self`. + + The following arguments to `subtype()` create a ASN.1 subtype out of + |ASN.1| type. + + Other Parameters + ---------------- + implicitTag: :py:class:`~pyasn1.type.tag.Tag` + Implicitly apply given ASN.1 tag object to `self`'s + :py:class:`~pyasn1.type.tag.TagSet`, then use the result as + new object's ASN.1 tag(s). + + explicitTag: :py:class:`~pyasn1.type.tag.Tag` + Explicitly apply given ASN.1 tag object to `self`'s + :py:class:`~pyasn1.type.tag.TagSet`, then use the result as + new object's ASN.1 tag(s). + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Add ASN.1 constraints object to one of the `self`'s, then + use the result as new object's ASN.1 constraints. + + + Returns + ------- + : + new instance of |ASN.1| type/value + + Note + ---- + Due to the mutable nature of the |ASN.1| object, even if no arguments + are supplied, a new |ASN.1| object will be created and returned. + """ + + initializers = self.readOnly.copy() + + cloneValueFlag = kwargs.pop('cloneValueFlag', False) + + implicitTag = kwargs.pop('implicitTag', None) + if implicitTag is not None: + initializers['tagSet'] = self.tagSet.tagImplicitly(implicitTag) + + explicitTag = kwargs.pop('explicitTag', None) + if explicitTag is not None: + initializers['tagSet'] = self.tagSet.tagExplicitly(explicitTag) + + for arg, option in kwargs.items(): + initializers[arg] += option + + clone = self.__class__(**initializers) + + if cloneValueFlag: + self._cloneComponentValues(clone, cloneValueFlag) + + return clone + + def getComponentByPosition(self, idx): + raise error.PyAsn1Error('Method not implemented') + + def setComponentByPosition(self, idx, value, verifyConstraints=True): + raise error.PyAsn1Error('Method not implemented') + + def setComponents(self, *args, **kwargs): + for idx, value in enumerate(args): + self[idx] = value + for k in kwargs: + self[k] = kwargs[k] + return self + + # backward compatibility + + def setDefaultComponents(self): + pass + + def getComponentType(self): + return self.componentType + + # backward compatibility, unused + def verifySizeSpec(self): + self.subtypeSpec(self) + + + # Backward compatibility +AbstractConstructedAsn1Item = ConstructedAsn1Type diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/char.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/char.py new file mode 100644 index 0000000..06074da --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/char.py @@ -0,0 +1,335 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import sys + +from pyasn1 import error +from pyasn1.type import tag +from pyasn1.type import univ + +__all__ = ['NumericString', 'PrintableString', 'TeletexString', 'T61String', 'VideotexString', + 'IA5String', 'GraphicString', 'VisibleString', 'ISO646String', + 'GeneralString', 'UniversalString', 'BMPString', 'UTF8String'] + +NoValue = univ.NoValue +noValue = univ.noValue + + +class AbstractCharacterString(univ.OctetString): + """Creates |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, + its objects are immutable and duck-type Python 2 :class:`str` or Python 3 + :class:`bytes`. When used in octet-stream context, |ASN.1| type assumes + "|encoding|" encoding. + + Keyword Args + ------------ + value: :class:`unicode`, :class:`str`, :class:`bytes` or |ASN.1| object + :class:`unicode` object (Python 2) or :class:`str` (Python 3), + alternatively :class:`str` (Python 2) or :class:`bytes` (Python 3) + representing octet-stream of serialised unicode string + (note `encoding` parameter) or |ASN.1| class instance. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + encoding: :py:class:`str` + Unicode codec ID to encode/decode :class:`unicode` (Python 2) or + :class:`str` (Python 3) the payload when |ASN.1| object is used + in octet-stream context. + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + """ + + if sys.version_info[0] <= 2: + def __str__(self): + try: + # `str` is Py2 text representation + return self._value.encode(self.encoding) + + except UnicodeEncodeError: + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeEncodeError( + "Can't encode string '%s' with codec " + "%s" % (self._value, self.encoding), exc + ) + + def __unicode__(self): + return unicode(self._value) + + def prettyIn(self, value): + try: + if isinstance(value, unicode): + return value + elif isinstance(value, str): + return value.decode(self.encoding) + elif isinstance(value, (tuple, list)): + return self.prettyIn(''.join([chr(x) for x in value])) + elif isinstance(value, univ.OctetString): + return value.asOctets().decode(self.encoding) + else: + return unicode(value) + + except (UnicodeDecodeError, LookupError): + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeDecodeError( + "Can't decode string '%s' with codec " + "%s" % (value, self.encoding), exc + ) + + def asOctets(self, padding=True): + return str(self) + + def asNumbers(self, padding=True): + return tuple([ord(x) for x in str(self)]) + + else: + def __str__(self): + # `unicode` is Py3 text representation + return str(self._value) + + def __bytes__(self): + try: + return self._value.encode(self.encoding) + except UnicodeEncodeError: + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeEncodeError( + "Can't encode string '%s' with codec " + "%s" % (self._value, self.encoding), exc + ) + + def prettyIn(self, value): + try: + if isinstance(value, str): + return value + elif isinstance(value, bytes): + return value.decode(self.encoding) + elif isinstance(value, (tuple, list)): + return self.prettyIn(bytes(value)) + elif isinstance(value, univ.OctetString): + return value.asOctets().decode(self.encoding) + else: + return str(value) + + except (UnicodeDecodeError, LookupError): + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeDecodeError( + "Can't decode string '%s' with codec " + "%s" % (value, self.encoding), exc + ) + + def asOctets(self, padding=True): + return bytes(self) + + def asNumbers(self, padding=True): + return tuple(bytes(self)) + + # + # See OctetString.prettyPrint() for the explanation + # + + def prettyOut(self, value): + return value + + def prettyPrint(self, scope=0): + # first see if subclass has its own .prettyOut() + value = self.prettyOut(self._value) + + if value is not self._value: + return value + + return AbstractCharacterString.__str__(self) + + def __reversed__(self): + return reversed(self._value) + + +class NumericString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 18) + ) + encoding = 'us-ascii' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class PrintableString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 19) + ) + encoding = 'us-ascii' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class TeletexString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 20) + ) + encoding = 'iso-8859-1' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class T61String(TeletexString): + __doc__ = TeletexString.__doc__ + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class VideotexString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 21) + ) + encoding = 'iso-8859-1' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class IA5String(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 22) + ) + encoding = 'us-ascii' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class GraphicString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 25) + ) + encoding = 'iso-8859-1' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class VisibleString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 26) + ) + encoding = 'us-ascii' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class ISO646String(VisibleString): + __doc__ = VisibleString.__doc__ + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + +class GeneralString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 27) + ) + encoding = 'iso-8859-1' + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class UniversalString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 28) + ) + encoding = "utf-32-be" + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class BMPString(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 30) + ) + encoding = "utf-16-be" + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() + + +class UTF8String(AbstractCharacterString): + __doc__ = AbstractCharacterString.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = AbstractCharacterString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 12) + ) + encoding = "utf-8" + + # Optimization for faster codec lookup + typeId = AbstractCharacterString.getTypeId() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/constraint.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/constraint.py new file mode 100644 index 0000000..8f152e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/constraint.py @@ -0,0 +1,756 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +# Original concept and code by Mike C. Fletcher. +# +import sys + +from pyasn1.type import error + +__all__ = ['SingleValueConstraint', 'ContainedSubtypeConstraint', + 'ValueRangeConstraint', 'ValueSizeConstraint', + 'PermittedAlphabetConstraint', 'InnerTypeConstraint', + 'ConstraintsExclusion', 'ConstraintsIntersection', + 'ConstraintsUnion'] + + +class AbstractConstraint(object): + + def __init__(self, *values): + self._valueMap = set() + self._setValues(values) + self.__hash = hash((self.__class__.__name__, self._values)) + + def __call__(self, value, idx=None): + if not self._values: + return + + try: + self._testValue(value, idx) + + except error.ValueConstraintError: + raise error.ValueConstraintError( + '%s failed at: %r' % (self, sys.exc_info()[1]) + ) + + def __repr__(self): + representation = '%s object' % (self.__class__.__name__) + + if self._values: + representation += ', consts %s' % ', '.join( + [repr(x) for x in self._values]) + + return '<%s>' % representation + + def __eq__(self, other): + return self is other and True or self._values == other + + def __ne__(self, other): + return self._values != other + + def __lt__(self, other): + return self._values < other + + def __le__(self, other): + return self._values <= other + + def __gt__(self, other): + return self._values > other + + def __ge__(self, other): + return self._values >= other + + if sys.version_info[0] <= 2: + def __nonzero__(self): + return self._values and True or False + else: + def __bool__(self): + return self._values and True or False + + def __hash__(self): + return self.__hash + + def _setValues(self, values): + self._values = values + + def _testValue(self, value, idx): + raise error.ValueConstraintError(value) + + # Constraints derivation logic + def getValueMap(self): + return self._valueMap + + def isSuperTypeOf(self, otherConstraint): + # TODO: fix possible comparison of set vs scalars here + return (otherConstraint is self or + not self._values or + otherConstraint == self or + self in otherConstraint.getValueMap()) + + def isSubTypeOf(self, otherConstraint): + return (otherConstraint is self or + not self or + otherConstraint == self or + otherConstraint in self._valueMap) + + +class SingleValueConstraint(AbstractConstraint): + """Create a SingleValueConstraint object. + + The SingleValueConstraint satisfies any value that + is present in the set of permitted values. + + Objects of this type are iterable (emitting constraint values) and + can act as operands for some arithmetic operations e.g. addition + and subtraction. The latter can be used for combining multiple + SingleValueConstraint objects into one. + + The SingleValueConstraint object can be applied to + any ASN.1 type. + + Parameters + ---------- + *values: :class:`int` + Full set of values permitted by this constraint object. + + Examples + -------- + .. code-block:: python + + class DivisorOfSix(Integer): + ''' + ASN.1 specification: + + Divisor-Of-6 ::= INTEGER (1 | 2 | 3 | 6) + ''' + subtypeSpec = SingleValueConstraint(1, 2, 3, 6) + + # this will succeed + divisor_of_six = DivisorOfSix(1) + + # this will raise ValueConstraintError + divisor_of_six = DivisorOfSix(7) + """ + def _setValues(self, values): + self._values = values + self._set = set(values) + + def _testValue(self, value, idx): + if value not in self._set: + raise error.ValueConstraintError(value) + + # Constrains can be merged or reduced + + def __contains__(self, item): + return item in self._set + + def __iter__(self): + return iter(self._set) + + def __sub__(self, constraint): + return self.__class__(*(self._set.difference(constraint))) + + def __add__(self, constraint): + return self.__class__(*(self._set.union(constraint))) + + def __sub__(self, constraint): + return self.__class__(*(self._set.difference(constraint))) + + +class ContainedSubtypeConstraint(AbstractConstraint): + """Create a ContainedSubtypeConstraint object. + + The ContainedSubtypeConstraint satisfies any value that + is present in the set of permitted values and also + satisfies included constraints. + + The ContainedSubtypeConstraint object can be applied to + any ASN.1 type. + + Parameters + ---------- + *values: + Full set of values and constraint objects permitted + by this constraint object. + + Examples + -------- + .. code-block:: python + + class DivisorOfEighteen(Integer): + ''' + ASN.1 specification: + + Divisors-of-18 ::= INTEGER (INCLUDES Divisors-of-6 | 9 | 18) + ''' + subtypeSpec = ContainedSubtypeConstraint( + SingleValueConstraint(1, 2, 3, 6), 9, 18 + ) + + # this will succeed + divisor_of_eighteen = DivisorOfEighteen(9) + + # this will raise ValueConstraintError + divisor_of_eighteen = DivisorOfEighteen(10) + """ + def _testValue(self, value, idx): + for constraint in self._values: + if isinstance(constraint, AbstractConstraint): + constraint(value, idx) + elif value not in self._set: + raise error.ValueConstraintError(value) + + +class ValueRangeConstraint(AbstractConstraint): + """Create a ValueRangeConstraint object. + + The ValueRangeConstraint satisfies any value that + falls in the range of permitted values. + + The ValueRangeConstraint object can only be applied + to :class:`~pyasn1.type.univ.Integer` and + :class:`~pyasn1.type.univ.Real` types. + + Parameters + ---------- + start: :class:`int` + Minimum permitted value in the range (inclusive) + + end: :class:`int` + Maximum permitted value in the range (inclusive) + + Examples + -------- + .. code-block:: python + + class TeenAgeYears(Integer): + ''' + ASN.1 specification: + + TeenAgeYears ::= INTEGER (13 .. 19) + ''' + subtypeSpec = ValueRangeConstraint(13, 19) + + # this will succeed + teen_year = TeenAgeYears(18) + + # this will raise ValueConstraintError + teen_year = TeenAgeYears(20) + """ + def _testValue(self, value, idx): + if value < self.start or value > self.stop: + raise error.ValueConstraintError(value) + + def _setValues(self, values): + if len(values) != 2: + raise error.PyAsn1Error( + '%s: bad constraint values' % (self.__class__.__name__,) + ) + self.start, self.stop = values + if self.start > self.stop: + raise error.PyAsn1Error( + '%s: screwed constraint values (start > stop): %s > %s' % ( + self.__class__.__name__, + self.start, self.stop + ) + ) + AbstractConstraint._setValues(self, values) + + +class ValueSizeConstraint(ValueRangeConstraint): + """Create a ValueSizeConstraint object. + + The ValueSizeConstraint satisfies any value for + as long as its size falls within the range of + permitted sizes. + + The ValueSizeConstraint object can be applied + to :class:`~pyasn1.type.univ.BitString`, + :class:`~pyasn1.type.univ.OctetString` (including + all :ref:`character ASN.1 types <type.char>`), + :class:`~pyasn1.type.univ.SequenceOf` + and :class:`~pyasn1.type.univ.SetOf` types. + + Parameters + ---------- + minimum: :class:`int` + Minimum permitted size of the value (inclusive) + + maximum: :class:`int` + Maximum permitted size of the value (inclusive) + + Examples + -------- + .. code-block:: python + + class BaseballTeamRoster(SetOf): + ''' + ASN.1 specification: + + BaseballTeamRoster ::= SET SIZE (1..25) OF PlayerNames + ''' + componentType = PlayerNames() + subtypeSpec = ValueSizeConstraint(1, 25) + + # this will succeed + team = BaseballTeamRoster() + team.extend(['Jan', 'Matej']) + encode(team) + + # this will raise ValueConstraintError + team = BaseballTeamRoster() + team.extend(['Jan'] * 26) + encode(team) + + Note + ---- + Whenever ValueSizeConstraint is applied to mutable types + (e.g. :class:`~pyasn1.type.univ.SequenceOf`, + :class:`~pyasn1.type.univ.SetOf`), constraint + validation only happens at the serialisation phase rather + than schema instantiation phase (as it is with immutable + types). + """ + def _testValue(self, value, idx): + valueSize = len(value) + if valueSize < self.start or valueSize > self.stop: + raise error.ValueConstraintError(value) + + +class PermittedAlphabetConstraint(SingleValueConstraint): + """Create a PermittedAlphabetConstraint object. + + The PermittedAlphabetConstraint satisfies any character + string for as long as all its characters are present in + the set of permitted characters. + + Objects of this type are iterable (emitting constraint values) and + can act as operands for some arithmetic operations e.g. addition + and subtraction. + + The PermittedAlphabetConstraint object can only be applied + to the :ref:`character ASN.1 types <type.char>` such as + :class:`~pyasn1.type.char.IA5String`. + + Parameters + ---------- + *alphabet: :class:`str` + Full set of characters permitted by this constraint object. + + Example + ------- + .. code-block:: python + + class BooleanValue(IA5String): + ''' + ASN.1 specification: + + BooleanValue ::= IA5String (FROM ('T' | 'F')) + ''' + subtypeSpec = PermittedAlphabetConstraint('T', 'F') + + # this will succeed + truth = BooleanValue('T') + truth = BooleanValue('TF') + + # this will raise ValueConstraintError + garbage = BooleanValue('TAF') + + ASN.1 `FROM ... EXCEPT ...` clause can be modelled by combining multiple + PermittedAlphabetConstraint objects into one: + + Example + ------- + .. code-block:: python + + class Lipogramme(IA5String): + ''' + ASN.1 specification: + + Lipogramme ::= + IA5String (FROM (ALL EXCEPT ("e"|"E"))) + ''' + subtypeSpec = ( + PermittedAlphabetConstraint(*string.printable) - + PermittedAlphabetConstraint('e', 'E') + ) + + # this will succeed + lipogramme = Lipogramme('A work of fiction?') + + # this will raise ValueConstraintError + lipogramme = Lipogramme('Eel') + + Note + ---- + Although `ConstraintsExclusion` object could seemingly be used for this + purpose, practically, for it to work, it needs to represent its operand + constraints as sets and intersect one with the other. That would require + the insight into the constraint values (and their types) that are otherwise + hidden inside the constraint object. + + Therefore it's more practical to model `EXCEPT` clause at + `PermittedAlphabetConstraint` level instead. + """ + def _setValues(self, values): + self._values = values + self._set = set(values) + + def _testValue(self, value, idx): + if not self._set.issuperset(value): + raise error.ValueConstraintError(value) + + +class ComponentPresentConstraint(AbstractConstraint): + """Create a ComponentPresentConstraint object. + + The ComponentPresentConstraint is only satisfied when the value + is not `None`. + + The ComponentPresentConstraint object is typically used with + `WithComponentsConstraint`. + + Examples + -------- + .. code-block:: python + + present = ComponentPresentConstraint() + + # this will succeed + present('whatever') + + # this will raise ValueConstraintError + present(None) + """ + def _setValues(self, values): + self._values = ('<must be present>',) + + if values: + raise error.PyAsn1Error('No arguments expected') + + def _testValue(self, value, idx): + if value is None: + raise error.ValueConstraintError( + 'Component is not present:') + + +class ComponentAbsentConstraint(AbstractConstraint): + """Create a ComponentAbsentConstraint object. + + The ComponentAbsentConstraint is only satisfied when the value + is `None`. + + The ComponentAbsentConstraint object is typically used with + `WithComponentsConstraint`. + + Examples + -------- + .. code-block:: python + + absent = ComponentAbsentConstraint() + + # this will succeed + absent(None) + + # this will raise ValueConstraintError + absent('whatever') + """ + def _setValues(self, values): + self._values = ('<must be absent>',) + + if values: + raise error.PyAsn1Error('No arguments expected') + + def _testValue(self, value, idx): + if value is not None: + raise error.ValueConstraintError( + 'Component is not absent: %r' % value) + + +class WithComponentsConstraint(AbstractConstraint): + """Create a WithComponentsConstraint object. + + The `WithComponentsConstraint` satisfies any mapping object that has + constrained fields present or absent, what is indicated by + `ComponentPresentConstraint` and `ComponentAbsentConstraint` + objects respectively. + + The `WithComponentsConstraint` object is typically applied + to :class:`~pyasn1.type.univ.Set` or + :class:`~pyasn1.type.univ.Sequence` types. + + Parameters + ---------- + *fields: :class:`tuple` + Zero or more tuples of (`field`, `constraint`) indicating constrained + fields. + + Notes + ----- + On top of the primary use of `WithComponentsConstraint` (ensuring presence + or absence of particular components of a :class:`~pyasn1.type.univ.Set` or + :class:`~pyasn1.type.univ.Sequence`), it is also possible to pass any other + constraint objects or their combinations. In case of scalar fields, these + constraints will be verified in addition to the constraints belonging to + scalar components themselves. However, formally, these additional + constraints do not change the type of these ASN.1 objects. + + Examples + -------- + + .. code-block:: python + + class Item(Sequence): # Set is similar + ''' + ASN.1 specification: + + Item ::= SEQUENCE { + id INTEGER OPTIONAL, + name OCTET STRING OPTIONAL + } WITH COMPONENTS id PRESENT, name ABSENT | id ABSENT, name PRESENT + ''' + componentType = NamedTypes( + OptionalNamedType('id', Integer()), + OptionalNamedType('name', OctetString()) + ) + withComponents = ConstraintsUnion( + WithComponentsConstraint( + ('id', ComponentPresentConstraint()), + ('name', ComponentAbsentConstraint()) + ), + WithComponentsConstraint( + ('id', ComponentAbsentConstraint()), + ('name', ComponentPresentConstraint()) + ) + ) + + item = Item() + + # This will succeed + item['id'] = 1 + + # This will succeed + item.reset() + item['name'] = 'John' + + # This will fail (on encoding) + item.reset() + descr['id'] = 1 + descr['name'] = 'John' + """ + def _testValue(self, value, idx): + for field, constraint in self._values: + constraint(value.get(field)) + + def _setValues(self, values): + AbstractConstraint._setValues(self, values) + + +# This is a bit kludgy, meaning two op modes within a single constraint +class InnerTypeConstraint(AbstractConstraint): + """Value must satisfy the type and presence constraints""" + + def _testValue(self, value, idx): + if self.__singleTypeConstraint: + self.__singleTypeConstraint(value) + elif self.__multipleTypeConstraint: + if idx not in self.__multipleTypeConstraint: + raise error.ValueConstraintError(value) + constraint, status = self.__multipleTypeConstraint[idx] + if status == 'ABSENT': # XXX presence is not checked! + raise error.ValueConstraintError(value) + constraint(value) + + def _setValues(self, values): + self.__multipleTypeConstraint = {} + self.__singleTypeConstraint = None + for v in values: + if isinstance(v, tuple): + self.__multipleTypeConstraint[v[0]] = v[1], v[2] + else: + self.__singleTypeConstraint = v + AbstractConstraint._setValues(self, values) + + +# Logic operations on constraints + +class ConstraintsExclusion(AbstractConstraint): + """Create a ConstraintsExclusion logic operator object. + + The ConstraintsExclusion logic operator succeeds when the + value does *not* satisfy the operand constraint. + + The ConstraintsExclusion object can be applied to + any constraint and logic operator object. + + Parameters + ---------- + *constraints: + Constraint or logic operator objects. + + Examples + -------- + .. code-block:: python + + class LuckyNumber(Integer): + subtypeSpec = ConstraintsExclusion( + SingleValueConstraint(13) + ) + + # this will succeed + luckyNumber = LuckyNumber(12) + + # this will raise ValueConstraintError + luckyNumber = LuckyNumber(13) + + Note + ---- + The `FROM ... EXCEPT ...` ASN.1 clause should be modeled by combining + constraint objects into one. See `PermittedAlphabetConstraint` for more + information. + """ + def _testValue(self, value, idx): + for constraint in self._values: + try: + constraint(value, idx) + + except error.ValueConstraintError: + continue + + raise error.ValueConstraintError(value) + + def _setValues(self, values): + AbstractConstraint._setValues(self, values) + + +class AbstractConstraintSet(AbstractConstraint): + + def __getitem__(self, idx): + return self._values[idx] + + def __iter__(self): + return iter(self._values) + + def __add__(self, value): + return self.__class__(*(self._values + (value,))) + + def __radd__(self, value): + return self.__class__(*((value,) + self._values)) + + def __len__(self): + return len(self._values) + + # Constraints inclusion in sets + + def _setValues(self, values): + self._values = values + for constraint in values: + if constraint: + self._valueMap.add(constraint) + self._valueMap.update(constraint.getValueMap()) + + +class ConstraintsIntersection(AbstractConstraintSet): + """Create a ConstraintsIntersection logic operator object. + + The ConstraintsIntersection logic operator only succeeds + if *all* its operands succeed. + + The ConstraintsIntersection object can be applied to + any constraint and logic operator objects. + + The ConstraintsIntersection object duck-types the immutable + container object like Python :py:class:`tuple`. + + Parameters + ---------- + *constraints: + Constraint or logic operator objects. + + Examples + -------- + .. code-block:: python + + class CapitalAndSmall(IA5String): + ''' + ASN.1 specification: + + CapitalAndSmall ::= + IA5String (FROM ("A".."Z"|"a".."z")) + ''' + subtypeSpec = ConstraintsIntersection( + PermittedAlphabetConstraint('A', 'Z'), + PermittedAlphabetConstraint('a', 'z') + ) + + # this will succeed + capital_and_small = CapitalAndSmall('Hello') + + # this will raise ValueConstraintError + capital_and_small = CapitalAndSmall('hello') + """ + def _testValue(self, value, idx): + for constraint in self._values: + constraint(value, idx) + + +class ConstraintsUnion(AbstractConstraintSet): + """Create a ConstraintsUnion logic operator object. + + The ConstraintsUnion logic operator succeeds if + *at least* a single operand succeeds. + + The ConstraintsUnion object can be applied to + any constraint and logic operator objects. + + The ConstraintsUnion object duck-types the immutable + container object like Python :py:class:`tuple`. + + Parameters + ---------- + *constraints: + Constraint or logic operator objects. + + Examples + -------- + .. code-block:: python + + class CapitalOrSmall(IA5String): + ''' + ASN.1 specification: + + CapitalOrSmall ::= + IA5String (FROM ("A".."Z") | FROM ("a".."z")) + ''' + subtypeSpec = ConstraintsUnion( + PermittedAlphabetConstraint('A', 'Z'), + PermittedAlphabetConstraint('a', 'z') + ) + + # this will succeed + capital_or_small = CapitalAndSmall('Hello') + + # this will raise ValueConstraintError + capital_or_small = CapitalOrSmall('hello!') + """ + def _testValue(self, value, idx): + for constraint in self._values: + try: + constraint(value, idx) + except error.ValueConstraintError: + pass + else: + return + + raise error.ValueConstraintError( + 'all of %s failed for "%s"' % (self._values, value) + ) + +# TODO: +# refactor InnerTypeConstraint +# add tests for type check +# implement other constraint types +# make constraint validation easy to skip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/error.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/error.py new file mode 100644 index 0000000..80fcf3b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/error.py @@ -0,0 +1,11 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1.error import PyAsn1Error + + +class ValueConstraintError(PyAsn1Error): + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedtype.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedtype.py new file mode 100644 index 0000000..cbc1429 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedtype.py @@ -0,0 +1,561 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import sys + +from pyasn1 import error +from pyasn1.type import tag +from pyasn1.type import tagmap + +__all__ = ['NamedType', 'OptionalNamedType', 'DefaultedNamedType', + 'NamedTypes'] + +try: + any + +except NameError: + any = lambda x: bool(filter(bool, x)) + + +class NamedType(object): + """Create named field object for a constructed ASN.1 type. + + The |NamedType| object represents a single name and ASN.1 type of a constructed ASN.1 type. + + |NamedType| objects are immutable and duck-type Python :class:`tuple` objects + holding *name* and *asn1Object* components. + + Parameters + ---------- + name: :py:class:`str` + Field name + + asn1Object: + ASN.1 type object + """ + isOptional = False + isDefaulted = False + + def __init__(self, name, asn1Object, openType=None): + self.__name = name + self.__type = asn1Object + self.__nameAndType = name, asn1Object + self.__openType = openType + + def __repr__(self): + representation = '%s=%r' % (self.name, self.asn1Object) + + if self.openType: + representation += ', open type %r' % self.openType + + return '<%s object, type %s>' % ( + self.__class__.__name__, representation) + + def __eq__(self, other): + return self.__nameAndType == other + + def __ne__(self, other): + return self.__nameAndType != other + + def __lt__(self, other): + return self.__nameAndType < other + + def __le__(self, other): + return self.__nameAndType <= other + + def __gt__(self, other): + return self.__nameAndType > other + + def __ge__(self, other): + return self.__nameAndType >= other + + def __hash__(self): + return hash(self.__nameAndType) + + def __getitem__(self, idx): + return self.__nameAndType[idx] + + def __iter__(self): + return iter(self.__nameAndType) + + @property + def name(self): + return self.__name + + @property + def asn1Object(self): + return self.__type + + @property + def openType(self): + return self.__openType + + # Backward compatibility + + def getName(self): + return self.name + + def getType(self): + return self.asn1Object + + +class OptionalNamedType(NamedType): + __doc__ = NamedType.__doc__ + + isOptional = True + + +class DefaultedNamedType(NamedType): + __doc__ = NamedType.__doc__ + + isDefaulted = True + + +class NamedTypes(object): + """Create a collection of named fields for a constructed ASN.1 type. + + The NamedTypes object represents a collection of named fields of a constructed ASN.1 type. + + *NamedTypes* objects are immutable and duck-type Python :class:`dict` objects + holding *name* as keys and ASN.1 type object as values. + + Parameters + ---------- + *namedTypes: :class:`~pyasn1.type.namedtype.NamedType` + + Examples + -------- + + .. code-block:: python + + class Description(Sequence): + ''' + ASN.1 specification: + + Description ::= SEQUENCE { + surname IA5String, + first-name IA5String OPTIONAL, + age INTEGER DEFAULT 40 + } + ''' + componentType = NamedTypes( + NamedType('surname', IA5String()), + OptionalNamedType('first-name', IA5String()), + DefaultedNamedType('age', Integer(40)) + ) + + descr = Description() + descr['surname'] = 'Smith' + descr['first-name'] = 'John' + """ + def __init__(self, *namedTypes, **kwargs): + self.__namedTypes = namedTypes + self.__namedTypesLen = len(self.__namedTypes) + self.__minTagSet = self.__computeMinTagSet() + self.__nameToPosMap = self.__computeNameToPosMap() + self.__tagToPosMap = self.__computeTagToPosMap() + self.__ambiguousTypes = 'terminal' not in kwargs and self.__computeAmbiguousTypes() or {} + self.__uniqueTagMap = self.__computeTagMaps(unique=True) + self.__nonUniqueTagMap = self.__computeTagMaps(unique=False) + self.__hasOptionalOrDefault = any([True for namedType in self.__namedTypes + if namedType.isDefaulted or namedType.isOptional]) + self.__hasOpenTypes = any([True for namedType in self.__namedTypes + if namedType.openType]) + + self.__requiredComponents = frozenset( + [idx for idx, nt in enumerate(self.__namedTypes) if not nt.isOptional and not nt.isDefaulted] + ) + self.__keys = frozenset([namedType.name for namedType in self.__namedTypes]) + self.__values = tuple([namedType.asn1Object for namedType in self.__namedTypes]) + self.__items = tuple([(namedType.name, namedType.asn1Object) for namedType in self.__namedTypes]) + + def __repr__(self): + representation = ', '.join(['%r' % x for x in self.__namedTypes]) + return '<%s object, types %s>' % ( + self.__class__.__name__, representation) + + def __eq__(self, other): + return self.__namedTypes == other + + def __ne__(self, other): + return self.__namedTypes != other + + def __lt__(self, other): + return self.__namedTypes < other + + def __le__(self, other): + return self.__namedTypes <= other + + def __gt__(self, other): + return self.__namedTypes > other + + def __ge__(self, other): + return self.__namedTypes >= other + + def __hash__(self): + return hash(self.__namedTypes) + + def __getitem__(self, idx): + try: + return self.__namedTypes[idx] + + except TypeError: + return self.__namedTypes[self.__nameToPosMap[idx]] + + def __contains__(self, key): + return key in self.__nameToPosMap + + def __iter__(self): + return (x[0] for x in self.__namedTypes) + + if sys.version_info[0] <= 2: + def __nonzero__(self): + return self.__namedTypesLen > 0 + else: + def __bool__(self): + return self.__namedTypesLen > 0 + + def __len__(self): + return self.__namedTypesLen + + # Python dict protocol + + def values(self): + return self.__values + + def keys(self): + return self.__keys + + def items(self): + return self.__items + + def clone(self): + return self.__class__(*self.__namedTypes) + + class PostponedError(object): + def __init__(self, errorMsg): + self.__errorMsg = errorMsg + + def __getitem__(self, item): + raise error.PyAsn1Error(self.__errorMsg) + + def __computeTagToPosMap(self): + tagToPosMap = {} + for idx, namedType in enumerate(self.__namedTypes): + tagMap = namedType.asn1Object.tagMap + if isinstance(tagMap, NamedTypes.PostponedError): + return tagMap + if not tagMap: + continue + for _tagSet in tagMap.presentTypes: + if _tagSet in tagToPosMap: + return NamedTypes.PostponedError('Duplicate component tag %s at %s' % (_tagSet, namedType)) + tagToPosMap[_tagSet] = idx + + return tagToPosMap + + def __computeNameToPosMap(self): + nameToPosMap = {} + for idx, namedType in enumerate(self.__namedTypes): + if namedType.name in nameToPosMap: + return NamedTypes.PostponedError('Duplicate component name %s at %s' % (namedType.name, namedType)) + nameToPosMap[namedType.name] = idx + + return nameToPosMap + + def __computeAmbiguousTypes(self): + ambiguousTypes = {} + partialAmbiguousTypes = () + for idx, namedType in reversed(tuple(enumerate(self.__namedTypes))): + if namedType.isOptional or namedType.isDefaulted: + partialAmbiguousTypes = (namedType,) + partialAmbiguousTypes + else: + partialAmbiguousTypes = (namedType,) + if len(partialAmbiguousTypes) == len(self.__namedTypes): + ambiguousTypes[idx] = self + else: + ambiguousTypes[idx] = NamedTypes(*partialAmbiguousTypes, **dict(terminal=True)) + return ambiguousTypes + + def getTypeByPosition(self, idx): + """Return ASN.1 type object by its position in fields set. + + Parameters + ---------- + idx: :py:class:`int` + Field index + + Returns + ------- + : + ASN.1 type + + Raises + ------ + ~pyasn1.error.PyAsn1Error + If given position is out of fields range + """ + try: + return self.__namedTypes[idx].asn1Object + + except IndexError: + raise error.PyAsn1Error('Type position out of range') + + def getPositionByType(self, tagSet): + """Return field position by its ASN.1 type. + + Parameters + ---------- + tagSet: :class:`~pysnmp.type.tag.TagSet` + ASN.1 tag set distinguishing one ASN.1 type from others. + + Returns + ------- + : :py:class:`int` + ASN.1 type position in fields set + + Raises + ------ + ~pyasn1.error.PyAsn1Error + If *tagSet* is not present or ASN.1 types are not unique within callee *NamedTypes* + """ + try: + return self.__tagToPosMap[tagSet] + + except KeyError: + raise error.PyAsn1Error('Type %s not found' % (tagSet,)) + + def getNameByPosition(self, idx): + """Return field name by its position in fields set. + + Parameters + ---------- + idx: :py:class:`idx` + Field index + + Returns + ------- + : :py:class:`str` + Field name + + Raises + ------ + ~pyasn1.error.PyAsn1Error + If given field name is not present in callee *NamedTypes* + """ + try: + return self.__namedTypes[idx].name + + except IndexError: + raise error.PyAsn1Error('Type position out of range') + + def getPositionByName(self, name): + """Return field position by filed name. + + Parameters + ---------- + name: :py:class:`str` + Field name + + Returns + ------- + : :py:class:`int` + Field position in fields set + + Raises + ------ + ~pyasn1.error.PyAsn1Error + If *name* is not present or not unique within callee *NamedTypes* + """ + try: + return self.__nameToPosMap[name] + + except KeyError: + raise error.PyAsn1Error('Name %s not found' % (name,)) + + def getTagMapNearPosition(self, idx): + """Return ASN.1 types that are allowed at or past given field position. + + Some ASN.1 serialisation allow for skipping optional and defaulted fields. + Some constructed ASN.1 types allow reordering of the fields. When recovering + such objects it may be important to know which types can possibly be + present at any given position in the field sets. + + Parameters + ---------- + idx: :py:class:`int` + Field index + + Returns + ------- + : :class:`~pyasn1.type.tagmap.TagMap` + Map if ASN.1 types allowed at given field position + + Raises + ------ + ~pyasn1.error.PyAsn1Error + If given position is out of fields range + """ + try: + return self.__ambiguousTypes[idx].tagMap + + except KeyError: + raise error.PyAsn1Error('Type position out of range') + + def getPositionNearType(self, tagSet, idx): + """Return the closest field position where given ASN.1 type is allowed. + + Some ASN.1 serialisation allow for skipping optional and defaulted fields. + Some constructed ASN.1 types allow reordering of the fields. When recovering + such objects it may be important to know at which field position, in field set, + given *tagSet* is allowed at or past *idx* position. + + Parameters + ---------- + tagSet: :class:`~pyasn1.type.tag.TagSet` + ASN.1 type which field position to look up + + idx: :py:class:`int` + Field position at or past which to perform ASN.1 type look up + + Returns + ------- + : :py:class:`int` + Field position in fields set + + Raises + ------ + ~pyasn1.error.PyAsn1Error + If *tagSet* is not present or not unique within callee *NamedTypes* + or *idx* is out of fields range + """ + try: + return idx + self.__ambiguousTypes[idx].getPositionByType(tagSet) + + except KeyError: + raise error.PyAsn1Error('Type position out of range') + + def __computeMinTagSet(self): + minTagSet = None + for namedType in self.__namedTypes: + asn1Object = namedType.asn1Object + + try: + tagSet = asn1Object.minTagSet + + except AttributeError: + tagSet = asn1Object.tagSet + + if minTagSet is None or tagSet < minTagSet: + minTagSet = tagSet + + return minTagSet or tag.TagSet() + + @property + def minTagSet(self): + """Return the minimal TagSet among ASN.1 type in callee *NamedTypes*. + + Some ASN.1 types/serialisation protocols require ASN.1 types to be + arranged based on their numerical tag value. The *minTagSet* property + returns that. + + Returns + ------- + : :class:`~pyasn1.type.tagset.TagSet` + Minimal TagSet among ASN.1 types in callee *NamedTypes* + """ + return self.__minTagSet + + def __computeTagMaps(self, unique): + presentTypes = {} + skipTypes = {} + defaultType = None + for namedType in self.__namedTypes: + tagMap = namedType.asn1Object.tagMap + if isinstance(tagMap, NamedTypes.PostponedError): + return tagMap + for tagSet in tagMap: + if unique and tagSet in presentTypes: + return NamedTypes.PostponedError('Non-unique tagSet %s of %s at %s' % (tagSet, namedType, self)) + presentTypes[tagSet] = namedType.asn1Object + skipTypes.update(tagMap.skipTypes) + + if defaultType is None: + defaultType = tagMap.defaultType + elif tagMap.defaultType is not None: + return NamedTypes.PostponedError('Duplicate default ASN.1 type at %s' % (self,)) + + return tagmap.TagMap(presentTypes, skipTypes, defaultType) + + @property + def tagMap(self): + """Return a *TagMap* object from tags and types recursively. + + Return a :class:`~pyasn1.type.tagmap.TagMap` object by + combining tags from *TagMap* objects of children types and + associating them with their immediate child type. + + Example + ------- + .. code-block:: python + + OuterType ::= CHOICE { + innerType INTEGER + } + + Calling *.tagMap* on *OuterType* will yield a map like this: + + .. code-block:: python + + Integer.tagSet -> Choice + """ + return self.__nonUniqueTagMap + + @property + def tagMapUnique(self): + """Return a *TagMap* object from unique tags and types recursively. + + Return a :class:`~pyasn1.type.tagmap.TagMap` object by + combining tags from *TagMap* objects of children types and + associating them with their immediate child type. + + Example + ------- + .. code-block:: python + + OuterType ::= CHOICE { + innerType INTEGER + } + + Calling *.tagMapUnique* on *OuterType* will yield a map like this: + + .. code-block:: python + + Integer.tagSet -> Choice + + Note + ---- + + Duplicate *TagSet* objects found in the tree of children + types would cause error. + """ + return self.__uniqueTagMap + + @property + def hasOptionalOrDefault(self): + return self.__hasOptionalOrDefault + + @property + def hasOpenTypes(self): + return self.__hasOpenTypes + + @property + def namedTypes(self): + return tuple(self.__namedTypes) + + @property + def requiredComponents(self): + return self.__requiredComponents diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedval.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedval.py new file mode 100644 index 0000000..4247597 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/namedval.py @@ -0,0 +1,192 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +# ASN.1 named integers +# +from pyasn1 import error + +__all__ = ['NamedValues'] + + +class NamedValues(object): + """Create named values object. + + The |NamedValues| object represents a collection of string names + associated with numeric IDs. These objects are used for giving + names to otherwise numerical values. + + |NamedValues| objects are immutable and duck-type Python + :class:`dict` object mapping ID to name and vice-versa. + + Parameters + ---------- + *args: variable number of two-element :py:class:`tuple` + + name: :py:class:`str` + Value label + + value: :py:class:`int` + Numeric value + + Keyword Args + ------------ + name: :py:class:`str` + Value label + + value: :py:class:`int` + Numeric value + + Examples + -------- + + .. code-block:: pycon + + >>> nv = NamedValues('a', 'b', ('c', 0), d=1) + >>> nv + >>> {'c': 0, 'd': 1, 'a': 2, 'b': 3} + >>> nv[0] + 'c' + >>> nv['a'] + 2 + """ + def __init__(self, *args, **kwargs): + self.__names = {} + self.__numbers = {} + + anonymousNames = [] + + for namedValue in args: + if isinstance(namedValue, (tuple, list)): + try: + name, number = namedValue + + except ValueError: + raise error.PyAsn1Error('Not a proper attribute-value pair %r' % (namedValue,)) + + else: + anonymousNames.append(namedValue) + continue + + if name in self.__names: + raise error.PyAsn1Error('Duplicate name %s' % (name,)) + + if number in self.__numbers: + raise error.PyAsn1Error('Duplicate number %s=%s' % (name, number)) + + self.__names[name] = number + self.__numbers[number] = name + + for name, number in kwargs.items(): + if name in self.__names: + raise error.PyAsn1Error('Duplicate name %s' % (name,)) + + if number in self.__numbers: + raise error.PyAsn1Error('Duplicate number %s=%s' % (name, number)) + + self.__names[name] = number + self.__numbers[number] = name + + if anonymousNames: + + number = self.__numbers and max(self.__numbers) + 1 or 0 + + for name in anonymousNames: + + if name in self.__names: + raise error.PyAsn1Error('Duplicate name %s' % (name,)) + + self.__names[name] = number + self.__numbers[number] = name + + number += 1 + + def __repr__(self): + representation = ', '.join(['%s=%d' % x for x in self.items()]) + + if len(representation) > 64: + representation = representation[:32] + '...' + representation[-32:] + + return '<%s object, enums %s>' % ( + self.__class__.__name__, representation) + + def __eq__(self, other): + return dict(self) == other + + def __ne__(self, other): + return dict(self) != other + + def __lt__(self, other): + return dict(self) < other + + def __le__(self, other): + return dict(self) <= other + + def __gt__(self, other): + return dict(self) > other + + def __ge__(self, other): + return dict(self) >= other + + def __hash__(self): + return hash(self.items()) + + # Python dict protocol (read-only) + + def __getitem__(self, key): + try: + return self.__numbers[key] + + except KeyError: + return self.__names[key] + + def __len__(self): + return len(self.__names) + + def __contains__(self, key): + return key in self.__names or key in self.__numbers + + def __iter__(self): + return iter(self.__names) + + def values(self): + return iter(self.__numbers) + + def keys(self): + return iter(self.__names) + + def items(self): + for name in self.__names: + yield name, self.__names[name] + + # support merging + + def __add__(self, namedValues): + return self.__class__(*tuple(self.items()) + tuple(namedValues.items())) + + # XXX clone/subtype? + + def clone(self, *args, **kwargs): + new = self.__class__(*args, **kwargs) + return self + new + + # legacy protocol + + def getName(self, value): + if value in self.__numbers: + return self.__numbers[value] + + def getValue(self, name): + if name in self.__names: + return self.__names[name] + + def getValues(self, *names): + try: + return [self.__names[name] for name in names] + + except KeyError: + raise error.PyAsn1Error( + 'Unknown bit identifier(s): %s' % (set(names).difference(self.__names),) + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/opentype.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/opentype.py new file mode 100644 index 0000000..29645f0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/opentype.py @@ -0,0 +1,104 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# + +__all__ = ['OpenType'] + + +class OpenType(object): + """Create ASN.1 type map indexed by a value + + The *OpenType* object models an untyped field of a constructed ASN.1 + type. In ASN.1 syntax it is usually represented by the + `ANY DEFINED BY` for scalars or `SET OF ANY DEFINED BY`, + `SEQUENCE OF ANY DEFINED BY` for container types clauses. Typically + used together with :class:`~pyasn1.type.univ.Any` object. + + OpenType objects duck-type a read-only Python :class:`dict` objects, + however the passed `typeMap` is not copied, but stored by reference. + That means the user can manipulate `typeMap` at run time having this + reflected on *OpenType* object behavior. + + The |OpenType| class models an untyped field of a constructed ASN.1 + type. In ASN.1 syntax it is usually represented by the + `ANY DEFINED BY` for scalars or `SET OF ANY DEFINED BY`, + `SEQUENCE OF ANY DEFINED BY` for container types clauses. Typically + used with :class:`~pyasn1.type.univ.Any` type. + + Parameters + ---------- + name: :py:class:`str` + Field name + + typeMap: :py:class:`dict` + A map of value->ASN.1 type. It's stored by reference and can be + mutated later to register new mappings. + + Examples + -------- + + For untyped scalars: + + .. code-block:: python + + openType = OpenType( + 'id', {1: Integer(), + 2: OctetString()} + ) + Sequence( + componentType=NamedTypes( + NamedType('id', Integer()), + NamedType('blob', Any(), openType=openType) + ) + ) + + For untyped `SET OF` or `SEQUENCE OF` vectors: + + .. code-block:: python + + openType = OpenType( + 'id', {1: Integer(), + 2: OctetString()} + ) + Sequence( + componentType=NamedTypes( + NamedType('id', Integer()), + NamedType('blob', SetOf(componentType=Any()), + openType=openType) + ) + ) + """ + + def __init__(self, name, typeMap=None): + self.__name = name + if typeMap is None: + self.__typeMap = {} + else: + self.__typeMap = typeMap + + @property + def name(self): + return self.__name + + # Python dict protocol + + def values(self): + return self.__typeMap.values() + + def keys(self): + return self.__typeMap.keys() + + def items(self): + return self.__typeMap.items() + + def __contains__(self, key): + return key in self.__typeMap + + def __getitem__(self, key): + return self.__typeMap[key] + + def __iter__(self): + return iter(self.__typeMap) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tag.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tag.py new file mode 100644 index 0000000..b88a734 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tag.py @@ -0,0 +1,335 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import error + +__all__ = ['tagClassUniversal', 'tagClassApplication', 'tagClassContext', + 'tagClassPrivate', 'tagFormatSimple', 'tagFormatConstructed', + 'tagCategoryImplicit', 'tagCategoryExplicit', + 'tagCategoryUntagged', 'Tag', 'TagSet'] + +#: Identifier for ASN.1 class UNIVERSAL +tagClassUniversal = 0x00 + +#: Identifier for ASN.1 class APPLICATION +tagClassApplication = 0x40 + +#: Identifier for ASN.1 class context-specific +tagClassContext = 0x80 + +#: Identifier for ASN.1 class private +tagClassPrivate = 0xC0 + +#: Identifier for "simple" ASN.1 structure (e.g. scalar) +tagFormatSimple = 0x00 + +#: Identifier for "constructed" ASN.1 structure (e.g. may have inner components) +tagFormatConstructed = 0x20 + +tagCategoryImplicit = 0x01 +tagCategoryExplicit = 0x02 +tagCategoryUntagged = 0x04 + + +class Tag(object): + """Create ASN.1 tag + + Represents ASN.1 tag that can be attached to a ASN.1 type to make + types distinguishable from each other. + + *Tag* objects are immutable and duck-type Python :class:`tuple` objects + holding three integer components of a tag. + + Parameters + ---------- + tagClass: :py:class:`int` + Tag *class* value + + tagFormat: :py:class:`int` + Tag *format* value + + tagId: :py:class:`int` + Tag ID value + """ + def __init__(self, tagClass, tagFormat, tagId): + if tagId < 0: + raise error.PyAsn1Error('Negative tag ID (%s) not allowed' % tagId) + self.__tagClass = tagClass + self.__tagFormat = tagFormat + self.__tagId = tagId + self.__tagClassId = tagClass, tagId + self.__hash = hash(self.__tagClassId) + + def __repr__(self): + representation = '[%s:%s:%s]' % ( + self.__tagClass, self.__tagFormat, self.__tagId) + return '<%s object, tag %s>' % ( + self.__class__.__name__, representation) + + def __eq__(self, other): + return self.__tagClassId == other + + def __ne__(self, other): + return self.__tagClassId != other + + def __lt__(self, other): + return self.__tagClassId < other + + def __le__(self, other): + return self.__tagClassId <= other + + def __gt__(self, other): + return self.__tagClassId > other + + def __ge__(self, other): + return self.__tagClassId >= other + + def __hash__(self): + return self.__hash + + def __getitem__(self, idx): + if idx == 0: + return self.__tagClass + elif idx == 1: + return self.__tagFormat + elif idx == 2: + return self.__tagId + else: + raise IndexError() + + def __iter__(self): + yield self.__tagClass + yield self.__tagFormat + yield self.__tagId + + def __and__(self, otherTag): + return self.__class__(self.__tagClass & otherTag.tagClass, + self.__tagFormat & otherTag.tagFormat, + self.__tagId & otherTag.tagId) + + def __or__(self, otherTag): + return self.__class__(self.__tagClass | otherTag.tagClass, + self.__tagFormat | otherTag.tagFormat, + self.__tagId | otherTag.tagId) + + @property + def tagClass(self): + """ASN.1 tag class + + Returns + ------- + : :py:class:`int` + Tag class + """ + return self.__tagClass + + @property + def tagFormat(self): + """ASN.1 tag format + + Returns + ------- + : :py:class:`int` + Tag format + """ + return self.__tagFormat + + @property + def tagId(self): + """ASN.1 tag ID + + Returns + ------- + : :py:class:`int` + Tag ID + """ + return self.__tagId + + +class TagSet(object): + """Create a collection of ASN.1 tags + + Represents a combination of :class:`~pyasn1.type.tag.Tag` objects + that can be attached to a ASN.1 type to make types distinguishable + from each other. + + *TagSet* objects are immutable and duck-type Python :class:`tuple` objects + holding arbitrary number of :class:`~pyasn1.type.tag.Tag` objects. + + Parameters + ---------- + baseTag: :class:`~pyasn1.type.tag.Tag` + Base *Tag* object. This tag survives IMPLICIT tagging. + + *superTags: :class:`~pyasn1.type.tag.Tag` + Additional *Tag* objects taking part in subtyping. + + Examples + -------- + .. code-block:: python + + class OrderNumber(NumericString): + ''' + ASN.1 specification + + Order-number ::= + [APPLICATION 5] IMPLICIT NumericString + ''' + tagSet = NumericString.tagSet.tagImplicitly( + Tag(tagClassApplication, tagFormatSimple, 5) + ) + + orderNumber = OrderNumber('1234') + """ + def __init__(self, baseTag=(), *superTags): + self.__baseTag = baseTag + self.__superTags = superTags + self.__superTagsClassId = tuple( + [(superTag.tagClass, superTag.tagId) for superTag in superTags] + ) + self.__lenOfSuperTags = len(superTags) + self.__hash = hash(self.__superTagsClassId) + + def __repr__(self): + representation = '-'.join(['%s:%s:%s' % (x.tagClass, x.tagFormat, x.tagId) + for x in self.__superTags]) + if representation: + representation = 'tags ' + representation + else: + representation = 'untagged' + + return '<%s object, %s>' % (self.__class__.__name__, representation) + + def __add__(self, superTag): + return self.__class__(self.__baseTag, *self.__superTags + (superTag,)) + + def __radd__(self, superTag): + return self.__class__(self.__baseTag, *(superTag,) + self.__superTags) + + def __getitem__(self, i): + if i.__class__ is slice: + return self.__class__(self.__baseTag, *self.__superTags[i]) + else: + return self.__superTags[i] + + def __eq__(self, other): + return self.__superTagsClassId == other + + def __ne__(self, other): + return self.__superTagsClassId != other + + def __lt__(self, other): + return self.__superTagsClassId < other + + def __le__(self, other): + return self.__superTagsClassId <= other + + def __gt__(self, other): + return self.__superTagsClassId > other + + def __ge__(self, other): + return self.__superTagsClassId >= other + + def __hash__(self): + return self.__hash + + def __len__(self): + return self.__lenOfSuperTags + + @property + def baseTag(self): + """Return base ASN.1 tag + + Returns + ------- + : :class:`~pyasn1.type.tag.Tag` + Base tag of this *TagSet* + """ + return self.__baseTag + + @property + def superTags(self): + """Return ASN.1 tags + + Returns + ------- + : :py:class:`tuple` + Tuple of :class:`~pyasn1.type.tag.Tag` objects that this *TagSet* contains + """ + return self.__superTags + + def tagExplicitly(self, superTag): + """Return explicitly tagged *TagSet* + + Create a new *TagSet* representing callee *TagSet* explicitly tagged + with passed tag(s). With explicit tagging mode, new tags are appended + to existing tag(s). + + Parameters + ---------- + superTag: :class:`~pyasn1.type.tag.Tag` + *Tag* object to tag this *TagSet* + + Returns + ------- + : :class:`~pyasn1.type.tag.TagSet` + New *TagSet* object + """ + if superTag.tagClass == tagClassUniversal: + raise error.PyAsn1Error("Can't tag with UNIVERSAL class tag") + if superTag.tagFormat != tagFormatConstructed: + superTag = Tag(superTag.tagClass, tagFormatConstructed, superTag.tagId) + return self + superTag + + def tagImplicitly(self, superTag): + """Return implicitly tagged *TagSet* + + Create a new *TagSet* representing callee *TagSet* implicitly tagged + with passed tag(s). With implicit tagging mode, new tag(s) replace the + last existing tag. + + Parameters + ---------- + superTag: :class:`~pyasn1.type.tag.Tag` + *Tag* object to tag this *TagSet* + + Returns + ------- + : :class:`~pyasn1.type.tag.TagSet` + New *TagSet* object + """ + if self.__superTags: + superTag = Tag(superTag.tagClass, self.__superTags[-1].tagFormat, superTag.tagId) + return self[:-1] + superTag + + def isSuperTagSetOf(self, tagSet): + """Test type relationship against given *TagSet* + + The callee is considered to be a supertype of given *TagSet* + tag-wise if all tags in *TagSet* are present in the callee and + they are in the same order. + + Parameters + ---------- + tagSet: :class:`~pyasn1.type.tag.TagSet` + *TagSet* object to evaluate against the callee + + Returns + ------- + : :py:class:`bool` + :obj:`True` if callee is a supertype of *tagSet* + """ + if len(tagSet) < self.__lenOfSuperTags: + return False + return self.__superTags == tagSet[:self.__lenOfSuperTags] + + # Backward compatibility + + def getBaseTag(self): + return self.__baseTag + +def initTagSet(tag): + return TagSet(tag, tag) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tagmap.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tagmap.py new file mode 100644 index 0000000..6f5163b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/tagmap.py @@ -0,0 +1,96 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +from pyasn1 import error + +__all__ = ['TagMap'] + + +class TagMap(object): + """Map *TagSet* objects to ASN.1 types + + Create an object mapping *TagSet* object to ASN.1 type. + + *TagMap* objects are immutable and duck-type read-only Python + :class:`dict` objects holding *TagSet* objects as keys and ASN.1 + type objects as values. + + Parameters + ---------- + presentTypes: :py:class:`dict` + Map of :class:`~pyasn1.type.tag.TagSet` to ASN.1 objects considered + as being unconditionally present in the *TagMap*. + + skipTypes: :py:class:`dict` + A collection of :class:`~pyasn1.type.tag.TagSet` objects considered + as absent in the *TagMap* even when *defaultType* is present. + + defaultType: ASN.1 type object + An ASN.1 type object callee *TagMap* returns for any *TagSet* key not present + in *presentTypes* (unless given key is present in *skipTypes*). + """ + def __init__(self, presentTypes=None, skipTypes=None, defaultType=None): + self.__presentTypes = presentTypes or {} + self.__skipTypes = skipTypes or {} + self.__defaultType = defaultType + + def __contains__(self, tagSet): + return (tagSet in self.__presentTypes or + self.__defaultType is not None and tagSet not in self.__skipTypes) + + def __getitem__(self, tagSet): + try: + return self.__presentTypes[tagSet] + except KeyError: + if self.__defaultType is None: + raise KeyError() + elif tagSet in self.__skipTypes: + raise error.PyAsn1Error('Key in negative map') + else: + return self.__defaultType + + def __iter__(self): + return iter(self.__presentTypes) + + def __repr__(self): + representation = '%s object' % self.__class__.__name__ + + if self.__presentTypes: + representation += ', present %s' % repr(self.__presentTypes) + + if self.__skipTypes: + representation += ', skip %s' % repr(self.__skipTypes) + + if self.__defaultType is not None: + representation += ', default %s' % repr(self.__defaultType) + + return '<%s>' % representation + + @property + def presentTypes(self): + """Return *TagSet* to ASN.1 type map present in callee *TagMap*""" + return self.__presentTypes + + @property + def skipTypes(self): + """Return *TagSet* collection unconditionally absent in callee *TagMap*""" + return self.__skipTypes + + @property + def defaultType(self): + """Return default ASN.1 type being returned for any missing *TagSet*""" + return self.__defaultType + + # Backward compatibility + + def getPosMap(self): + return self.presentTypes + + def getNegMap(self): + return self.skipTypes + + def getDef(self): + return self.defaultType diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/univ.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/univ.py new file mode 100644 index 0000000..aa688b2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/univ.py @@ -0,0 +1,3321 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import math +import sys + +from pyasn1 import error +from pyasn1.codec.ber import eoo +from pyasn1.compat import binary +from pyasn1.compat import integer +from pyasn1.compat import octets +from pyasn1.type import base +from pyasn1.type import constraint +from pyasn1.type import namedtype +from pyasn1.type import namedval +from pyasn1.type import tag +from pyasn1.type import tagmap + +NoValue = base.NoValue +noValue = NoValue() + +__all__ = ['Integer', 'Boolean', 'BitString', 'OctetString', 'Null', + 'ObjectIdentifier', 'Real', 'Enumerated', + 'SequenceOfAndSetOfBase', 'SequenceOf', 'SetOf', + 'SequenceAndSetBase', 'Sequence', 'Set', 'Choice', 'Any', + 'NoValue', 'noValue'] + +# "Simple" ASN.1 types (yet incomplete) + + +class Integer(base.SimpleAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python :class:`int` objects. + + Keyword Args + ------------ + value: :class:`int`, :class:`str` or |ASN.1| object + Python :class:`int` or :class:`str` literal or |ASN.1| class + instance. If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + namedValues: :py:class:`~pyasn1.type.namedval.NamedValues` + Object representing non-default symbolic aliases for numbers + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + + .. code-block:: python + + class ErrorCode(Integer): + ''' + ASN.1 specification: + + ErrorCode ::= + INTEGER { disk-full(1), no-disk(-1), + disk-not-formatted(2) } + + error ErrorCode ::= disk-full + ''' + namedValues = NamedValues( + ('disk-full', 1), ('no-disk', -1), + ('disk-not-formatted', 2) + ) + + error = ErrorCode('disk-full') + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x02) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + #: Default :py:class:`~pyasn1.type.namedval.NamedValues` object + #: representing symbolic aliases for numbers + namedValues = namedval.NamedValues() + + # Optimization for faster codec lookup + typeId = base.SimpleAsn1Type.getTypeId() + + def __init__(self, value=noValue, **kwargs): + if 'namedValues' not in kwargs: + kwargs['namedValues'] = self.namedValues + + base.SimpleAsn1Type.__init__(self, value, **kwargs) + + def __and__(self, value): + return self.clone(self._value & value) + + def __rand__(self, value): + return self.clone(value & self._value) + + def __or__(self, value): + return self.clone(self._value | value) + + def __ror__(self, value): + return self.clone(value | self._value) + + def __xor__(self, value): + return self.clone(self._value ^ value) + + def __rxor__(self, value): + return self.clone(value ^ self._value) + + def __lshift__(self, value): + return self.clone(self._value << value) + + def __rshift__(self, value): + return self.clone(self._value >> value) + + def __add__(self, value): + return self.clone(self._value + value) + + def __radd__(self, value): + return self.clone(value + self._value) + + def __sub__(self, value): + return self.clone(self._value - value) + + def __rsub__(self, value): + return self.clone(value - self._value) + + def __mul__(self, value): + return self.clone(self._value * value) + + def __rmul__(self, value): + return self.clone(value * self._value) + + def __mod__(self, value): + return self.clone(self._value % value) + + def __rmod__(self, value): + return self.clone(value % self._value) + + def __pow__(self, value, modulo=None): + return self.clone(pow(self._value, value, modulo)) + + def __rpow__(self, value): + return self.clone(pow(value, self._value)) + + def __floordiv__(self, value): + return self.clone(self._value // value) + + def __rfloordiv__(self, value): + return self.clone(value // self._value) + + if sys.version_info[0] <= 2: + def __div__(self, value): + if isinstance(value, float): + return Real(self._value / value) + else: + return self.clone(self._value / value) + + def __rdiv__(self, value): + if isinstance(value, float): + return Real(value / self._value) + else: + return self.clone(value / self._value) + else: + def __truediv__(self, value): + return Real(self._value / value) + + def __rtruediv__(self, value): + return Real(value / self._value) + + def __divmod__(self, value): + return self.clone(divmod(self._value, value)) + + def __rdivmod__(self, value): + return self.clone(divmod(value, self._value)) + + __hash__ = base.SimpleAsn1Type.__hash__ + + def __int__(self): + return int(self._value) + + if sys.version_info[0] <= 2: + def __long__(self): + return long(self._value) + + def __float__(self): + return float(self._value) + + def __abs__(self): + return self.clone(abs(self._value)) + + def __index__(self): + return int(self._value) + + def __pos__(self): + return self.clone(+self._value) + + def __neg__(self): + return self.clone(-self._value) + + def __invert__(self): + return self.clone(~self._value) + + def __round__(self, n=0): + r = round(self._value, n) + if n: + return self.clone(r) + else: + return r + + def __floor__(self): + return math.floor(self._value) + + def __ceil__(self): + return math.ceil(self._value) + + if sys.version_info[0:2] > (2, 5): + def __trunc__(self): + return self.clone(math.trunc(self._value)) + + def __lt__(self, value): + return self._value < value + + def __le__(self, value): + return self._value <= value + + def __eq__(self, value): + return self._value == value + + def __ne__(self, value): + return self._value != value + + def __gt__(self, value): + return self._value > value + + def __ge__(self, value): + return self._value >= value + + def prettyIn(self, value): + try: + return int(value) + + except ValueError: + try: + return self.namedValues[value] + + except KeyError: + raise error.PyAsn1Error( + 'Can\'t coerce %r into integer: %s' % (value, sys.exc_info()[1]) + ) + + def prettyOut(self, value): + try: + return str(self.namedValues[value]) + + except KeyError: + return str(value) + + # backward compatibility + + def getNamedValues(self): + return self.namedValues + + +class Boolean(Integer): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python :class:`int` objects. + + Keyword Args + ------------ + value: :class:`int`, :class:`str` or |ASN.1| object + Python :class:`int` or :class:`str` literal or |ASN.1| class + instance. If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s).Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + namedValues: :py:class:`~pyasn1.type.namedval.NamedValues` + Object representing non-default symbolic aliases for numbers + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class RoundResult(Boolean): + ''' + ASN.1 specification: + + RoundResult ::= BOOLEAN + + ok RoundResult ::= TRUE + ko RoundResult ::= FALSE + ''' + ok = RoundResult(True) + ko = RoundResult(False) + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x01), + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = Integer.subtypeSpec + constraint.SingleValueConstraint(0, 1) + + #: Default :py:class:`~pyasn1.type.namedval.NamedValues` object + #: representing symbolic aliases for numbers + namedValues = namedval.NamedValues(('False', 0), ('True', 1)) + + # Optimization for faster codec lookup + typeId = Integer.getTypeId() + +if sys.version_info[0] < 3: + SizedIntegerBase = long +else: + SizedIntegerBase = int + + +class SizedInteger(SizedIntegerBase): + bitLength = leadingZeroBits = None + + def setBitLength(self, bitLength): + self.bitLength = bitLength + self.leadingZeroBits = max(bitLength - integer.bitLength(self), 0) + return self + + def __len__(self): + if self.bitLength is None: + self.setBitLength(integer.bitLength(self)) + + return self.bitLength + + +class BitString(base.SimpleAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type both Python :class:`tuple` (as a tuple + of bits) and :class:`int` objects. + + Keyword Args + ------------ + value: :class:`int`, :class:`str` or |ASN.1| object + Python :class:`int` or :class:`str` literal representing binary + or hexadecimal number or sequence of integer bits or |ASN.1| object. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + namedValues: :py:class:`~pyasn1.type.namedval.NamedValues` + Object representing non-default symbolic aliases for numbers + + binValue: :py:class:`str` + Binary string initializer to use instead of the *value*. + Example: '10110011'. + + hexValue: :py:class:`str` + Hexadecimal string initializer to use instead of the *value*. + Example: 'DEADBEEF'. + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class Rights(BitString): + ''' + ASN.1 specification: + + Rights ::= BIT STRING { user-read(0), user-write(1), + group-read(2), group-write(3), + other-read(4), other-write(5) } + + group1 Rights ::= { group-read, group-write } + group2 Rights ::= '0011'B + group3 Rights ::= '3'H + ''' + namedValues = NamedValues( + ('user-read', 0), ('user-write', 1), + ('group-read', 2), ('group-write', 3), + ('other-read', 4), ('other-write', 5) + ) + + group1 = Rights(('group-read', 'group-write')) + group2 = Rights('0011') + group3 = Rights(0x3) + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x03) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + #: Default :py:class:`~pyasn1.type.namedval.NamedValues` object + #: representing symbolic aliases for numbers + namedValues = namedval.NamedValues() + + # Optimization for faster codec lookup + typeId = base.SimpleAsn1Type.getTypeId() + + defaultBinValue = defaultHexValue = noValue + + def __init__(self, value=noValue, **kwargs): + if value is noValue: + if kwargs: + try: + value = self.fromBinaryString(kwargs.pop('binValue'), internalFormat=True) + + except KeyError: + pass + + try: + value = self.fromHexString(kwargs.pop('hexValue'), internalFormat=True) + + except KeyError: + pass + + if value is noValue: + if self.defaultBinValue is not noValue: + value = self.fromBinaryString(self.defaultBinValue, internalFormat=True) + + elif self.defaultHexValue is not noValue: + value = self.fromHexString(self.defaultHexValue, internalFormat=True) + + if 'namedValues' not in kwargs: + kwargs['namedValues'] = self.namedValues + + base.SimpleAsn1Type.__init__(self, value, **kwargs) + + def __str__(self): + return self.asBinary() + + def __eq__(self, other): + other = self.prettyIn(other) + return self is other or self._value == other and len(self._value) == len(other) + + def __ne__(self, other): + other = self.prettyIn(other) + return self._value != other or len(self._value) != len(other) + + def __lt__(self, other): + other = self.prettyIn(other) + return len(self._value) < len(other) or len(self._value) == len(other) and self._value < other + + def __le__(self, other): + other = self.prettyIn(other) + return len(self._value) <= len(other) or len(self._value) == len(other) and self._value <= other + + def __gt__(self, other): + other = self.prettyIn(other) + return len(self._value) > len(other) or len(self._value) == len(other) and self._value > other + + def __ge__(self, other): + other = self.prettyIn(other) + return len(self._value) >= len(other) or len(self._value) == len(other) and self._value >= other + + # Immutable sequence object protocol + + def __len__(self): + return len(self._value) + + def __getitem__(self, i): + if i.__class__ is slice: + return self.clone([self[x] for x in range(*i.indices(len(self)))]) + else: + length = len(self._value) - 1 + if i > length or i < 0: + raise IndexError('bit index out of range') + return (self._value >> (length - i)) & 1 + + def __iter__(self): + length = len(self._value) + while length: + length -= 1 + yield (self._value >> length) & 1 + + def __reversed__(self): + return reversed(tuple(self)) + + # arithmetic operators + + def __add__(self, value): + value = self.prettyIn(value) + return self.clone(SizedInteger(self._value << len(value) | value).setBitLength(len(self._value) + len(value))) + + def __radd__(self, value): + value = self.prettyIn(value) + return self.clone(SizedInteger(value << len(self._value) | self._value).setBitLength(len(self._value) + len(value))) + + def __mul__(self, value): + bitString = self._value + while value > 1: + bitString <<= len(self._value) + bitString |= self._value + value -= 1 + return self.clone(bitString) + + def __rmul__(self, value): + return self * value + + def __lshift__(self, count): + return self.clone(SizedInteger(self._value << count).setBitLength(len(self._value) + count)) + + def __rshift__(self, count): + return self.clone(SizedInteger(self._value >> count).setBitLength(max(0, len(self._value) - count))) + + def __int__(self): + return self._value + + def __float__(self): + return float(self._value) + + if sys.version_info[0] < 3: + def __long__(self): + return self._value + + def asNumbers(self): + """Get |ASN.1| value as a sequence of 8-bit integers. + + If |ASN.1| object length is not a multiple of 8, result + will be left-padded with zeros. + """ + return tuple(octets.octs2ints(self.asOctets())) + + def asOctets(self): + """Get |ASN.1| value as a sequence of octets. + + If |ASN.1| object length is not a multiple of 8, result + will be left-padded with zeros. + """ + return integer.to_bytes(self._value, length=len(self)) + + def asInteger(self): + """Get |ASN.1| value as a single integer value. + """ + return self._value + + def asBinary(self): + """Get |ASN.1| value as a text string of bits. + """ + binString = binary.bin(self._value)[2:] + return '0' * (len(self._value) - len(binString)) + binString + + @classmethod + def fromHexString(cls, value, internalFormat=False, prepend=None): + """Create a |ASN.1| object initialized from the hex string. + + Parameters + ---------- + value: :class:`str` + Text string like 'DEADBEEF' + """ + try: + value = SizedInteger(value, 16).setBitLength(len(value) * 4) + + except ValueError: + raise error.PyAsn1Error('%s.fromHexString() error: %s' % (cls.__name__, sys.exc_info()[1])) + + if prepend is not None: + value = SizedInteger( + (SizedInteger(prepend) << len(value)) | value + ).setBitLength(len(prepend) + len(value)) + + if not internalFormat: + value = cls(value) + + return value + + @classmethod + def fromBinaryString(cls, value, internalFormat=False, prepend=None): + """Create a |ASN.1| object initialized from a string of '0' and '1'. + + Parameters + ---------- + value: :class:`str` + Text string like '1010111' + """ + try: + value = SizedInteger(value or '0', 2).setBitLength(len(value)) + + except ValueError: + raise error.PyAsn1Error('%s.fromBinaryString() error: %s' % (cls.__name__, sys.exc_info()[1])) + + if prepend is not None: + value = SizedInteger( + (SizedInteger(prepend) << len(value)) | value + ).setBitLength(len(prepend) + len(value)) + + if not internalFormat: + value = cls(value) + + return value + + @classmethod + def fromOctetString(cls, value, internalFormat=False, prepend=None, padding=0): + """Create a |ASN.1| object initialized from a string. + + Parameters + ---------- + value: :class:`str` (Py2) or :class:`bytes` (Py3) + Text string like '\\\\x01\\\\xff' (Py2) or b'\\\\x01\\\\xff' (Py3) + """ + value = SizedInteger(integer.from_bytes(value) >> padding).setBitLength(len(value) * 8 - padding) + + if prepend is not None: + value = SizedInteger( + (SizedInteger(prepend) << len(value)) | value + ).setBitLength(len(prepend) + len(value)) + + if not internalFormat: + value = cls(value) + + return value + + def prettyIn(self, value): + if isinstance(value, SizedInteger): + return value + elif octets.isStringType(value): + if not value: + return SizedInteger(0).setBitLength(0) + + elif value[0] == '\'': # "'1011'B" -- ASN.1 schema representation (deprecated) + if value[-2:] == '\'B': + return self.fromBinaryString(value[1:-2], internalFormat=True) + elif value[-2:] == '\'H': + return self.fromHexString(value[1:-2], internalFormat=True) + else: + raise error.PyAsn1Error( + 'Bad BIT STRING value notation %s' % (value,) + ) + + elif self.namedValues and not value.isdigit(): # named bits like 'Urgent, Active' + names = [x.strip() for x in value.split(',')] + + try: + + bitPositions = [self.namedValues[name] for name in names] + + except KeyError: + raise error.PyAsn1Error('unknown bit name(s) in %r' % (names,)) + + rightmostPosition = max(bitPositions) + + number = 0 + for bitPosition in bitPositions: + number |= 1 << (rightmostPosition - bitPosition) + + return SizedInteger(number).setBitLength(rightmostPosition + 1) + + elif value.startswith('0x'): + return self.fromHexString(value[2:], internalFormat=True) + + elif value.startswith('0b'): + return self.fromBinaryString(value[2:], internalFormat=True) + + else: # assume plain binary string like '1011' + return self.fromBinaryString(value, internalFormat=True) + + elif isinstance(value, (tuple, list)): + return self.fromBinaryString(''.join([b and '1' or '0' for b in value]), internalFormat=True) + + elif isinstance(value, BitString): + return SizedInteger(value).setBitLength(len(value)) + + elif isinstance(value, intTypes): + return SizedInteger(value) + + else: + raise error.PyAsn1Error( + 'Bad BitString initializer type \'%s\'' % (value,) + ) + + +try: + # noinspection PyStatementEffect + all + +except NameError: # Python 2.4 + # noinspection PyShadowingBuiltins + def all(iterable): + for element in iterable: + if not element: + return False + return True + + +class OctetString(base.SimpleAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python 2 :class:`str` or + Python 3 :class:`bytes`. When used in Unicode context, |ASN.1| type + assumes "|encoding|" serialisation. + + Keyword Args + ------------ + value: :class:`unicode`, :class:`str`, :class:`bytes` or |ASN.1| object + class:`str` (Python 2) or :class:`bytes` (Python 3), alternatively + class:`unicode` object (Python 2) or :class:`str` (Python 3) + representing character string to be serialised into octets + (note `encoding` parameter) or |ASN.1| object. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + encoding: :py:class:`str` + Unicode codec ID to encode/decode :class:`unicode` (Python 2) or + :class:`str` (Python 3) the payload when |ASN.1| object is used + in text string context. + + binValue: :py:class:`str` + Binary string initializer to use instead of the *value*. + Example: '10110011'. + + hexValue: :py:class:`str` + Hexadecimal string initializer to use instead of the *value*. + Example: 'DEADBEEF'. + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class Icon(OctetString): + ''' + ASN.1 specification: + + Icon ::= OCTET STRING + + icon1 Icon ::= '001100010011001000110011'B + icon2 Icon ::= '313233'H + ''' + icon1 = Icon.fromBinaryString('001100010011001000110011') + icon2 = Icon.fromHexString('313233') + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x04) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Optimization for faster codec lookup + typeId = base.SimpleAsn1Type.getTypeId() + + defaultBinValue = defaultHexValue = noValue + encoding = 'iso-8859-1' + + def __init__(self, value=noValue, **kwargs): + if kwargs: + if value is noValue: + try: + value = self.fromBinaryString(kwargs.pop('binValue')) + + except KeyError: + pass + + try: + value = self.fromHexString(kwargs.pop('hexValue')) + + except KeyError: + pass + + if value is noValue: + if self.defaultBinValue is not noValue: + value = self.fromBinaryString(self.defaultBinValue) + + elif self.defaultHexValue is not noValue: + value = self.fromHexString(self.defaultHexValue) + + if 'encoding' not in kwargs: + kwargs['encoding'] = self.encoding + + base.SimpleAsn1Type.__init__(self, value, **kwargs) + + if sys.version_info[0] <= 2: + def prettyIn(self, value): + if isinstance(value, str): + return value + + elif isinstance(value, unicode): + try: + return value.encode(self.encoding) + + except (LookupError, UnicodeEncodeError): + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeEncodeError( + "Can't encode string '%s' with codec " + "%s" % (value, self.encoding), exc + ) + + elif isinstance(value, (tuple, list)): + try: + return ''.join([chr(x) for x in value]) + + except ValueError: + raise error.PyAsn1Error( + "Bad %s initializer '%s'" % (self.__class__.__name__, value) + ) + + else: + return str(value) + + def __str__(self): + return str(self._value) + + def __unicode__(self): + try: + return self._value.decode(self.encoding) + + except UnicodeDecodeError: + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeDecodeError( + "Can't decode string '%s' with codec " + "%s" % (self._value, self.encoding), exc + ) + + def asOctets(self): + return str(self._value) + + def asNumbers(self): + return tuple([ord(x) for x in self._value]) + + else: + def prettyIn(self, value): + if isinstance(value, bytes): + return value + + elif isinstance(value, str): + try: + return value.encode(self.encoding) + + except UnicodeEncodeError: + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeEncodeError( + "Can't encode string '%s' with '%s' " + "codec" % (value, self.encoding), exc + ) + elif isinstance(value, OctetString): # a shortcut, bytes() would work the same way + return value.asOctets() + + elif isinstance(value, base.SimpleAsn1Type): # this mostly targets Integer objects + return self.prettyIn(str(value)) + + elif isinstance(value, (tuple, list)): + return self.prettyIn(bytes(value)) + + else: + return bytes(value) + + def __str__(self): + try: + return self._value.decode(self.encoding) + + except UnicodeDecodeError: + exc = sys.exc_info()[1] + raise error.PyAsn1UnicodeDecodeError( + "Can't decode string '%s' with '%s' codec at " + "'%s'" % (self._value, self.encoding, + self.__class__.__name__), exc + ) + + def __bytes__(self): + return bytes(self._value) + + def asOctets(self): + return bytes(self._value) + + def asNumbers(self): + return tuple(self._value) + + # + # Normally, `.prettyPrint()` is called from `__str__()`. Historically, + # OctetString.prettyPrint() used to return hexified payload + # representation in cases when non-printable content is present. At the + # same time `str()` used to produce either octet-stream (Py2) or + # text (Py3) representations. + # + # Therefore `OctetString.__str__()` -> `.prettyPrint()` call chain is + # reversed to preserve the original behaviour. + # + # Eventually we should deprecate `.prettyPrint()` / `.prettyOut()` harness + # and end up with just `__str__()` producing hexified representation while + # both text and octet-stream representation should only be requested via + # the `.asOctets()` method. + # + # Note: ASN.1 OCTET STRING is never mean to contain text! + # + + def prettyOut(self, value): + return value + + def prettyPrint(self, scope=0): + # first see if subclass has its own .prettyOut() + value = self.prettyOut(self._value) + + if value is not self._value: + return value + + numbers = self.asNumbers() + + for x in numbers: + # hexify if needed + if x < 32 or x > 126: + return '0x' + ''.join(('%.2x' % x for x in numbers)) + else: + # this prevents infinite recursion + return OctetString.__str__(self) + + @staticmethod + def fromBinaryString(value): + """Create a |ASN.1| object initialized from a string of '0' and '1'. + + Parameters + ---------- + value: :class:`str` + Text string like '1010111' + """ + bitNo = 8 + byte = 0 + r = [] + for v in value: + if bitNo: + bitNo -= 1 + else: + bitNo = 7 + r.append(byte) + byte = 0 + if v in ('0', '1'): + v = int(v) + else: + raise error.PyAsn1Error( + 'Non-binary OCTET STRING initializer %s' % (v,) + ) + byte |= v << bitNo + + r.append(byte) + + return octets.ints2octs(r) + + @staticmethod + def fromHexString(value): + """Create a |ASN.1| object initialized from the hex string. + + Parameters + ---------- + value: :class:`str` + Text string like 'DEADBEEF' + """ + r = [] + p = [] + for v in value: + if p: + r.append(int(p + v, 16)) + p = None + else: + p = v + if p: + r.append(int(p + '0', 16)) + + return octets.ints2octs(r) + + # Immutable sequence object protocol + + def __len__(self): + return len(self._value) + + def __getitem__(self, i): + if i.__class__ is slice: + return self.clone(self._value[i]) + else: + return self._value[i] + + def __iter__(self): + return iter(self._value) + + def __contains__(self, value): + return value in self._value + + def __add__(self, value): + return self.clone(self._value + self.prettyIn(value)) + + def __radd__(self, value): + return self.clone(self.prettyIn(value) + self._value) + + def __mul__(self, value): + return self.clone(self._value * value) + + def __rmul__(self, value): + return self * value + + def __int__(self): + return int(self._value) + + def __float__(self): + return float(self._value) + + def __reversed__(self): + return reversed(self._value) + + +class Null(OctetString): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python :class:`str` objects + (always empty). + + Keyword Args + ------------ + value: :class:`str` or |ASN.1| object + Python empty :class:`str` literal or any object that evaluates to :obj:`False` + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class Ack(Null): + ''' + ASN.1 specification: + + Ack ::= NULL + ''' + ack = Ack('') + """ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x05) + ) + subtypeSpec = OctetString.subtypeSpec + constraint.SingleValueConstraint(octets.str2octs('')) + + # Optimization for faster codec lookup + typeId = OctetString.getTypeId() + + def prettyIn(self, value): + if value: + return value + + return octets.str2octs('') + +if sys.version_info[0] <= 2: + intTypes = (int, long) +else: + intTypes = (int,) + +numericTypes = intTypes + (float,) + + +class ObjectIdentifier(base.SimpleAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python :class:`tuple` objects + (tuple of non-negative integers). + + Keyword Args + ------------ + value: :class:`tuple`, :class:`str` or |ASN.1| object + Python sequence of :class:`int` or :class:`str` literal or |ASN.1| object. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class ID(ObjectIdentifier): + ''' + ASN.1 specification: + + ID ::= OBJECT IDENTIFIER + + id-edims ID ::= { joint-iso-itu-t mhs-motif(6) edims(7) } + id-bp ID ::= { id-edims 11 } + ''' + id_edims = ID('2.6.7') + id_bp = id_edims + (11,) + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x06) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Optimization for faster codec lookup + typeId = base.SimpleAsn1Type.getTypeId() + + def __add__(self, other): + return self.clone(self._value + other) + + def __radd__(self, other): + return self.clone(other + self._value) + + def asTuple(self): + return self._value + + # Sequence object protocol + + def __len__(self): + return len(self._value) + + def __getitem__(self, i): + if i.__class__ is slice: + return self.clone(self._value[i]) + else: + return self._value[i] + + def __iter__(self): + return iter(self._value) + + def __contains__(self, value): + return value in self._value + + def index(self, suboid): + return self._value.index(suboid) + + def isPrefixOf(self, other): + """Indicate if this |ASN.1| object is a prefix of other |ASN.1| object. + + Parameters + ---------- + other: |ASN.1| object + |ASN.1| object + + Returns + ------- + : :class:`bool` + :obj:`True` if this |ASN.1| object is a parent (e.g. prefix) of the other |ASN.1| object + or :obj:`False` otherwise. + """ + l = len(self) + if l <= len(other): + if self._value[:l] == other[:l]: + return True + return False + + def prettyIn(self, value): + if isinstance(value, ObjectIdentifier): + return tuple(value) + elif octets.isStringType(value): + if '-' in value: + raise error.PyAsn1Error( + 'Malformed Object ID %s at %s: %s' % (value, self.__class__.__name__, sys.exc_info()[1]) + ) + try: + return tuple([int(subOid) for subOid in value.split('.') if subOid]) + except ValueError: + raise error.PyAsn1Error( + 'Malformed Object ID %s at %s: %s' % (value, self.__class__.__name__, sys.exc_info()[1]) + ) + + try: + tupleOfInts = tuple([int(subOid) for subOid in value if subOid >= 0]) + + except (ValueError, TypeError): + raise error.PyAsn1Error( + 'Malformed Object ID %s at %s: %s' % (value, self.__class__.__name__, sys.exc_info()[1]) + ) + + if len(tupleOfInts) == len(value): + return tupleOfInts + + raise error.PyAsn1Error('Malformed Object ID %s at %s' % (value, self.__class__.__name__)) + + def prettyOut(self, value): + return '.'.join([str(x) for x in value]) + + +class Real(base.SimpleAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python :class:`float` objects. + Additionally, |ASN.1| objects behave like a :class:`tuple` in which case its + elements are mantissa, base and exponent. + + Keyword Args + ------------ + value: :class:`tuple`, :class:`float` or |ASN.1| object + Python sequence of :class:`int` (representing mantissa, base and + exponent) or :class:`float` instance or |ASN.1| object. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class Pi(Real): + ''' + ASN.1 specification: + + Pi ::= REAL + + pi Pi ::= { mantissa 314159, base 10, exponent -5 } + + ''' + pi = Pi((314159, 10, -5)) + """ + binEncBase = None # binEncBase = 16 is recommended for large numbers + + try: + _plusInf = float('inf') + _minusInf = float('-inf') + _inf = _plusInf, _minusInf + + except ValueError: + # Infinity support is platform and Python dependent + _plusInf = _minusInf = None + _inf = () + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x09) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Optimization for faster codec lookup + typeId = base.SimpleAsn1Type.getTypeId() + + @staticmethod + def __normalizeBase10(value): + m, b, e = value + while m and m % 10 == 0: + m /= 10 + e += 1 + return m, b, e + + def prettyIn(self, value): + if isinstance(value, tuple) and len(value) == 3: + if (not isinstance(value[0], numericTypes) or + not isinstance(value[1], intTypes) or + not isinstance(value[2], intTypes)): + raise error.PyAsn1Error('Lame Real value syntax: %s' % (value,)) + if (isinstance(value[0], float) and + self._inf and value[0] in self._inf): + return value[0] + if value[1] not in (2, 10): + raise error.PyAsn1Error( + 'Prohibited base for Real value: %s' % (value[1],) + ) + if value[1] == 10: + value = self.__normalizeBase10(value) + return value + elif isinstance(value, intTypes): + return self.__normalizeBase10((value, 10, 0)) + elif isinstance(value, float) or octets.isStringType(value): + if octets.isStringType(value): + try: + value = float(value) + except ValueError: + raise error.PyAsn1Error( + 'Bad real value syntax: %s' % (value,) + ) + if self._inf and value in self._inf: + return value + else: + e = 0 + while int(value) != value: + value *= 10 + e -= 1 + return self.__normalizeBase10((int(value), 10, e)) + elif isinstance(value, Real): + return tuple(value) + raise error.PyAsn1Error( + 'Bad real value syntax: %s' % (value,) + ) + + def prettyPrint(self, scope=0): + try: + return self.prettyOut(float(self)) + + except OverflowError: + return '<overflow>' + + @property + def isPlusInf(self): + """Indicate PLUS-INFINITY object value + + Returns + ------- + : :class:`bool` + :obj:`True` if calling object represents plus infinity + or :obj:`False` otherwise. + + """ + return self._value == self._plusInf + + @property + def isMinusInf(self): + """Indicate MINUS-INFINITY object value + + Returns + ------- + : :class:`bool` + :obj:`True` if calling object represents minus infinity + or :obj:`False` otherwise. + """ + return self._value == self._minusInf + + @property + def isInf(self): + return self._value in self._inf + + def __add__(self, value): + return self.clone(float(self) + value) + + def __radd__(self, value): + return self + value + + def __mul__(self, value): + return self.clone(float(self) * value) + + def __rmul__(self, value): + return self * value + + def __sub__(self, value): + return self.clone(float(self) - value) + + def __rsub__(self, value): + return self.clone(value - float(self)) + + def __mod__(self, value): + return self.clone(float(self) % value) + + def __rmod__(self, value): + return self.clone(value % float(self)) + + def __pow__(self, value, modulo=None): + return self.clone(pow(float(self), value, modulo)) + + def __rpow__(self, value): + return self.clone(pow(value, float(self))) + + if sys.version_info[0] <= 2: + def __div__(self, value): + return self.clone(float(self) / value) + + def __rdiv__(self, value): + return self.clone(value / float(self)) + else: + def __truediv__(self, value): + return self.clone(float(self) / value) + + def __rtruediv__(self, value): + return self.clone(value / float(self)) + + def __divmod__(self, value): + return self.clone(float(self) // value) + + def __rdivmod__(self, value): + return self.clone(value // float(self)) + + def __int__(self): + return int(float(self)) + + if sys.version_info[0] <= 2: + def __long__(self): + return long(float(self)) + + def __float__(self): + if self._value in self._inf: + return self._value + else: + return float( + self._value[0] * pow(self._value[1], self._value[2]) + ) + + def __abs__(self): + return self.clone(abs(float(self))) + + def __pos__(self): + return self.clone(+float(self)) + + def __neg__(self): + return self.clone(-float(self)) + + def __round__(self, n=0): + r = round(float(self), n) + if n: + return self.clone(r) + else: + return r + + def __floor__(self): + return self.clone(math.floor(float(self))) + + def __ceil__(self): + return self.clone(math.ceil(float(self))) + + if sys.version_info[0:2] > (2, 5): + def __trunc__(self): + return self.clone(math.trunc(float(self))) + + def __lt__(self, value): + return float(self) < value + + def __le__(self, value): + return float(self) <= value + + def __eq__(self, value): + return float(self) == value + + def __ne__(self, value): + return float(self) != value + + def __gt__(self, value): + return float(self) > value + + def __ge__(self, value): + return float(self) >= value + + if sys.version_info[0] <= 2: + def __nonzero__(self): + return bool(float(self)) + else: + def __bool__(self): + return bool(float(self)) + + __hash__ = base.SimpleAsn1Type.__hash__ + + def __getitem__(self, idx): + if self._value in self._inf: + raise error.PyAsn1Error('Invalid infinite value operation') + else: + return self._value[idx] + + # compatibility stubs + + def isPlusInfinity(self): + return self.isPlusInf + + def isMinusInfinity(self): + return self.isMinusInf + + def isInfinity(self): + return self.isInf + + +class Enumerated(Integer): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, its + objects are immutable and duck-type Python :class:`int` objects. + + Keyword Args + ------------ + value: :class:`int`, :class:`str` or |ASN.1| object + Python :class:`int` or :class:`str` literal or |ASN.1| object. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + namedValues: :py:class:`~pyasn1.type.namedval.NamedValues` + Object representing non-default symbolic aliases for numbers + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + + .. code-block:: python + + class RadioButton(Enumerated): + ''' + ASN.1 specification: + + RadioButton ::= ENUMERATED { button1(0), button2(1), + button3(2) } + + selected-by-default RadioButton ::= button1 + ''' + namedValues = NamedValues( + ('button1', 0), ('button2', 1), + ('button3', 2) + ) + + selected_by_default = RadioButton('button1') + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 0x0A) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Optimization for faster codec lookup + typeId = Integer.getTypeId() + + #: Default :py:class:`~pyasn1.type.namedval.NamedValues` object + #: representing symbolic aliases for numbers + namedValues = namedval.NamedValues() + + +# "Structured" ASN.1 types + +class SequenceOfAndSetOfBase(base.ConstructedAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.ConstructedAsn1Type`, + its objects are mutable and duck-type Python :class:`list` objects. + + Keyword Args + ------------ + componentType : :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + A pyasn1 object representing ASN.1 type allowed within |ASN.1| type + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type can only occur on explicit + `.isInconsistent` call. + + Examples + -------- + + .. code-block:: python + + class LotteryDraw(SequenceOf): # SetOf is similar + ''' + ASN.1 specification: + + LotteryDraw ::= SEQUENCE OF INTEGER + ''' + componentType = Integer() + + lotteryDraw = LotteryDraw() + lotteryDraw.extend([123, 456, 789]) + """ + def __init__(self, *args, **kwargs): + # support positional params for backward compatibility + if args: + for key, value in zip(('componentType', 'tagSet', + 'subtypeSpec'), args): + if key in kwargs: + raise error.PyAsn1Error('Conflicting positional and keyword params!') + kwargs['componentType'] = value + + self._componentValues = noValue + + base.ConstructedAsn1Type.__init__(self, **kwargs) + + # Python list protocol + + def __getitem__(self, idx): + try: + return self.getComponentByPosition(idx) + + except error.PyAsn1Error: + raise IndexError(sys.exc_info()[1]) + + def __setitem__(self, idx, value): + try: + self.setComponentByPosition(idx, value) + + except error.PyAsn1Error: + raise IndexError(sys.exc_info()[1]) + + def append(self, value): + if self._componentValues is noValue: + pos = 0 + + else: + pos = len(self._componentValues) + + self[pos] = value + + def count(self, value): + return list(self._componentValues.values()).count(value) + + def extend(self, values): + for value in values: + self.append(value) + + if self._componentValues is noValue: + self._componentValues = {} + + def index(self, value, start=0, stop=None): + if stop is None: + stop = len(self) + + indices, values = zip(*self._componentValues.items()) + + # TODO: remove when Py2.5 support is gone + values = list(values) + + try: + return indices[values.index(value, start, stop)] + + except error.PyAsn1Error: + raise ValueError(sys.exc_info()[1]) + + def reverse(self): + self._componentValues.reverse() + + def sort(self, key=None, reverse=False): + self._componentValues = dict( + enumerate(sorted(self._componentValues.values(), + key=key, reverse=reverse))) + + def __len__(self): + if self._componentValues is noValue or not self._componentValues: + return 0 + + return max(self._componentValues) + 1 + + def __iter__(self): + for idx in range(0, len(self)): + yield self.getComponentByPosition(idx) + + def _cloneComponentValues(self, myClone, cloneValueFlag): + for idx, componentValue in self._componentValues.items(): + if componentValue is not noValue: + if isinstance(componentValue, base.ConstructedAsn1Type): + myClone.setComponentByPosition( + idx, componentValue.clone(cloneValueFlag=cloneValueFlag) + ) + else: + myClone.setComponentByPosition(idx, componentValue.clone()) + + def getComponentByPosition(self, idx, default=noValue, instantiate=True): + """Return |ASN.1| type component value by position. + + Equivalent to Python sequence subscription operation (e.g. `[]`). + + Parameters + ---------- + idx : :class:`int` + Component index (zero-based). Must either refer to an existing + component or to N+1 component (if *componentType* is set). In the latter + case a new component type gets instantiated and appended to the |ASN.1| + sequence. + + Keyword Args + ------------ + default: :class:`object` + If set and requested component is a schema object, return the `default` + object instead of the requested component. + + instantiate: :class:`bool` + If :obj:`True` (default), inner component will be automatically instantiated. + If :obj:`False` either existing component or the :class:`NoValue` object will be + returned. + + Returns + ------- + : :py:class:`~pyasn1.type.base.PyAsn1Item` + Instantiate |ASN.1| component type or return existing component value + + Examples + -------- + + .. code-block:: python + + # can also be SetOf + class MySequenceOf(SequenceOf): + componentType = OctetString() + + s = MySequenceOf() + + # returns component #0 with `.isValue` property False + s.getComponentByPosition(0) + + # returns None + s.getComponentByPosition(0, default=None) + + s.clear() + + # returns noValue + s.getComponentByPosition(0, instantiate=False) + + # sets component #0 to OctetString() ASN.1 schema + # object and returns it + s.getComponentByPosition(0, instantiate=True) + + # sets component #0 to ASN.1 value object + s.setComponentByPosition(0, 'ABCD') + + # returns OctetString('ABCD') value object + s.getComponentByPosition(0, instantiate=False) + + s.clear() + + # returns noValue + s.getComponentByPosition(0, instantiate=False) + """ + if isinstance(idx, slice): + indices = tuple(range(len(self))) + return [self.getComponentByPosition(subidx, default, instantiate) + for subidx in indices[idx]] + + if idx < 0: + idx = len(self) + idx + if idx < 0: + raise error.PyAsn1Error( + 'SequenceOf/SetOf index is out of range') + + try: + componentValue = self._componentValues[idx] + + except (KeyError, error.PyAsn1Error): + if not instantiate: + return default + + self.setComponentByPosition(idx) + + componentValue = self._componentValues[idx] + + if default is noValue or componentValue.isValue: + return componentValue + else: + return default + + def setComponentByPosition(self, idx, value=noValue, + verifyConstraints=True, + matchTags=True, + matchConstraints=True): + """Assign |ASN.1| type component by position. + + Equivalent to Python sequence item assignment operation (e.g. `[]`) + or list.append() (when idx == len(self)). + + Parameters + ---------- + idx: :class:`int` + Component index (zero-based). Must either refer to existing + component or to N+1 component. In the latter case a new component + type gets instantiated (if *componentType* is set, or given ASN.1 + object is taken otherwise) and appended to the |ASN.1| sequence. + + Keyword Args + ------------ + value: :class:`object` or :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + A Python value to initialize |ASN.1| component with (if *componentType* is set) + or ASN.1 value object to assign to |ASN.1| component. + If `value` is not given, schema object will be set as a component. + + verifyConstraints: :class:`bool` + If :obj:`False`, skip constraints validation + + matchTags: :class:`bool` + If :obj:`False`, skip component tags matching + + matchConstraints: :class:`bool` + If :obj:`False`, skip component constraints matching + + Returns + ------- + self + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer + IndexError + When idx > len(self) + """ + if isinstance(idx, slice): + indices = tuple(range(len(self))) + startIdx = indices and indices[idx][0] or 0 + for subIdx, subValue in enumerate(value): + self.setComponentByPosition( + startIdx + subIdx, subValue, verifyConstraints, + matchTags, matchConstraints) + return self + + if idx < 0: + idx = len(self) + idx + if idx < 0: + raise error.PyAsn1Error( + 'SequenceOf/SetOf index is out of range') + + componentType = self.componentType + + if self._componentValues is noValue: + componentValues = {} + + else: + componentValues = self._componentValues + + currentValue = componentValues.get(idx, noValue) + + if value is noValue: + if componentType is not None: + value = componentType.clone() + + elif currentValue is noValue: + raise error.PyAsn1Error('Component type not defined') + + elif not isinstance(value, base.Asn1Item): + if (componentType is not None and + isinstance(componentType, base.SimpleAsn1Type)): + value = componentType.clone(value=value) + + elif (currentValue is not noValue and + isinstance(currentValue, base.SimpleAsn1Type)): + value = currentValue.clone(value=value) + + else: + raise error.PyAsn1Error( + 'Non-ASN.1 value %r and undefined component' + ' type at %r' % (value, self)) + + elif componentType is not None and (matchTags or matchConstraints): + subtypeChecker = ( + self.strictConstraints and + componentType.isSameTypeWith or + componentType.isSuperTypeOf) + + if not subtypeChecker(value, verifyConstraints and matchTags, + verifyConstraints and matchConstraints): + # TODO: we should wrap componentType with UnnamedType to carry + # additional properties associated with componentType + if componentType.typeId != Any.typeId: + raise error.PyAsn1Error( + 'Component value is tag-incompatible: %r vs ' + '%r' % (value, componentType)) + + componentValues[idx] = value + + self._componentValues = componentValues + + return self + + @property + def componentTagMap(self): + if self.componentType is not None: + return self.componentType.tagMap + + @property + def components(self): + return [self._componentValues[idx] + for idx in sorted(self._componentValues)] + + def clear(self): + """Remove all components and become an empty |ASN.1| value object. + + Has the same effect on |ASN.1| object as it does on :class:`list` + built-in. + """ + self._componentValues = {} + return self + + def reset(self): + """Remove all components and become a |ASN.1| schema object. + + See :meth:`isValue` property for more information on the + distinction between value and schema objects. + """ + self._componentValues = noValue + return self + + def prettyPrint(self, scope=0): + scope += 1 + representation = self.__class__.__name__ + ':\n' + + if not self.isValue: + return representation + + for idx, componentValue in enumerate(self): + representation += ' ' * scope + if (componentValue is noValue and + self.componentType is not None): + representation += '<empty>' + else: + representation += componentValue.prettyPrint(scope) + + return representation + + def prettyPrintType(self, scope=0): + scope += 1 + representation = '%s -> %s {\n' % (self.tagSet, self.__class__.__name__) + if self.componentType is not None: + representation += ' ' * scope + representation += self.componentType.prettyPrintType(scope) + return representation + '\n' + ' ' * (scope - 1) + '}' + + + @property + def isValue(self): + """Indicate that |ASN.1| object represents ASN.1 value. + + If *isValue* is :obj:`False` then this object represents just ASN.1 schema. + + If *isValue* is :obj:`True` then, in addition to its ASN.1 schema features, + this object can also be used like a Python built-in object + (e.g. :class:`int`, :class:`str`, :class:`dict` etc.). + + Returns + ------- + : :class:`bool` + :obj:`False` if object represents just ASN.1 schema. + :obj:`True` if object represents ASN.1 schema and can be used as a normal value. + + Note + ---- + There is an important distinction between PyASN1 schema and value objects. + The PyASN1 schema objects can only participate in ASN.1 schema-related + operations (e.g. defining or testing the structure of the data). Most + obvious uses of ASN.1 schema is to guide serialisation codecs whilst + encoding/decoding serialised ASN.1 contents. + + The PyASN1 value objects can **additionally** participate in many operations + involving regular Python objects (e.g. arithmetic, comprehension etc). + """ + if self._componentValues is noValue: + return False + + if len(self._componentValues) != len(self): + return False + + for componentValue in self._componentValues.values(): + if componentValue is noValue or not componentValue.isValue: + return False + + return True + + @property + def isInconsistent(self): + """Run necessary checks to ensure |ASN.1| object consistency. + + Default action is to verify |ASN.1| object against constraints imposed + by `subtypeSpec`. + + Raises + ------ + :py:class:`~pyasn1.error.PyAsn1tError` on any inconsistencies found + """ + if self.componentType is noValue or not self.subtypeSpec: + return False + + if self._componentValues is noValue: + return True + + mapping = {} + + for idx, value in self._componentValues.items(): + # Absent fields are not in the mapping + if value is noValue: + continue + + mapping[idx] = value + + try: + # Represent SequenceOf/SetOf as a bare dict to constraints chain + self.subtypeSpec(mapping) + + except error.PyAsn1Error: + exc = sys.exc_info()[1] + return exc + + return False + +class SequenceOf(SequenceOfAndSetOfBase): + __doc__ = SequenceOfAndSetOfBase.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x10) + ) + + #: Default :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + #: object representing ASN.1 type allowed within |ASN.1| type + componentType = None + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Disambiguation ASN.1 types identification + typeId = SequenceOfAndSetOfBase.getTypeId() + + +class SetOf(SequenceOfAndSetOfBase): + __doc__ = SequenceOfAndSetOfBase.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x11) + ) + + #: Default :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + #: object representing ASN.1 type allowed within |ASN.1| type + componentType = None + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Disambiguation ASN.1 types identification + typeId = SequenceOfAndSetOfBase.getTypeId() + + +class SequenceAndSetBase(base.ConstructedAsn1Type): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.ConstructedAsn1Type`, + its objects are mutable and duck-type Python :class:`dict` objects. + + Keyword Args + ------------ + componentType: :py:class:`~pyasn1.type.namedtype.NamedType` + Object holding named ASN.1 types allowed within this collection + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type can only occur on explicit + `.isInconsistent` call. + + Examples + -------- + + .. code-block:: python + + class Description(Sequence): # Set is similar + ''' + ASN.1 specification: + + Description ::= SEQUENCE { + surname IA5String, + first-name IA5String OPTIONAL, + age INTEGER DEFAULT 40 + } + ''' + componentType = NamedTypes( + NamedType('surname', IA5String()), + OptionalNamedType('first-name', IA5String()), + DefaultedNamedType('age', Integer(40)) + ) + + descr = Description() + descr['surname'] = 'Smith' + descr['first-name'] = 'John' + """ + #: Default :py:class:`~pyasn1.type.namedtype.NamedTypes` + #: object representing named ASN.1 types allowed within |ASN.1| type + componentType = namedtype.NamedTypes() + + + class DynamicNames(object): + """Fields names/positions mapping for component-less objects""" + def __init__(self): + self._keyToIdxMap = {} + self._idxToKeyMap = {} + + def __len__(self): + return len(self._keyToIdxMap) + + def __contains__(self, item): + return item in self._keyToIdxMap or item in self._idxToKeyMap + + def __iter__(self): + return (self._idxToKeyMap[idx] for idx in range(len(self._idxToKeyMap))) + + def __getitem__(self, item): + try: + return self._keyToIdxMap[item] + + except KeyError: + return self._idxToKeyMap[item] + + def getNameByPosition(self, idx): + try: + return self._idxToKeyMap[idx] + + except KeyError: + raise error.PyAsn1Error('Type position out of range') + + def getPositionByName(self, name): + try: + return self._keyToIdxMap[name] + + except KeyError: + raise error.PyAsn1Error('Name %s not found' % (name,)) + + def addField(self, idx): + self._keyToIdxMap['field-%d' % idx] = idx + self._idxToKeyMap[idx] = 'field-%d' % idx + + + def __init__(self, **kwargs): + base.ConstructedAsn1Type.__init__(self, **kwargs) + self._componentTypeLen = len(self.componentType) + if self._componentTypeLen: + self._componentValues = [] + else: + self._componentValues = noValue + self._dynamicNames = self._componentTypeLen or self.DynamicNames() + + def __getitem__(self, idx): + if octets.isStringType(idx): + try: + return self.getComponentByName(idx) + + except error.PyAsn1Error: + # duck-typing dict + raise KeyError(sys.exc_info()[1]) + + else: + try: + return self.getComponentByPosition(idx) + + except error.PyAsn1Error: + # duck-typing list + raise IndexError(sys.exc_info()[1]) + + def __setitem__(self, idx, value): + if octets.isStringType(idx): + try: + self.setComponentByName(idx, value) + + except error.PyAsn1Error: + # duck-typing dict + raise KeyError(sys.exc_info()[1]) + + else: + try: + self.setComponentByPosition(idx, value) + + except error.PyAsn1Error: + # duck-typing list + raise IndexError(sys.exc_info()[1]) + + def __contains__(self, key): + if self._componentTypeLen: + return key in self.componentType + else: + return key in self._dynamicNames + + def __len__(self): + return len(self._componentValues) + + def __iter__(self): + return iter(self.componentType or self._dynamicNames) + + # Python dict protocol + + def values(self): + for idx in range(self._componentTypeLen or len(self._dynamicNames)): + yield self[idx] + + def keys(self): + return iter(self) + + def items(self): + for idx in range(self._componentTypeLen or len(self._dynamicNames)): + if self._componentTypeLen: + yield self.componentType[idx].name, self[idx] + else: + yield self._dynamicNames[idx], self[idx] + + def update(self, *iterValue, **mappingValue): + for k, v in iterValue: + self[k] = v + for k in mappingValue: + self[k] = mappingValue[k] + + def clear(self): + """Remove all components and become an empty |ASN.1| value object. + + Has the same effect on |ASN.1| object as it does on :class:`dict` + built-in. + """ + self._componentValues = [] + self._dynamicNames = self.DynamicNames() + return self + + def reset(self): + """Remove all components and become a |ASN.1| schema object. + + See :meth:`isValue` property for more information on the + distinction between value and schema objects. + """ + self._componentValues = noValue + self._dynamicNames = self.DynamicNames() + return self + + @property + def components(self): + return self._componentValues + + def _cloneComponentValues(self, myClone, cloneValueFlag): + if self._componentValues is noValue: + return + + for idx, componentValue in enumerate(self._componentValues): + if componentValue is not noValue: + if isinstance(componentValue, base.ConstructedAsn1Type): + myClone.setComponentByPosition( + idx, componentValue.clone(cloneValueFlag=cloneValueFlag) + ) + else: + myClone.setComponentByPosition(idx, componentValue.clone()) + + def getComponentByName(self, name, default=noValue, instantiate=True): + """Returns |ASN.1| type component by name. + + Equivalent to Python :class:`dict` subscription operation (e.g. `[]`). + + Parameters + ---------- + name: :class:`str` + |ASN.1| type component name + + Keyword Args + ------------ + default: :class:`object` + If set and requested component is a schema object, return the `default` + object instead of the requested component. + + instantiate: :class:`bool` + If :obj:`True` (default), inner component will be automatically + instantiated. + If :obj:`False` either existing component or the :class:`NoValue` + object will be returned. + + Returns + ------- + : :py:class:`~pyasn1.type.base.PyAsn1Item` + Instantiate |ASN.1| component type or return existing + component value + """ + if self._componentTypeLen: + idx = self.componentType.getPositionByName(name) + else: + try: + idx = self._dynamicNames.getPositionByName(name) + + except KeyError: + raise error.PyAsn1Error('Name %s not found' % (name,)) + + return self.getComponentByPosition(idx, default=default, instantiate=instantiate) + + def setComponentByName(self, name, value=noValue, + verifyConstraints=True, + matchTags=True, + matchConstraints=True): + """Assign |ASN.1| type component by name. + + Equivalent to Python :class:`dict` item assignment operation (e.g. `[]`). + + Parameters + ---------- + name: :class:`str` + |ASN.1| type component name + + Keyword Args + ------------ + value: :class:`object` or :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + A Python value to initialize |ASN.1| component with (if *componentType* is set) + or ASN.1 value object to assign to |ASN.1| component. + If `value` is not given, schema object will be set as a component. + + verifyConstraints: :class:`bool` + If :obj:`False`, skip constraints validation + + matchTags: :class:`bool` + If :obj:`False`, skip component tags matching + + matchConstraints: :class:`bool` + If :obj:`False`, skip component constraints matching + + Returns + ------- + self + """ + if self._componentTypeLen: + idx = self.componentType.getPositionByName(name) + else: + try: + idx = self._dynamicNames.getPositionByName(name) + + except KeyError: + raise error.PyAsn1Error('Name %s not found' % (name,)) + + return self.setComponentByPosition( + idx, value, verifyConstraints, matchTags, matchConstraints + ) + + def getComponentByPosition(self, idx, default=noValue, instantiate=True): + """Returns |ASN.1| type component by index. + + Equivalent to Python sequence subscription operation (e.g. `[]`). + + Parameters + ---------- + idx: :class:`int` + Component index (zero-based). Must either refer to an existing + component or (if *componentType* is set) new ASN.1 schema object gets + instantiated. + + Keyword Args + ------------ + default: :class:`object` + If set and requested component is a schema object, return the `default` + object instead of the requested component. + + instantiate: :class:`bool` + If :obj:`True` (default), inner component will be automatically + instantiated. + If :obj:`False` either existing component or the :class:`NoValue` + object will be returned. + + Returns + ------- + : :py:class:`~pyasn1.type.base.PyAsn1Item` + a PyASN1 object + + Examples + -------- + + .. code-block:: python + + # can also be Set + class MySequence(Sequence): + componentType = NamedTypes( + NamedType('id', OctetString()) + ) + + s = MySequence() + + # returns component #0 with `.isValue` property False + s.getComponentByPosition(0) + + # returns None + s.getComponentByPosition(0, default=None) + + s.clear() + + # returns noValue + s.getComponentByPosition(0, instantiate=False) + + # sets component #0 to OctetString() ASN.1 schema + # object and returns it + s.getComponentByPosition(0, instantiate=True) + + # sets component #0 to ASN.1 value object + s.setComponentByPosition(0, 'ABCD') + + # returns OctetString('ABCD') value object + s.getComponentByPosition(0, instantiate=False) + + s.clear() + + # returns noValue + s.getComponentByPosition(0, instantiate=False) + """ + try: + if self._componentValues is noValue: + componentValue = noValue + + else: + componentValue = self._componentValues[idx] + + except IndexError: + componentValue = noValue + + if not instantiate: + if componentValue is noValue or not componentValue.isValue: + return default + else: + return componentValue + + if componentValue is noValue: + self.setComponentByPosition(idx) + + componentValue = self._componentValues[idx] + + if default is noValue or componentValue.isValue: + return componentValue + else: + return default + + def setComponentByPosition(self, idx, value=noValue, + verifyConstraints=True, + matchTags=True, + matchConstraints=True): + """Assign |ASN.1| type component by position. + + Equivalent to Python sequence item assignment operation (e.g. `[]`). + + Parameters + ---------- + idx : :class:`int` + Component index (zero-based). Must either refer to existing + component (if *componentType* is set) or to N+1 component + otherwise. In the latter case a new component of given ASN.1 + type gets instantiated and appended to |ASN.1| sequence. + + Keyword Args + ------------ + value: :class:`object` or :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + A Python value to initialize |ASN.1| component with (if *componentType* is set) + or ASN.1 value object to assign to |ASN.1| component. + If `value` is not given, schema object will be set as a component. + + verifyConstraints : :class:`bool` + If :obj:`False`, skip constraints validation + + matchTags: :class:`bool` + If :obj:`False`, skip component tags matching + + matchConstraints: :class:`bool` + If :obj:`False`, skip component constraints matching + + Returns + ------- + self + """ + componentType = self.componentType + componentTypeLen = self._componentTypeLen + + if self._componentValues is noValue: + componentValues = [] + + else: + componentValues = self._componentValues + + try: + currentValue = componentValues[idx] + + except IndexError: + currentValue = noValue + if componentTypeLen: + if componentTypeLen < idx: + raise error.PyAsn1Error('component index out of range') + + componentValues = [noValue] * componentTypeLen + + if value is noValue: + if componentTypeLen: + value = componentType.getTypeByPosition(idx) + if isinstance(value, base.ConstructedAsn1Type): + value = value.clone(cloneValueFlag=componentType[idx].isDefaulted) + + elif currentValue is noValue: + raise error.PyAsn1Error('Component type not defined') + + elif not isinstance(value, base.Asn1Item): + if componentTypeLen: + subComponentType = componentType.getTypeByPosition(idx) + if isinstance(subComponentType, base.SimpleAsn1Type): + value = subComponentType.clone(value=value) + + else: + raise error.PyAsn1Error('%s can cast only scalar values' % componentType.__class__.__name__) + + elif currentValue is not noValue and isinstance(currentValue, base.SimpleAsn1Type): + value = currentValue.clone(value=value) + + else: + raise error.PyAsn1Error('%s undefined component type' % componentType.__class__.__name__) + + elif ((verifyConstraints or matchTags or matchConstraints) and + componentTypeLen): + subComponentType = componentType.getTypeByPosition(idx) + if subComponentType is not noValue: + subtypeChecker = (self.strictConstraints and + subComponentType.isSameTypeWith or + subComponentType.isSuperTypeOf) + + if not subtypeChecker(value, verifyConstraints and matchTags, + verifyConstraints and matchConstraints): + if not componentType[idx].openType: + raise error.PyAsn1Error('Component value is tag-incompatible: %r vs %r' % (value, componentType)) + + if componentTypeLen or idx in self._dynamicNames: + componentValues[idx] = value + + elif len(componentValues) == idx: + componentValues.append(value) + self._dynamicNames.addField(idx) + + else: + raise error.PyAsn1Error('Component index out of range') + + self._componentValues = componentValues + + return self + + @property + def isValue(self): + """Indicate that |ASN.1| object represents ASN.1 value. + + If *isValue* is :obj:`False` then this object represents just ASN.1 schema. + + If *isValue* is :obj:`True` then, in addition to its ASN.1 schema features, + this object can also be used like a Python built-in object (e.g. + :class:`int`, :class:`str`, :class:`dict` etc.). + + Returns + ------- + : :class:`bool` + :obj:`False` if object represents just ASN.1 schema. + :obj:`True` if object represents ASN.1 schema and can be used as a + normal value. + + Note + ---- + There is an important distinction between PyASN1 schema and value objects. + The PyASN1 schema objects can only participate in ASN.1 schema-related + operations (e.g. defining or testing the structure of the data). Most + obvious uses of ASN.1 schema is to guide serialisation codecs whilst + encoding/decoding serialised ASN.1 contents. + + The PyASN1 value objects can **additionally** participate in many operations + involving regular Python objects (e.g. arithmetic, comprehension etc). + + It is sufficient for |ASN.1| objects to have all non-optional and non-defaulted + components being value objects to be considered as a value objects as a whole. + In other words, even having one or more optional components not turned into + value objects, |ASN.1| object is still considered as a value object. Defaulted + components are normally value objects by default. + """ + if self._componentValues is noValue: + return False + + componentType = self.componentType + + if componentType: + for idx, subComponentType in enumerate(componentType.namedTypes): + if subComponentType.isDefaulted or subComponentType.isOptional: + continue + + if not self._componentValues: + return False + + componentValue = self._componentValues[idx] + if componentValue is noValue or not componentValue.isValue: + return False + + else: + for componentValue in self._componentValues: + if componentValue is noValue or not componentValue.isValue: + return False + + return True + + @property + def isInconsistent(self): + """Run necessary checks to ensure |ASN.1| object consistency. + + Default action is to verify |ASN.1| object against constraints imposed + by `subtypeSpec`. + + Raises + ------ + :py:class:`~pyasn1.error.PyAsn1tError` on any inconsistencies found + """ + if self.componentType is noValue or not self.subtypeSpec: + return False + + if self._componentValues is noValue: + return True + + mapping = {} + + for idx, value in enumerate(self._componentValues): + # Absent fields are not in the mapping + if value is noValue: + continue + + name = self.componentType.getNameByPosition(idx) + + mapping[name] = value + + try: + # Represent Sequence/Set as a bare dict to constraints chain + self.subtypeSpec(mapping) + + except error.PyAsn1Error: + exc = sys.exc_info()[1] + return exc + + return False + + def prettyPrint(self, scope=0): + """Return an object representation string. + + Returns + ------- + : :class:`str` + Human-friendly object representation. + """ + scope += 1 + representation = self.__class__.__name__ + ':\n' + for idx, componentValue in enumerate(self._componentValues): + if componentValue is not noValue and componentValue.isValue: + representation += ' ' * scope + if self.componentType: + representation += self.componentType.getNameByPosition(idx) + else: + representation += self._dynamicNames.getNameByPosition(idx) + representation = '%s=%s\n' % ( + representation, componentValue.prettyPrint(scope) + ) + return representation + + def prettyPrintType(self, scope=0): + scope += 1 + representation = '%s -> %s {\n' % (self.tagSet, self.__class__.__name__) + for idx, componentType in enumerate(self.componentType.values() or self._componentValues): + representation += ' ' * scope + if self.componentType: + representation += '"%s"' % self.componentType.getNameByPosition(idx) + else: + representation += '"%s"' % self._dynamicNames.getNameByPosition(idx) + representation = '%s = %s\n' % ( + representation, componentType.prettyPrintType(scope) + ) + return representation + '\n' + ' ' * (scope - 1) + '}' + + # backward compatibility + + def setDefaultComponents(self): + return self + + def getComponentType(self): + if self._componentTypeLen: + return self.componentType + + def getNameByPosition(self, idx): + if self._componentTypeLen: + return self.componentType[idx].name + +class Sequence(SequenceAndSetBase): + __doc__ = SequenceAndSetBase.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x10) + ) + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + #: Default collection of ASN.1 types of component (e.g. :py:class:`~pyasn1.type.namedtype.NamedType`) + #: object imposing size constraint on |ASN.1| objects + componentType = namedtype.NamedTypes() + + # Disambiguation ASN.1 types identification + typeId = SequenceAndSetBase.getTypeId() + + # backward compatibility + + def getComponentTagMapNearPosition(self, idx): + if self.componentType: + return self.componentType.getTagMapNearPosition(idx) + + def getComponentPositionNearType(self, tagSet, idx): + if self.componentType: + return self.componentType.getPositionNearType(tagSet, idx) + else: + return idx + + +class Set(SequenceAndSetBase): + __doc__ = SequenceAndSetBase.__doc__ + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.initTagSet( + tag.Tag(tag.tagClassUniversal, tag.tagFormatConstructed, 0x11) + ) + + #: Default collection of ASN.1 types of component (e.g. :py:class:`~pyasn1.type.namedtype.NamedType`) + #: object representing ASN.1 type allowed within |ASN.1| type + componentType = namedtype.NamedTypes() + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Disambiguation ASN.1 types identification + typeId = SequenceAndSetBase.getTypeId() + + def getComponent(self, innerFlag=False): + return self + + def getComponentByType(self, tagSet, default=noValue, + instantiate=True, innerFlag=False): + """Returns |ASN.1| type component by ASN.1 tag. + + Parameters + ---------- + tagSet : :py:class:`~pyasn1.type.tag.TagSet` + Object representing ASN.1 tags to identify one of + |ASN.1| object component + + Keyword Args + ------------ + default: :class:`object` + If set and requested component is a schema object, return the `default` + object instead of the requested component. + + instantiate: :class:`bool` + If :obj:`True` (default), inner component will be automatically + instantiated. + If :obj:`False` either existing component or the :class:`noValue` + object will be returned. + + Returns + ------- + : :py:class:`~pyasn1.type.base.PyAsn1Item` + a pyasn1 object + """ + componentValue = self.getComponentByPosition( + self.componentType.getPositionByType(tagSet), + default=default, instantiate=instantiate + ) + if innerFlag and isinstance(componentValue, Set): + # get inner component by inner tagSet + return componentValue.getComponent(innerFlag=True) + else: + # get outer component by inner tagSet + return componentValue + + def setComponentByType(self, tagSet, value=noValue, + verifyConstraints=True, + matchTags=True, + matchConstraints=True, + innerFlag=False): + """Assign |ASN.1| type component by ASN.1 tag. + + Parameters + ---------- + tagSet : :py:class:`~pyasn1.type.tag.TagSet` + Object representing ASN.1 tags to identify one of + |ASN.1| object component + + Keyword Args + ------------ + value: :class:`object` or :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + A Python value to initialize |ASN.1| component with (if *componentType* is set) + or ASN.1 value object to assign to |ASN.1| component. + If `value` is not given, schema object will be set as a component. + + verifyConstraints : :class:`bool` + If :obj:`False`, skip constraints validation + + matchTags: :class:`bool` + If :obj:`False`, skip component tags matching + + matchConstraints: :class:`bool` + If :obj:`False`, skip component constraints matching + + innerFlag: :class:`bool` + If :obj:`True`, search for matching *tagSet* recursively. + + Returns + ------- + self + """ + idx = self.componentType.getPositionByType(tagSet) + + if innerFlag: # set inner component by inner tagSet + componentType = self.componentType.getTypeByPosition(idx) + + if componentType.tagSet: + return self.setComponentByPosition( + idx, value, verifyConstraints, matchTags, matchConstraints + ) + else: + componentType = self.getComponentByPosition(idx) + return componentType.setComponentByType( + tagSet, value, verifyConstraints, matchTags, matchConstraints, innerFlag=innerFlag + ) + else: # set outer component by inner tagSet + return self.setComponentByPosition( + idx, value, verifyConstraints, matchTags, matchConstraints + ) + + @property + def componentTagMap(self): + if self.componentType: + return self.componentType.tagMapUnique + + +class Choice(Set): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.ConstructedAsn1Type`, + its objects are mutable and duck-type Python :class:`list` objects. + + Keyword Args + ------------ + componentType: :py:class:`~pyasn1.type.namedtype.NamedType` + Object holding named ASN.1 types allowed within this collection + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type can only occur on explicit + `.isInconsistent` call. + + Examples + -------- + + .. code-block:: python + + class Afters(Choice): + ''' + ASN.1 specification: + + Afters ::= CHOICE { + cheese [0] IA5String, + dessert [1] IA5String + } + ''' + componentType = NamedTypes( + NamedType('cheese', IA5String().subtype( + implicitTag=Tag(tagClassContext, tagFormatSimple, 0) + ), + NamedType('dessert', IA5String().subtype( + implicitTag=Tag(tagClassContext, tagFormatSimple, 1) + ) + ) + + afters = Afters() + afters['cheese'] = 'Mascarpone' + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.TagSet() # untagged + + #: Default collection of ASN.1 types of component (e.g. :py:class:`~pyasn1.type.namedtype.NamedType`) + #: object representing ASN.1 type allowed within |ASN.1| type + componentType = namedtype.NamedTypes() + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection( + constraint.ValueSizeConstraint(1, 1) + ) + + # Disambiguation ASN.1 types identification + typeId = Set.getTypeId() + + _currentIdx = None + + def __eq__(self, other): + if self._componentValues: + return self._componentValues[self._currentIdx] == other + return NotImplemented + + def __ne__(self, other): + if self._componentValues: + return self._componentValues[self._currentIdx] != other + return NotImplemented + + def __lt__(self, other): + if self._componentValues: + return self._componentValues[self._currentIdx] < other + return NotImplemented + + def __le__(self, other): + if self._componentValues: + return self._componentValues[self._currentIdx] <= other + return NotImplemented + + def __gt__(self, other): + if self._componentValues: + return self._componentValues[self._currentIdx] > other + return NotImplemented + + def __ge__(self, other): + if self._componentValues: + return self._componentValues[self._currentIdx] >= other + return NotImplemented + + if sys.version_info[0] <= 2: + def __nonzero__(self): + return self._componentValues and True or False + else: + def __bool__(self): + return self._componentValues and True or False + + def __len__(self): + return self._currentIdx is not None and 1 or 0 + + def __contains__(self, key): + if self._currentIdx is None: + return False + return key == self.componentType[self._currentIdx].getName() + + def __iter__(self): + if self._currentIdx is None: + raise StopIteration + yield self.componentType[self._currentIdx].getName() + + # Python dict protocol + + def values(self): + if self._currentIdx is not None: + yield self._componentValues[self._currentIdx] + + def keys(self): + if self._currentIdx is not None: + yield self.componentType[self._currentIdx].getName() + + def items(self): + if self._currentIdx is not None: + yield self.componentType[self._currentIdx].getName(), self[self._currentIdx] + + def checkConsistency(self): + if self._currentIdx is None: + raise error.PyAsn1Error('Component not chosen') + + def _cloneComponentValues(self, myClone, cloneValueFlag): + try: + component = self.getComponent() + except error.PyAsn1Error: + pass + else: + if isinstance(component, Choice): + tagSet = component.effectiveTagSet + else: + tagSet = component.tagSet + if isinstance(component, base.ConstructedAsn1Type): + myClone.setComponentByType( + tagSet, component.clone(cloneValueFlag=cloneValueFlag) + ) + else: + myClone.setComponentByType(tagSet, component.clone()) + + def getComponentByPosition(self, idx, default=noValue, instantiate=True): + __doc__ = Set.__doc__ + + if self._currentIdx is None or self._currentIdx != idx: + return Set.getComponentByPosition(self, idx, default=default, + instantiate=instantiate) + + return self._componentValues[idx] + + def setComponentByPosition(self, idx, value=noValue, + verifyConstraints=True, + matchTags=True, + matchConstraints=True): + """Assign |ASN.1| type component by position. + + Equivalent to Python sequence item assignment operation (e.g. `[]`). + + Parameters + ---------- + idx: :class:`int` + Component index (zero-based). Must either refer to existing + component or to N+1 component. In the latter case a new component + type gets instantiated (if *componentType* is set, or given ASN.1 + object is taken otherwise) and appended to the |ASN.1| sequence. + + Keyword Args + ------------ + value: :class:`object` or :py:class:`~pyasn1.type.base.PyAsn1Item` derivative + A Python value to initialize |ASN.1| component with (if *componentType* is set) + or ASN.1 value object to assign to |ASN.1| component. Once a new value is + set to *idx* component, previous value is dropped. + If `value` is not given, schema object will be set as a component. + + verifyConstraints : :class:`bool` + If :obj:`False`, skip constraints validation + + matchTags: :class:`bool` + If :obj:`False`, skip component tags matching + + matchConstraints: :class:`bool` + If :obj:`False`, skip component constraints matching + + Returns + ------- + self + """ + oldIdx = self._currentIdx + Set.setComponentByPosition(self, idx, value, verifyConstraints, matchTags, matchConstraints) + self._currentIdx = idx + if oldIdx is not None and oldIdx != idx: + self._componentValues[oldIdx] = noValue + return self + + @property + def effectiveTagSet(self): + """Return a :class:`~pyasn1.type.tag.TagSet` object of the currently initialized component or self (if |ASN.1| is tagged).""" + if self.tagSet: + return self.tagSet + else: + component = self.getComponent() + return component.effectiveTagSet + + @property + def tagMap(self): + """"Return a :class:`~pyasn1.type.tagmap.TagMap` object mapping + ASN.1 tags to ASN.1 objects contained within callee. + """ + if self.tagSet: + return Set.tagMap.fget(self) + else: + return self.componentType.tagMapUnique + + def getComponent(self, innerFlag=False): + """Return currently assigned component of the |ASN.1| object. + + Returns + ------- + : :py:class:`~pyasn1.type.base.PyAsn1Item` + a PyASN1 object + """ + if self._currentIdx is None: + raise error.PyAsn1Error('Component not chosen') + else: + c = self._componentValues[self._currentIdx] + if innerFlag and isinstance(c, Choice): + return c.getComponent(innerFlag) + else: + return c + + def getName(self, innerFlag=False): + """Return the name of currently assigned component of the |ASN.1| object. + + Returns + ------- + : :py:class:`str` + |ASN.1| component name + """ + if self._currentIdx is None: + raise error.PyAsn1Error('Component not chosen') + else: + if innerFlag: + c = self._componentValues[self._currentIdx] + if isinstance(c, Choice): + return c.getName(innerFlag) + return self.componentType.getNameByPosition(self._currentIdx) + + @property + def isValue(self): + """Indicate that |ASN.1| object represents ASN.1 value. + + If *isValue* is :obj:`False` then this object represents just ASN.1 schema. + + If *isValue* is :obj:`True` then, in addition to its ASN.1 schema features, + this object can also be used like a Python built-in object (e.g. + :class:`int`, :class:`str`, :class:`dict` etc.). + + Returns + ------- + : :class:`bool` + :obj:`False` if object represents just ASN.1 schema. + :obj:`True` if object represents ASN.1 schema and can be used as a normal + value. + + Note + ---- + There is an important distinction between PyASN1 schema and value objects. + The PyASN1 schema objects can only participate in ASN.1 schema-related + operations (e.g. defining or testing the structure of the data). Most + obvious uses of ASN.1 schema is to guide serialisation codecs whilst + encoding/decoding serialised ASN.1 contents. + + The PyASN1 value objects can **additionally** participate in many operations + involving regular Python objects (e.g. arithmetic, comprehension etc). + """ + if self._currentIdx is None: + return False + + componentValue = self._componentValues[self._currentIdx] + + return componentValue is not noValue and componentValue.isValue + + def clear(self): + self._currentIdx = None + return Set.clear(self) + + # compatibility stubs + + def getMinTagSet(self): + return self.minTagSet + + +class Any(OctetString): + """Create |ASN.1| schema or value object. + + |ASN.1| class is based on :class:`~pyasn1.type.base.SimpleAsn1Type`, + its objects are immutable and duck-type Python 2 :class:`str` or Python 3 + :class:`bytes`. When used in Unicode context, |ASN.1| type assumes + "|encoding|" serialisation. + + Keyword Args + ------------ + value: :class:`unicode`, :class:`str`, :class:`bytes` or |ASN.1| object + :class:`str` (Python 2) or :class:`bytes` (Python 3), alternatively + :class:`unicode` object (Python 2) or :class:`str` (Python 3) + representing character string to be serialised into octets (note + `encoding` parameter) or |ASN.1| object. + If `value` is not given, schema object will be created. + + tagSet: :py:class:`~pyasn1.type.tag.TagSet` + Object representing non-default ASN.1 tag(s) + + subtypeSpec: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` + Object representing non-default ASN.1 subtype constraint(s). Constraints + verification for |ASN.1| type occurs automatically on object + instantiation. + + encoding: :py:class:`str` + Unicode codec ID to encode/decode :class:`unicode` (Python 2) or + :class:`str` (Python 3) the payload when |ASN.1| object is used + in text string context. + + binValue: :py:class:`str` + Binary string initializer to use instead of the *value*. + Example: '10110011'. + + hexValue: :py:class:`str` + Hexadecimal string initializer to use instead of the *value*. + Example: 'DEADBEEF'. + + Raises + ------ + ~pyasn1.error.ValueConstraintError, ~pyasn1.error.PyAsn1Error + On constraint violation or bad initializer. + + Examples + -------- + .. code-block:: python + + class Error(Sequence): + ''' + ASN.1 specification: + + Error ::= SEQUENCE { + code INTEGER, + parameter ANY DEFINED BY code -- Either INTEGER or REAL + } + ''' + componentType=NamedTypes( + NamedType('code', Integer()), + NamedType('parameter', Any(), + openType=OpenType('code', {1: Integer(), + 2: Real()})) + ) + + error = Error() + error['code'] = 1 + error['parameter'] = Integer(1234) + """ + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.tag.TagSet` object representing ASN.1 tag(s) + #: associated with |ASN.1| type. + tagSet = tag.TagSet() # untagged + + #: Set (on class, not on instance) or return a + #: :py:class:`~pyasn1.type.constraint.ConstraintsIntersection` object + #: imposing constraints on |ASN.1| type initialization values. + subtypeSpec = constraint.ConstraintsIntersection() + + # Disambiguation ASN.1 types identification + typeId = OctetString.getTypeId() + + @property + def tagMap(self): + """"Return a :class:`~pyasn1.type.tagmap.TagMap` object mapping + ASN.1 tags to ASN.1 objects contained within callee. + """ + try: + return self._tagMap + + except AttributeError: + self._tagMap = tagmap.TagMap( + {self.tagSet: self}, + {eoo.endOfOctets.tagSet: eoo.endOfOctets}, + self + ) + + return self._tagMap + +# XXX +# coercion rules? diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/useful.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/useful.py new file mode 100644 index 0000000..7536b95 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/pyasn1/type/useful.py @@ -0,0 +1,191 @@ +# +# This file is part of pyasn1 software. +# +# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> +# License: http://snmplabs.com/pyasn1/license.html +# +import datetime + +from pyasn1 import error +from pyasn1.compat import dateandtime +from pyasn1.compat import string +from pyasn1.type import char +from pyasn1.type import tag +from pyasn1.type import univ + +__all__ = ['ObjectDescriptor', 'GeneralizedTime', 'UTCTime'] + +NoValue = univ.NoValue +noValue = univ.noValue + + +class ObjectDescriptor(char.GraphicString): + __doc__ = char.GraphicString.__doc__ + + #: Default :py:class:`~pyasn1.type.tag.TagSet` object for |ASN.1| objects + tagSet = char.GraphicString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 7) + ) + + # Optimization for faster codec lookup + typeId = char.GraphicString.getTypeId() + + +class TimeMixIn(object): + + _yearsDigits = 4 + _hasSubsecond = False + _optionalMinutes = False + _shortTZ = False + + class FixedOffset(datetime.tzinfo): + """Fixed offset in minutes east from UTC.""" + + # defaulted arguments required + # https: // docs.python.org / 2.3 / lib / datetime - tzinfo.html + def __init__(self, offset=0, name='UTC'): + self.__offset = datetime.timedelta(minutes=offset) + self.__name = name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return datetime.timedelta(0) + + UTC = FixedOffset() + + @property + def asDateTime(self): + """Create :py:class:`datetime.datetime` object from a |ASN.1| object. + + Returns + ------- + : + new instance of :py:class:`datetime.datetime` object + """ + text = str(self) + if text.endswith('Z'): + tzinfo = TimeMixIn.UTC + text = text[:-1] + + elif '-' in text or '+' in text: + if '+' in text: + text, plusminus, tz = string.partition(text, '+') + else: + text, plusminus, tz = string.partition(text, '-') + + if self._shortTZ and len(tz) == 2: + tz += '00' + + if len(tz) != 4: + raise error.PyAsn1Error('malformed time zone offset %s' % tz) + + try: + minutes = int(tz[:2]) * 60 + int(tz[2:]) + if plusminus == '-': + minutes *= -1 + + except ValueError: + raise error.PyAsn1Error('unknown time specification %s' % self) + + tzinfo = TimeMixIn.FixedOffset(minutes, '?') + + else: + tzinfo = None + + if '.' in text or ',' in text: + if '.' in text: + text, _, ms = string.partition(text, '.') + else: + text, _, ms = string.partition(text, ',') + + try: + ms = int(ms) * 1000 + + except ValueError: + raise error.PyAsn1Error('bad sub-second time specification %s' % self) + + else: + ms = 0 + + if self._optionalMinutes and len(text) - self._yearsDigits == 6: + text += '0000' + elif len(text) - self._yearsDigits == 8: + text += '00' + + try: + dt = dateandtime.strptime(text, self._yearsDigits == 4 and '%Y%m%d%H%M%S' or '%y%m%d%H%M%S') + + except ValueError: + raise error.PyAsn1Error('malformed datetime format %s' % self) + + return dt.replace(microsecond=ms, tzinfo=tzinfo) + + @classmethod + def fromDateTime(cls, dt): + """Create |ASN.1| object from a :py:class:`datetime.datetime` object. + + Parameters + ---------- + dt: :py:class:`datetime.datetime` object + The `datetime.datetime` object to initialize the |ASN.1| object + from + + Returns + ------- + : + new instance of |ASN.1| value + """ + text = dt.strftime(cls._yearsDigits == 4 and '%Y%m%d%H%M%S' or '%y%m%d%H%M%S') + if cls._hasSubsecond: + text += '.%d' % (dt.microsecond // 1000) + + if dt.utcoffset(): + seconds = dt.utcoffset().seconds + if seconds < 0: + text += '-' + else: + text += '+' + text += '%.2d%.2d' % (seconds // 3600, seconds % 3600) + else: + text += 'Z' + + return cls(text) + + +class GeneralizedTime(char.VisibleString, TimeMixIn): + __doc__ = char.VisibleString.__doc__ + + #: Default :py:class:`~pyasn1.type.tag.TagSet` object for |ASN.1| objects + tagSet = char.VisibleString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 24) + ) + + # Optimization for faster codec lookup + typeId = char.VideotexString.getTypeId() + + _yearsDigits = 4 + _hasSubsecond = True + _optionalMinutes = True + _shortTZ = True + + +class UTCTime(char.VisibleString, TimeMixIn): + __doc__ = char.VisibleString.__doc__ + + #: Default :py:class:`~pyasn1.type.tag.TagSet` object for |ASN.1| objects + tagSet = char.VisibleString.tagSet.tagImplicitly( + tag.Tag(tag.tagClassUniversal, tag.tagFormatSimple, 23) + ) + + # Optimization for faster codec lookup + typeId = char.VideotexString.getTypeId() + + _yearsDigits = 2 + _hasSubsecond = False + _optionalMinutes = False + _shortTZ = False diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/DESCRIPTION.rst b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..692d325 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,25 @@ +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +The project is `maintained at GitHub <https://github.com/pypa/setuptools>`_. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/INSTALLER b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/METADATA b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/METADATA new file mode 100644 index 0000000..f710ac8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/METADATA @@ -0,0 +1,51 @@ +Metadata-Version: 2.0 +Name: setuptools +Version: 33.1.1 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.* + +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +The project is `maintained at GitHub <https://github.com/pypa/setuptools>`_. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/RECORD b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/RECORD new file mode 100644 index 0000000..55a24da --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/RECORD @@ -0,0 +1,119 @@ +../../../bin/easy_install,sha256=F3jJyZjlA7ZCAM1dWF_skGgSXIb0kgckOOMebICURqo,326 +../../../bin/easy_install-3.5,sha256=F3jJyZjlA7ZCAM1dWF_skGgSXIb0kgckOOMebICURqo,326 +__pycache__/easy_install.cpython-35.pyc,, +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +setuptools-33.1.1.dist-info/DESCRIPTION.rst,sha256=fWVE3Nl6cnjokuGh4p-r7Z1JTwYjsFFbwyGjF4h0hqs,901 +setuptools-33.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +setuptools-33.1.1.dist-info/METADATA,sha256=JbFUl-xb-VLvxYOIhPXvkJ7BdM7d5ZzA312b9Hxk1AE,2002 +setuptools-33.1.1.dist-info/RECORD,, +setuptools-33.1.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +setuptools-33.1.1.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-33.1.1.dist-info/entry_points.txt,sha256=siaWCyzsbU9caWHkUUlimTc8e0nLtjlsS6onJYZ0_mk,2829 +setuptools-33.1.1.dist-info/metadata.json,sha256=okzad5aSySpxh3MoCgb7X1ZkOPH9DB4kSL1I_aM2Foo,4345 +setuptools-33.1.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-33.1.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +setuptools/__init__.py,sha256=MsRcLyrl8E49pBeFZ-PSwST-I2adqjvkfCC1h9gl0TQ,5037 +setuptools/__pycache__/__init__.cpython-35.pyc,, +setuptools/__pycache__/archive_util.cpython-35.pyc,, +setuptools/__pycache__/config.cpython-35.pyc,, +setuptools/__pycache__/depends.cpython-35.pyc,, +setuptools/__pycache__/dist.cpython-35.pyc,, +setuptools/__pycache__/extension.cpython-35.pyc,, +setuptools/__pycache__/glob.cpython-35.pyc,, +setuptools/__pycache__/launch.cpython-35.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-35.pyc,, +setuptools/__pycache__/monkey.cpython-35.pyc,, +setuptools/__pycache__/msvc.cpython-35.pyc,, +setuptools/__pycache__/namespaces.cpython-35.pyc,, +setuptools/__pycache__/package_index.cpython-35.pyc,, +setuptools/__pycache__/py26compat.cpython-35.pyc,, +setuptools/__pycache__/py27compat.cpython-35.pyc,, +setuptools/__pycache__/py31compat.cpython-35.pyc,, +setuptools/__pycache__/py33compat.cpython-35.pyc,, +setuptools/__pycache__/py36compat.cpython-35.pyc,, +setuptools/__pycache__/sandbox.cpython-35.pyc,, +setuptools/__pycache__/site-patch.cpython-35.pyc,, +setuptools/__pycache__/ssl_support.cpython-35.pyc,, +setuptools/__pycache__/unicode_utils.cpython-35.pyc,, +setuptools/__pycache__/version.cpython-35.pyc,, +setuptools/__pycache__/windows_support.cpython-35.pyc,, +setuptools/archive_util.py,sha256=Z58-gbZQ0j92UJy7X7uZevwI28JTVEXd__AjKy4aw78,6613 +setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 +setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/command/__init__.py,sha256=FCLDWoQEGsNexQviqbeJ4MEYGYpYVbbwc7i-9gjzBkM,563 +setuptools/command/__pycache__/__init__.cpython-35.pyc,, +setuptools/command/__pycache__/alias.cpython-35.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-35.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-35.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-35.pyc,, +setuptools/command/__pycache__/build_ext.cpython-35.pyc,, +setuptools/command/__pycache__/build_py.cpython-35.pyc,, +setuptools/command/__pycache__/develop.cpython-35.pyc,, +setuptools/command/__pycache__/easy_install.cpython-35.pyc,, +setuptools/command/__pycache__/egg_info.cpython-35.pyc,, +setuptools/command/__pycache__/install.cpython-35.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-35.pyc,, +setuptools/command/__pycache__/install_lib.cpython-35.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-35.pyc,, +setuptools/command/__pycache__/py36compat.cpython-35.pyc,, +setuptools/command/__pycache__/register.cpython-35.pyc,, +setuptools/command/__pycache__/rotate.cpython-35.pyc,, +setuptools/command/__pycache__/saveopts.cpython-35.pyc,, +setuptools/command/__pycache__/sdist.cpython-35.pyc,, +setuptools/command/__pycache__/setopt.cpython-35.pyc,, +setuptools/command/__pycache__/test.cpython-35.pyc,, +setuptools/command/__pycache__/upload.cpython-35.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-35.pyc,, +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=XDamu6-cfyYrqd67YGQ5gWo-0c8kuWqkPy1vYpfsAxw,17178 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_ext.py,sha256=dO89j-IC0dAjSty1sSZxvi0LSdkPGR_ZPXFuAAFDZj4,13049 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=k7ycyx9vEQf4q2RL_vftssWxIKu6YmOMYSNghjUGFIE,7522 +setuptools/command/easy_install.py,sha256=KkKoP6oFUjDHxiY3PiXXB214bNnilpuU_cVxQYU8hek,88319 +setuptools/command/egg_info.py,sha256=xl9fJDJ_7AJXzJeIcVHGKmpEjF3bbYhia9C-NHUSQ9U,24750 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=4zq_Ad3jE-EffParuyDEnvxU6efB-Xhrzdr8aB6Ln_8,3195 +setuptools/command/install_lib.py,sha256=n2iLR8f1MlYeGHtV2oFxDpUiL-wyLaQgwSAFX-YIEv4,5012 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=jIvjqSzUpsRU6Ysr--EQsh_s6wULhI5V4pe0QEFin1Q,6844 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=-Qt5wsE_BxHhqInN7LAoOZNwUkUHG6fBa0jinMv_Xqk,8857 +setuptools/command/upload.py,sha256=6LbdC9NWFe19tb8u-6L3Hriei-nVgtqfO7tn0Si7yLo,1077 +setuptools/command/upload_docs.py,sha256=0Ft5uo7Unnk4lJdZtIm6Nzq7hlyux-9zIYcXC8k_Czs,7275 +setuptools/config.py,sha256=OsvOeCvH4U3XQMWSGGizzJ80TCdPzTLb02d4IqMHbAo,16413 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=zWG4YreNxYH77jEqs6aR2UpLrIXQiUUVq1dKSqsVWfE,37548 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/extern/__init__.py,sha256=ZtCLYQ8JTtOtm7SYoxekZw-UzY3TR50SRIUaeqr2ROk,131 +setuptools/extern/__pycache__/__init__.cpython-35.pyc,, +setuptools/glob.py,sha256=Y-fpv8wdHZzv9DPCaGACpMSBWJ6amq_1e0R_i8_el4w,5207 +setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 +setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 +setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=4tyvck6n4gm7TPTHYnK19WBQnHtWD0-_Ibv8KDMkB0I,5441 +setuptools/msvc.py,sha256=6cKqwOxTH8pJNMrNyRLBGB6Efz2rxTTdQQJABUW-6WU,37091 +setuptools/namespaces.py,sha256=66TyxK0mtwh2Ftny356GBvXOPbOocUalrHL-kgG4Hi0,3215 +setuptools/package_index.py,sha256=0PVRMrPGAbvxjiZS1atH8kmgq-NcpuLucNoWuhWgUmE,39964 +setuptools/py26compat.py,sha256=VRGHC7z2gliR4_uICJsQNodUcNUzybpus3BrJkWbnK4,679 +setuptools/py27compat.py,sha256=m-hBhbvvdUAZY0LPHv4HS5sPGEPzDaagFLJBzJDwrao,583 +setuptools/py31compat.py,sha256=qGRk3tefux8HbhNzhM0laR3mD8vhAZtffZgzLkBMXJs,1645 +setuptools/py33compat.py,sha256=W8_JFZr8WQbJT_7-JFWjc_6lHGtoMK-4pCrHIwk5JN0,998 +setuptools/py36compat.py,sha256=VUDWxmu5rt4QHlGTRtAFu6W5jvfL6WBjeDAzeoBy0OM,2891 +setuptools/sandbox.py,sha256=qvFtWjnLM4rtEubgfmnjYzI5Fsi0LUZDi6aXJbzQMpo,14356 +setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=BVt6yIrDMXJoflA5J6DJIcsJUfW_XEeVhOzelTTFDP4,2307 +setuptools/ssl_support.py,sha256=Axo1QtiAtsvuENZq_BvhW5PeWw2nrX39-4qoSiVpB6w,8220 +setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/WHEEL b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/dependency_links.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/dependency_links.txt new file mode 100644 index 0000000..e87d021 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d +https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/entry_points.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..41df376 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/entry_points.txt @@ -0,0 +1,62 @@ +[console_scripts] +easy_install = setuptools.command.easy_install:main + +[distutils.commands] +alias = setuptools.command.alias:alias +bdist_egg = setuptools.command.bdist_egg:bdist_egg +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +build_ext = setuptools.command.build_ext:build_ext +build_py = setuptools.command.build_py:build_py +develop = setuptools.command.develop:develop +easy_install = setuptools.command.easy_install:easy_install +egg_info = setuptools.command.egg_info:egg_info +install = setuptools.command.install:install +install_egg_info = setuptools.command.install_egg_info:install_egg_info +install_lib = setuptools.command.install_lib:install_lib +install_scripts = setuptools.command.install_scripts:install_scripts +register = setuptools.command.register:register +rotate = setuptools.command.rotate:rotate +saveopts = setuptools.command.saveopts:saveopts +sdist = setuptools.command.sdist:sdist +setopt = setuptools.command.setopt:setopt +test = setuptools.command.test:test +upload = setuptools.command.upload:upload +upload_docs = setuptools.command.upload_docs:upload_docs + +[distutils.setup_keywords] +convert_2to3_doctests = setuptools.dist:assert_string_list +dependency_links = setuptools.dist:assert_string_list +eager_resources = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +exclude_package_data = setuptools.dist:check_package_data +extras_require = setuptools.dist:check_extras +include_package_data = setuptools.dist:assert_bool +install_requires = setuptools.dist:check_requirements +namespace_packages = setuptools.dist:check_nsp +package_data = setuptools.dist:check_package_data +packages = setuptools.dist:check_packages +python_requires = setuptools.dist:check_specifier +setup_requires = setuptools.dist:check_requirements +test_loader = setuptools.dist:check_importable +test_runner = setuptools.dist:check_importable +test_suite = setuptools.dist:check_test_suite +tests_require = setuptools.dist:check_requirements +use_2to3 = setuptools.dist:assert_bool +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +use_2to3_fixers = setuptools.dist:assert_string_list +zip_safe = setuptools.dist:assert_bool + +[egg_info.writers] +PKG-INFO = setuptools.command.egg_info:write_pkg_info +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +depends.txt = setuptools.command.egg_info:warn_depends_obsolete +eager_resources.txt = setuptools.command.egg_info:overwrite_arg +entry_points.txt = setuptools.command.egg_info:write_entries +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +requires.txt = setuptools.command.egg_info:write_requirements +top_level.txt = setuptools.command.egg_info:write_toplevel_names + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/metadata.json b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/metadata.json new file mode 100644 index 0000000..b61def6 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "python_requires": "setuptools.dist:check_specifier", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*", "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "version": "33.1.1"} \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/top_level.txt b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..4577c6a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/top_level.txt @@ -0,0 +1,3 @@ +easy_install +pkg_resources +setuptools diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/zip-safe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools-33.1.1.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__init__.py new file mode 100644 index 0000000..04f7674 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__init__.py @@ -0,0 +1,160 @@ +"""Extensions to the 'distutils' for large or complex distributions""" + +import os +import functools +import distutils.core +import distutils.filelist +from distutils.util import convert_path +from fnmatch import fnmatchcase + +from setuptools.extern.six.moves import filter, map + +import setuptools.version +from setuptools.extension import Extension +from setuptools.dist import Distribution, Feature +from setuptools.depends import Require +from . import monkey + +__all__ = [ + 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', + 'find_packages', +] + +__version__ = setuptools.version.__version__ + +bootstrap_install_from = None + +# If we run 2to3 on .py files, should we also convert docstrings? +# Default: yes; assume that we can detect doctests reliably +run_2to3_on_doctests = True +# Standard package names for fixer packages +lib2to3_fixer_packages = ['lib2to3.fixes'] + + +class PackageFinder(object): + """ + Generate a list of all Python packages found within a directory + """ + + @classmethod + def find(cls, where='.', exclude=(), include=('*',)): + """Return a list all Python packages found within directory 'where' + + 'where' is the root directory which will be searched for packages. It + should be supplied as a "cross-platform" (i.e. URL-style) path; it will + be converted to the appropriate local path syntax. + + 'exclude' is a sequence of package names to exclude; '*' can be used + as a wildcard in the names, such that 'foo.*' will exclude all + subpackages of 'foo' (but not 'foo' itself). + + 'include' is a sequence of package names to include. If it's + specified, only the named packages will be included. If it's not + specified, all found packages will be included. 'include' can contain + shell style wildcard patterns just like 'exclude'. + """ + + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) + + @classmethod + def _find_packages_iter(cls, where, exclude, include): + """ + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. + """ + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Skip directory trees that are not valid packages + if ('.' in dir or not cls._looks_like_package(full_path)): + continue + + # Should this package be included? + if include(package) and not exclude(package): + yield package + + # Keep searching subdirectories, as there may be more packages + # down there, even if the parent was excluded. + dirs.append(dir) + + @staticmethod + def _looks_like_package(path): + """Does a directory look like a package?""" + return os.path.isfile(os.path.join(path, '__init__.py')) + + @staticmethod + def _build_filter(*patterns): + """ + Given a list of patterns, return a callable that will be true only if + the input matches at least one of the patterns. + """ + return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + + +class PEP420PackageFinder(PackageFinder): + @staticmethod + def _looks_like_package(path): + return True + + +find_packages = PackageFinder.find + +setup = distutils.core.setup + +_Command = monkey.get_unpatched(distutils.core.Command) + + +class Command(_Command): + __doc__ = _Command.__doc__ + + command_consumes_arguments = False + + def __init__(self, dist, **kw): + """ + Construct the command for dist, updating + vars(self) with any keyword parameters. + """ + _Command.__init__(self, dist) + vars(self).update(kw) + + def reinitialize_command(self, command, reinit_subcommands=0, **kw): + cmd = _Command.reinitialize_command(self, command, reinit_subcommands) + vars(cmd).update(kw) + return cmd + + +def _find_all_simple(path): + """ + Find all files under 'path' + """ + results = ( + os.path.join(base, file) + for base, dirs, files in os.walk(path, followlinks=True) + for file in files + ) + return filter(os.path.isfile, results) + + +def findall(dir=os.curdir): + """ + Find all files under 'dir' and return the list of full filenames. + Unless dir is '.', return full filenames with dir prepended. + """ + files = _find_all_simple(dir) + if dir == os.curdir: + make_rel = functools.partial(os.path.relpath, start=dir) + files = map(make_rel, files) + return list(files) + + +monkey.patch_all() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e2bb3a139c76e619e035c45372e29b63d988073 GIT binary patch literal 5962 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 S_GY7PcFYZHbG_49>-+}=nz*U} literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/archive_util.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/archive_util.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6afde687d5cbbb3e940cd160e57539655285e33 GIT binary patch literal 5475 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/config.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/config.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd20aaa5fef487c493f975790b2d95e89599a5ad GIT binary patch literal 15019 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/depends.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/depends.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8415f5736a72f678c6cf54431b11498656fe683a GIT binary patch literal 5631 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 J+UHyC{{oyeU5)?% literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/dist.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/dist.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a611e9744df71e7a6b5690183691e12283a2d7 GIT binary patch literal 34591 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 ASpWb4 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/extension.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/extension.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb30a53130b6813c0b98fe2926c9812256837c75 GIT binary patch literal 2061 zcmaJ>UvJz*5TCVue{+|FR+N@jWuX<-snkWNQv1-NN`)dJ6eJP}@Qda6_Hw@XY<G9v z=1$2|c;;L1z#CtIuVL}VQ@;XF{Kj|Z1gT<^nVX#*&(5FU><7bPfA=?~{%jNdO_!Dj z`8mk^0XD|Jpp+<RWI=)0=p72&jqF{LTN~M-v`zC41sxJ&n0l0UY2Krthkc92ZTbbi z`=t65Y?11ba%nc8*^th0&o+HC?$Ef)M&N3j&Rq(I(DrEDueJCTw$Scyp!=h(w}_hd zMxt`(QSnw_19^C)Y*=PRWaFtC$85rjPq#oXK;{`3T$~XtZj&WC#nvGNeIyW!m<dGe z(f*Iw74ob@$9>XINC@$BCg>;RvOj7sKkrMdACxV1CJ%I}WHOO27IvCvGLABN2*td} zwN+!kHeG(WI`zLwj4f@F8vn3N(s8IxY}K9Ue4gT<>NU!Pmm|08hvCXi7;3bSs@~Tp zu_|nmXCo18#r1`3lKxJ*2ZMi}KD6`VVUZLMlFZmBO&>f~kDiRJ${!j;Ti85L&1Dhy ztIWWmUo5IYIE`MbaOHQv#o7iVuPt2Xn&^t5XbH`QY%0sg4(K_^_+Sccu3;0Prf4m& zP#2fm?=db=L6&Pw?2kH}(mI0W<3^Nr8d+HyW#m0Sz9%P13NguKkw&qS`2^}>ak4&$ zU0lqo1>!n=4>DhXoq9B@yNw{u9d30f2u+>2ET0NGg%Ywyzq)8Up}Fo}wOuU2G?^#p zUKkb0%aK>PMPBG3JfbH}lvNk~$r2leqgLe^l};)zi{`58n7q`nGL;wUBU3rYZ|d%> zSRY>WF4!HA@xaJ^Uo5XQZvBndm~qRCjhJfuzJdVQp2N$qo&{tA&=xni(q~9X&<xok zZI_N6(vP_68T!zoGlwkZ&Li8RS(~R4`D3WgT(TXq-MSX=*5hJfFu7isK%TeG@~;}m zE8MTzu+CDxN$gZ|Kcw39(ny=j|D4;Yk{0Dqw(*lj*-;rCsf*8ic`!|koU3>mWr>+f zAUJ<xWMdhXm@&QbUKT~VXq**VJ&5z{wc?>`u0AX+M}otN(m<73#kr1bHJhB$UPVhc zzJGt|`EgM!9Y0>SIHS9xehv7ly9uFcAtI%#-lWXpdYr0G5ow!5Y2|2Dxu!g<Jf3FF zgQ2g2jXeDxexOFiL4Q>S9({d_O?YxIuu<I#*Lj2pAY6wU+C1d1N3b<Kn$+$&p4bt$ z#dWd#^b&af=i|Lmn=#864MToi=J~ixSssMpt1?R0C!H`H=P@1~hN=FD*+q=CRD+nq zkRZb|HxO-S(AKPrLCs<eKL?p>VDEe#FmqMsyW~(uda-==ZE37blVc?#snt=LMp`!6 zeI~h~{770E8CayN&+s%DtD^B9DlKu3{+QV(%<eFISM+yr@C0PIO#`8MKibtd@uP2m zRomm{t&Veaw%6=~-A444)&OL6^^#^Y1i{UVH`nLU(3x+N6Mvq+R;ETr(4Obnv07-J z?iy%8zkY&?g;pn($M@DH)jMp!A-*e@s{3@+$uGIub)^Sl{pajDyY678?ObuMUH=!( C0sGwm literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/glob.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/glob.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..406334fdf7e0d8c555f4320c65bdbf735f042ea5 GIT binary patch literal 4149 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/launch.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/launch.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..089ce3f1f7ca7d15781aa331ca38982367183f45 GIT binary patch literal 882 zcmYjP!EV$r5FIB@vYXvS2!u*+zV4x0At3=$K_ITEs_1Q76uGh6b(`3c<E+@#?y2x8 zJ@8Aua_TQ|Vw|m@PUdOsc{6!4@!n*TKfROkc?|Fy9<2!dk7(^D1OYHdBp@QF2+Yyh z`4P+`5HSb}KadlHq#zQwiNL-G8N)3A!JN}+x<1Rl@J^Qt<`$BjtlYwA)|OT^j-eM0 zOH<ce3sxyD8NYPW=B;#H<BX|VrdoDkjBB0cO(O+cD$Z2h80%*FJ!*vGGGJIKT88!+ zt-V8VD8muBMy&+)w|Ib(BiLY1y>^r=QWP6+3H;;X$<GM(ANFZr;Qq)_a7fR<VMYvF zEYnxI#rj!jcpJkehU)<ce1~uw!4^}7u%Z12^FAv9m%}E34G9E-wNIy`^-0cfeeHJh zc$kjDIj!0mw^z%vSKk=NQCu?R*n*3mej%l1N-xa~PDOLqSzcAESs%M6*u5VV#igob zQ3Ox(`oXKY(s-5?g)n7N9D8aSsn_(}p6hjVu056CWjP)BaZy}!s&Y!V$d6Htr$LUV zLY2;ESJH9ktRFbkpw(L1Fnv$0<iclGHWe?W&+z{?D8mjgI8FU%*IzHl4}+|>3A`kz zD15pL&qvzWy4Y<zEsc=B!0us*Kkp7*-5fTmIY40!n?86WU%wSjn#2G1=CND#7jV|B zd~7>C!5ZyL1V|{EkhFh>5sRLY-DCGLW)p;IV#A%XPXgot`Vb9Xkn#vZK|eUEjp!=* RAu!sIkS1d?j>j*?<S!&}-OB&~ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e479f50078b3fdbe178741b49870d69cab908f41 GIT binary patch literal 2557 zcmbVN&2Aev5FYNXq}5uo6+5*9*G3opL7@VcfiysZq74irP0&N#qA?I)fnXtPDP`sT zQAjG0g%~|JhaUO>J@nc`Ux`3ZJ@plG>I`>RmfbWhLV3m{mmChi`DVD)ZhM{IIRB#o z@Fy%a2m1#oa)v4b2v9SKEJzrn76djh8rzUKkk%lm6=MgII;0H<8j!jWxW#M@k|qRA zco@|oYQQVB)d1dra~lE=XI+SzX0{33HnSE)HF(tZ=BM7hsZ@Cy&w1p38_(kGrpiC} z<#aO1h5Ewt{5`)PMY5Xlhq>?vdG?$O6=x$q$_I)|B|XnOdKybV&7*0;ebJ94mwrF< zze&l^*FxaFJoCRlRZsEX&7SucUL3kiHy5Ykz)tc}*V1c0@L_+Ta)C!2<$0pFMqGu% zc*cbchaykINq=zCAMwKhS*e<ZodXnk3l&FD5kb^=SpzNNg1924kwa(%4uOD>Q6D=E z1jN-h?#EJ1Rh-BxJ`Bh@H3!8;`3^;1N2LJ93|``&1wS(k37{o**tG;L(=|?)?>gF% zJQ->`l_Tx+#Yk%F<i+nGTDa)-SNkfR>`&s!UYtqQPm;ac{MMaF@qAx$HJvC#K`wWb z_?RLU@>y?ks+)*gXwF$DuZ*i~{^7sfrMFnVxD~ld@{sobk6Sr$Hq5)WaB;n8lJZE= zWeU~Co?fAYQZ6ON>OGvOJp1^qo|PNk*|%E6kEf&mbk2Zgmfl!$?d_nM<%iw6cEd31 zr#uX`7lsAvvEK^AXVZRCd=aYzMu!wdWeFRD5&<OYsIH+%>a<wPZrNsTfWt+jxE!F! z+o=A@Yh?5*W~gl#T~fO$1w?HZ3E33HiU$KSMvZ7phu%YxzoL4HG&W4eY&mIy*reon zgtV5v=_w1wm^+wFHjEwO`#FOx6h=F1a1KSUUi2&wKY?n%*ah(msHU;+(VjCKUZRN= zGJ&Z`$%#IaIg4c-P%Rj@X*Hc-mFZMJJeoHiP<<NtubHoFFGQ?((5~uFm}kjpcU89{ zOkWWnV+QA0;7%nEDNRf!iZ#5YcE)*}>D_QqcEa#@8YfXvUQAG>-d_I9XM<!K@v{DC z?;;_C>tdRj1MvK?^2G#Dub6UG+H*x&(2y;QgSA`j?m8xqbZr<XTn27sNi(s;8bcT# z@34y^iL+p@Gl$htwwZ^&I%~2uwqwoL7l-t!GX{({U?Un(@J-+`Xl39<+eCR}#v#D$ zQ&0@X7TkZb17}#=3VPU}s@PNLpZV~(2>%!f2ZlI5!t67%yaqV=_U$1&CYDjTYzVrS z*g+L+R^_b#v8?t|*ZEBGED|+ZNeBdMRfx;*VAZ9Pq}k*Oa>2$M0^P%<k}?z!IR~YK zNUpODHs8HK@D2MGVA{BK0p<w~@G(F<kj)4rzP}}K2FMbg+eB>4B!bP%6OOYzn!W$z z6F9Tz9ifj7oYX<wE&G^ZIBzh&TY_dC2CJ9JiG`_wPi0>zQNXjcfamf;@e%rJ0M~WF z)BHIv%Vn@uE-Vv52HpjcuR_`h@%>p&jyq^oQgs7Fk#KAyALrZ4SYF<MrBrN?EA-?D zdLo2RYMa#iq%K~Ri>gT!CZ3d4bM0EoGu5rTq8lOQA(rA*ss!dC?~yj&#Rs@aHy2-u r2f9;|tyd+fpokV6qf<;izsV2nepyuhyF@v2@4D4N4sBX3dvoP);p0TE literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/monkey.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/monkey.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1c516d5b25bf3276e3964cbc2fe0552079b83ae GIT binary patch literal 5037 zcmbVQTW=f36`tKCxgtf066ITvCfYQq8^RD3+eu@$hEc;8z(t}6mK!&V28$JUD6O>I zrDvA1$=X2Cr1w7LrEf*w`jDT{U(o)A?qge^&@U*Er+()Qm!gEAD7w<lo}HPU%ej2# z8(v&mYOMT8$~)(U_=lLgY{=iot^bK462eDmiO3d-C42}*wuSGMaz*%+QmzWWTFN!y z*GkzHzAGYpQW4357}SMd7Z#0G6-h%37KOiP-Z4*8_)W2gnU_R_0bKDp<Yf^ph^WqT zOGFJ3Ewa2KqNa$JSY8zoy0uttiwI4tEU$?OuWKxy6A}K;vwWVmwbQvUS#NxprH69t z4a2;*AE$d>*7u@V=c7DMbhmK~Rfw%)3uVVDmg2!MQ+Y7RqERAI;pq5zj~eMB{W-Yr z;?@sP<U+haX^8_{d}a%EN#u@5-ze)V;-Jd)?})r6()v_m*z-$EyuiN@pIKO?vo)K7 zrlNa?rl_ERnRYtX)|a%pN}S7qs-l*QuWoMUgW={d9&W^`&ch_xcwfGIBg$pAsbxMI z=2@2Ld2zt1=nlul!mT76>_*}3Z_q@z#bkX?=D{dsJ;|thE6I9cqHjYmJv(mEh&9iY z_N1c46^p$j)H=w=L#d0kQv(FtR8&n{^T8<X<#CoiM%UuP>7M;*TgO&48nu>W+2Lq- zvQy<!_0p-YE}=><pb+*Y>yp*9)e7X9B58RuTRp~$@$S#rXa}Y4??L~tMQ)QhNQPjG z14kUd?H#Jo+vM1=)P<Lh$gAQ7*ZvFxkbhMtzu#6_E_=Bb?uDcqPsxp$tL6Lh#MivI zkH#bmBN;Us9<Doy&ODjwk&@cW_ru&vGcUtOYVIrfJVzI3&NJ4V+6VpT#^&MrvC?^$ z#hDsPmn9SHZ==9YK7DQKe+NQ96YwzFr$Z|E*m}ybztgdc#)%JY(Q7b`iXcE!9;#eF zi}QW7*xh#ur<dq6_WG)RYfq-~`B2?{n`S4A)GWuETs~z-<0o_OR(@2}XJI;ddnS7O zq4vT=$uJswyHchmuw~@!j=gWGPOWfZh9NBC*D%jOWkm&x$W<HDt2GqG@*S<EB4@m> zRHix=1)u~Bk)~A|Cc$o~;m#F$6wW~Jo!OXLME5sv>tz(ety^nO(`s7{t7&mtkE-dS zEz`|_@ms_-00SC_yTQc*2#gSbyF(#{4+-u}O~pY)c7wq0&=RRFY>S$gr_E@5$(B?h zk67aoT@gSqBer<NzY$Q*kN6vcO?+)eM05L8^OuCA^Udc@HUE{sb+#USePP;6>tR4s z|0WzaK}4He5C?S;G(^5AJ_D}hO@2Jz<n=C1^*|k$Mc)zkK0Ple$e^PoanPbr3tHmo z>(&#hS`i1UrRE^a*Q|&D`2o{l^KEfh6Y8hdNe8Y(>nrG#uki}t@;jZ2TgL<t$7G;m z!kuG6)?<p8W5S!`B@~Llc(T5q=R^J7&CSt};uioqjJuiI+f3wM*c)$7UY+@8x0ekD zVH$OJM{yDb@TrcYUZas-r(zuiV2&$1lBbO%b8Xqk9UVn(roKtVn<&agT2%QZ4@Eu7 zMw+K={6FSAr&cjQ;odd-P#5W~(#sTLL63FOJd%pwD2UU3R=E8*jgWbYg?^mK1bMZn z^|G`d?-fhi<L!r!?oP)k+V}21xbwpg9tV%^Z-2D&@bO2FJ}IsQjAj98PsO`P$ryJa z^DqkYFnFer?}FjsUO;32&z*T)6&ez#G>D4ky}8kg`V3Et`u!4G3)dukUA$=))X!8f z&_}(1kR%S1cp{?!mK|at01Uqc6bfRkM>4p2?Z%Dw{8lPuq=RRnlKa_6OTRu7i<%ky z42l$WGZmC~9V*sc6vA#fEqfhhZ7QvsH>+l~Y}ay~bzn^!SktmEIO=_T(WB4Gi+uMk zZv6@hiU4LN;3OneL|{`E1h!A^Z4(>vPHWi9GaxHc5?6bV<kL}%%(SsR&iAu)bM{VZ zBb?moRM}V5CT1&^PY-7N=G?sQKb#tNP7%yyDA?2n3W;0O9)!d1v%QhO&v5huydWi; z?SbWCOFy^8E5J-kWN#7eEFsK*q`uBv(10$qfFw={z9s_XcuL~6$zK|jj-O=eFjUzn zjXXB3_vY1`?|U1b*}r$)8>%={q^0ZKYu#%e%#2i&B7+~rDoY14%{Q1d@n|ybWfAdB z^w;5$<b+MmO#a#R3@bHM!HaV}XAA1!Aqw`h2p{uc2tP$6Bj1m;hXqO<t8h1w$bkFd z5msf=J|oB$gGR?Pa5BXg#t|wyuDXneA};Xt)}!g!dg><ixBS()4F<fyISaD!$afRm zhL6=caMy~XsJ7>zpo`2mGa(HO`w<0Z;!LPtQZi6!Sd?g%jf}yp1f7T~J2*y=y`0G( zSt-Vci97~rIFMePdY~mlE)Z}YkrVK(VG{NvnZ{7Ahs^K8G>2U?74OCHV{b45Z`+mV zt+V9FPzfH90^%r(Bc6`Kl?)1#mjs0C@IlF7jTwsij7D#DDus(Bg?X-u%2B8^^QuVp z!%>nKE;tr7q1WQvTK&e!MvD4uhs8p<<TC~+8oZEzdj15u)s)VJ+o}L02oGj-kOGM; zLY12G8(D$5F|-X}*izp^C4A==KZ<$}sVoK>%QG`7qCUUFZQ|A9_a5H)qA6a*O;7zV z6qp7^1<m|5WOH0XjV%rx%5GrVJHHg74=#$3tcqVSzaiLS=8cmgR!1~_R^xJwEyiy# zC&z~iG&&Y!5l6>+y?lR?wnYWUufv8=UkJ;xK1nU{qcNxrI>Of)U)S-^U(*pB#>_B3 z;@@W-X%n61<i}@RlTw-{*QA8RXHEhHK!*noO{p_WrT1anQ<={Cx%Y9bNASqISFTLs z-lQBHR0*LbtrJe(rTkR5Pmq7JXL_s0xCvF0=}GTIb#;n@qDe3-!b#Z{DG0tZ<!De8 z&Hzw4c6QMO;jiEj9D6T;lqT+QEUJ?3U$ACj3Jux`%dkP|Bm|k8z~Sgf^qAL5>)nP= zBO@B<3l)MCj-)-{i(&2Tu%r)mUuY?cd+@ch@kB!vRod@Ozs8Ticj<Zc-Jr07P8BCc zA`nA%TSdDsTx4htx<wQ6hU(Xf1z-cig}Q@oK1W?JRI(pG_v;jb+*njd1o_V*I(O4t zCIATTil&J+Y%Lt<KcL1O1S*%THLHa~0Ns<D(~$gcOycC!Ge6?w;>=gr$Tv&kG2g)S zq-^k)iG~G7JpvdI3cvMqB-MDXVlg0G1fc<z`z;)?f+XGzvLU-CasumY0brTKID?`F zrib4e4EFHP2!)I7=Ac3hDC!5;HAv=1c&G;`j9sq2%US|{Y*7Q}hW8+Sfm>fjA!<## zZCC8}Qrl_Uj=f@?vzDwXr1__!Z#owWHwdDv7X+NKiuQ?CO0H?r)HZsnCKZpUpdSYO z#&CS?JEWd4=e_x>bCE+7P^J6}#+2*^0knpR=qCg|!ZEjE62fWBY??5S*ER=+GX{g7 oR1D9%&8YVl`qu0wJYo8Wy{_0zyXH3Q&35xz(`~kztIf)P0Ok|FZvX%Q literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/msvc.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/msvc.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1301f04af81dd3e2ed8f0f642b8e85a143358fc2 GIT binary patch literal 33572 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/namespaces.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/namespaces.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56cd8593d21a580e5720e80b60f53c3972ec1114 GIT binary patch literal 3875 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/package_index.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/package_index.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff6ec9780272c04bcdf7fc8887310eba3f26b0ca GIT binary patch literal 35449 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py26compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py26compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd17c6ea3c8525d10bb26b5a9c359fb73501ef72 GIT binary patch literal 1065 zcmZ`%&2AGh5FYO)>1LA@1m)*cS=?5l35rl#p;93g4n?R!L<oqGwwu^ZOn29d?NCzD z6TAu_#B1;rd*#$u;KbOQmV$((8GAhAZ+<@C=ybx%pE>{P0sMpu>nfffpy=<Y7{CxU z0p>wUU`SxT;!Gb>4>BKyK9CprEvWGt9EPAC10lr5V?g~Z;8jlGC946e!zTo604MNf z30MaX>!1{{09bS3THuF}29Pyj*tGbo=lEY7ehXOJ#W$hC_Fxb#ANRu@nH7l<BasR- zr-NBhNM-1ORP^cGOl3~{-F2GejPgXKf~)Wpn}ofHlz}erjY%eBVy|%FV4UpWuCJpq z03QH85_s*w3BU=l<{%=+KSGLYH>dlHESvq!J9KMmOmVN*8_g!VTe$RHsU|(4^^Dty z?fv-npSm_|T@ENs3|I6h(G+_bPdTGTQYN(GlSH90<@7)$lZ@wv9!+^pv*b|Z6Z-tw z6RP;z8P`U49nwSTqIHttlm8B(ij9b}9Y<d2&s16lXDPmcs^k5y`#qBty+RagBG)EK z)3ptLcas?|dzzbBVWdp;#bYt=ua6xc*nPRIjS@wChT5@1t)YU(6{41KKegFU?dhBW z%Y+rjfDNwZz2^!-&d7Urs#F90Ww4bd*@z|EH__54pjxOfwj(n87vfB^S<3%PVUb-5 z`}Hf5s~<lh$Tk^7{+=C&%u=CE8N_jp^NeEz4dZwLYpqs=?cDzqrrHR-ilS|oK%5<U zDnLUuQAJ_76vs@C<GA$oT$gPmAr+%;ktod_Gi7VnweUzOsmey>ccUxY@3_)J=CQ~R rWZA50!q+a%g;Fe$YB8v)*li!Lw4GMNYkNLfAsuqfZ-<x2!t#CtpM3iM literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py27compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py27compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1630b03e5e6378e5af435d389a2f91dad05ff652 GIT binary patch literal 875 zcma)4v2NQi5Ist^<tQ>-7%keN16Ko$4HyN|p$!TIMKZKTfMn7lFd}W!mPCQ1gE;7x zd_sSrLw|{Dr~E>v9%T<gryg|2BYF4k?oqD?gZRZyAua-d-_R1=!)H|U0}TgA(GuVR z6a-Rq_I?0q06YZVfhUX!K@eDXfFHvKKz{+=Yh4Af?!qJDM6d}!ZJXd;bJA~}V0z-y z(+ETa`UylIsw3d|#Z47-0=OOz9%k{mDr;uttt_P7(d%tpD{bjQX?nG@D^=0i<dm|C zQ^9m0g^r(b8kpyPIxl|pdX8!aXuboi(GqwhSb{uU#uVj3-iZov=;h7L)i+@bTZ(s7 z3%k{LToiOA7#G^mlG%JEt0iT0+2m}*Zqh)EiHnxPW*9vVTvYBsT!;a`KzFh9pHEX; z*3(+nC$cgY15ZxH`w!d-H8ohOwn`PI?bf^5Y2Gj}sdsL8fX@!i9Qm1=K|4A^|2ahS z-;>X=;TRDQVB<jhblvgBce^(|?|JYM>b@9p-LJCR-n%X{xs*A<8!vwK+EDFbkZNRj z-T+}Sa{mvm>whd*dCS?^TZ}fSp#2k#iSD<S*hN{!Ri0%oG&|$^b-^tD0cF#dOYZPp zq^dGmEtKnFgcYTGg_A90A@*BQ<%;90rNhE^o*}PU(>x+togVAbY9TVi7NXT-!-6LO g8!Z*z7UIlPWL~1_1qn&QBpL=ucSJ^H7``EY0e-v3GXMYp literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py31compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py31compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dba0429ff00d1bb20d72e8e9f8dd952f0d57352f GIT binary patch literal 1974 zcmZ`(OK&4Z5U!pXKVv7(5;o)k3<wEEu!&Z?h=&#w2@v9vMI_o~=Q5gjI?mYhFx~BJ z9PNp~m4AT*zlDD=S5El}aN?`Bon!;F-8I$K)z#HsJ=VM3cJEgy^E%O=bYrZ6-^0{v zf+)dXP(~D9@q$7@i9?A?1BXI~rkhsHqs*n;qtK(gMq!P_)8Zj{vQDEmDMLaCwpOF8 zu~2JL*d&qE+15|EqejmPLElf;tic9lEy~*zw%OF)m8m}#rr_8Tg-Z)3TNJkF>!e9Z zi>-mm4qdo>-kOzyhFuDmDOn*&G+g1QB^~<Np$*R+2`c}hq(>v7!XZb5J(4|AJ&|-N zS+@S+sGx&j^^)P*uT}=qME$ZjP6yFxtaR06!8kT2fukI#C>LbTSIc&DYEH@`%F?4g z(6xiVtoH?`eh=gYeD`S7AoUs<@Ge~l`caS(c1zI6VaY*I+pikqEH<zPW}+mR^Edb7 zT>AM$8~;f9bE#h{f3694YPdup>~O7WKZ&!6{7R`(DUU^>@(Nh^om30UzdzeG`FMAn zj_;*~HgT5S`$#_gI5D!^)zVDHrYtjklO0bV-0zn;P}mtyEdU+Z(R>|=4t}`d&Y{f5 zrHa+`%T&p}Db=*k`-{QY?P2OqK@ciVI8fvqlFywdA192*NFk+|uMsCw!}4I70H~#w zVBq|>wm%<Fq?-CV&BvMa&B6yiSvcV%m`0u%KaY!eAl1&*!KZ1K`38qg=_fLiM*8uw zk?MJ@k`Mf&iSeJaMx5!=PX|S*r2qK9kBfwFOS4#AS&|I3_RC^sCoPNXTVBcu2EpdU zHW)k~X%P`8!4TnJEFnJ##D3taCbX(1Kk7KmWYx$=2vR=gcxss)+i1>6+iFHpTBIh5 ze5|wwLZT(kxBeZOorUI0-f`Ai?;2p>+HmfOu#N;mEkl0$(pD5n0IZ_u9qej;A&K+t z|Gaaq*tf1hkG~vEd+8@&rt4fCLt7Mp1gUZ1aHF_Go^fr@d7m4FE&XJM7qr+-Xa6wp zs=7Xzm^7>EDmO~X8Gwz)2euXh&px1P$g{qgj%C;cbIPS+Iiupfy#2Z+UU$Zjz6<X( zqfEjT>!K@a{|D?$e?MqcILu`iMO8bB@-mrZ%y**bhe@2xcN$TYl>I1DD=@8kOkQQe zg?fYV%{K8jz-Z2kPOa{AypC(7mo6li9KTBrKp)c%UhvjqOw9lT(HCeoby5K{SZ)Bm zQIpqm<gN4(FC0z+X#Fw+IBXlK&3BWckScJi<^;LMl5qJD^>ui)S9y7y7U)A>tOmNO zk5Etped{q*cX2#o?GM?(SwGnZxauve(bYEbQCl~7uA5-Ba`jZJ*TGl74-E{kwji4I z?dvvOEq%j1$=L8$uOz89oF01TT9;E$aW}I#s#UgGFOP=kVCoGPvnN&OR4R?KMtvQZ zVJ-Uh*@OEx9%O?xE5S#zIDgKu&~JmFJvtr7bvE&=yUuFeb=JVKbn9-*2}Irf2gl*E Ai~s-t literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py33compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py33compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c447bf9197e1372542e3e43bee5dbfd824e3771 GIT binary patch literal 1291 zcmZuwL2uJa5T5ngj*}*89w0(FJXu_drPuZV5+DJhKm-@^B+BEx=Zodq+u+pkn)Oy{ zs`OO;3J3lJKY?Gc5*Lt=@)x+k%%+73vGR<^v*T~RotYi<dY%4TA--^c&v0(JXg@${ z6sjB_1|>lJ!)6e(Grt3|V{HdY4pSFm7npEh;z7<Kci{vhe0Y-Mw-0X+!w1oV6Ap0z zq74E)Ef9hAbSTwM6f7_=j3Q=uQyd!a?|NH}k2<o>WG=!~jWgOmTMilzP@3zg5N^qh zSRqM=QpQNcav|FVq_PwFX7%Ar3qnjXIjvKj5fCkUlRQFcdZ^|M<^YL3|4zh+m`guK zj&U1N?kNw0-hpc2>+8KOJ*~IuqTVQ~MyF-DaZB91oogYt8lewrEoIr9H|yDr8%qY8 z^~?lGQdEUbk}hSpl-SXgU#M=L1!WAQXay)P3RR~0gh~TUkg#PwVK8y15yuQPr?Z@T z7#w4n(2vzY?ZV+(m}7tg`vB^rJvfK8V-MyYXqTG0?}2)Mx`9O<tWj}naR+Ny*h_=C z3xi|d`h2*B$fv*hu<wBS0J;T}0P;4%wqTBdEgFCm2A44Z>pM{OArIgbfm;OKCJ>Cp zBfMl7^Djp1M4hAi{}-an!}aU3{tL$<S`X{AP~o0bp-8h=p{#{Ubs?*;s6snDa(5y! z9j?>Ix?#JD3b?R}YP|q77aXku&>Stk;fgxOOO;Azw$G-ONt~Em7+#9X@Vsc^-qY=u z!({vUlYgEKM=#>;@V^(s(c|G`aw)<!y`s`$EL5UrwP+M&hyvx)mbZ&@*cdM4p5e7t zaaSB_QRN~}@Jz;$wc%*Q?NU}_`@bEurJ}yunbC-ytm0P_q5^(}U2uHnJF89y<r+iH zdaTcU?xX$NiLwx*$RoTeor)weog|sc{GcSen<TFf(sH?@+L%OLB}G$zP7xzTqqu_7 zkkMsbZapSAo8xFjU8J}^DzlQwvc#@npPKlOpO<8l>Y%D+0Xvj8$NN(XTRr11Te$>o jjfGCNR_aee{S6}%++7~zKJ~hx%Z0R9*Xi>M{PMN$3b`db literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py36compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/py36compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3615bcd4796c9b6f575ffbae796aaf3b1e1b8668 GIT binary patch literal 2355 zcmZt|O>Y}T^v&+tYdh=M`RM0`6;csCB!#xL2o+S?RFS9%RU-(ss8;Kpu`|hfcQZ2% zwq+whdPm|v^uUq7z@bO3h!HnV{R=%H-i+gX(5|zy@4b27@6DTBs@H4H7mPhx0Qd*a zJTAib@Rb8xDE<*h0opUzfs{bsfwlw0?75J-(D$J2&2SIW67<W^E(6)5C7@+^j%;N( zLKz<zz+MGt74`wd0c=u4&U2u(?N;p-nue_w(W@I=s)6FE{Hjnq&mIbq3#3=25-RWH zd5TDB<Kg|UHxnZ>e@=q9h7`2gCMFd08uhnbpa|gV!E;1CgKoD<`W<6T@DAF`v#5xL zWKoi5UEYhjJY{nHXD!6%OFmrVSy+htkW-%Z!fr0Uj|E*z@_rF3-r*@%BSQ_lgDf%1 zVoOnZ*kM)$&ysXN84Ww5kg{$(NL83;;p36o#m~+4JL@&ew~>cgu0lq+3e_$Plbo^; zZL3`_!z7KR4B0SY1@7kIprEm0=WSXou?%^?NLim{3T>i1oo993GHfNzapD&7yM*rp zeB~pgV!kjt*Z_S3Q!Ki2V9y1!da&<;cygS`S*@uLrleJ%HJ}SX1E6)Fi$ELDtHacV ztPDLcfGWYng(Fnz!o(J5zXD<c6YLP|7UUtId=Nid3hHbcW-`ITEtygt0hxL*{KE)u zJbMY#l4bvW&b|zj5?r(*9_&>OW{@H3L%e1zY&`oBre%vSzyyt=GrpA%=4b_mZJ7AT z`UIw^1Or>KVfzGO3}7E!L>N`pjSLd8(Wf;7>|xleKrdK|bzoA1t^<>b*}Z$<lbwUV zVaLcej63Au1?<p^)`2GMmqBbg!<WY>(y#0-&Ak2%zC#;TyDnH`n6qW;0h-4k0vJ7o zNdV$6qE?Iogw-mbdE5<-Tp-y;HkK>a%)fK4>M56HYQnKNdXKUww{!3d@ze#_uYtJl zkZB#rcnK6bT{pUaBCzw+j0G%T9e$|8x5#ha9i(ixu5Jl}eT64Bcwmp!V{^pBIN+I7 zahk4mV#&tMIaZ{xvXq56CFPxQV~&{Z^Mrw5=LowjrcB6F5t#^HD0ylS4@|7fg<xGi z951jTOV(zH_IC3=)7}96)1Jt4HGcQ(bXb3LI=tWdMAtc<Fj3^_8lL)b5QYMMFf-zs z)Rid8;y#O_*JMqTNSAwQ-icG~A2QL&CDT3?qeu+0mLr;&Ct(g^>yi#;Gss#LqKriC z%8?Ylffh`LqGPA4U6GGjCYjPpU7pc%(@S`UzY=Fzj#CL^Gp^~1WOhPH?dNvFO5Nx& z70r-{@<eGD3ECG7Gmdf?2G6*PBHh4&*N@T6T(ZO!>q{MEtcM9WWM)JA=uWJZ5U#Ob z`zB5Y%#LwkhE8iydy=JHT{R=t<VVgzT;#nh7ghzPQeu^Cv*^m4&nUL8i>o#;v~}#R zvFaXTW?d-~UBclTOYQb$?^h5XAn)r>ud9A>z2F7T@mc5HVYfb}isjeQ*+HT3UXf?P zVs!KNY`U)(Bfb1)@f)aCet`>+rn~G^NtFa-*(p1L6Oh0ule*I&by6lvxUP@}X*hLq znJnY)vbR`jkoORBasMjHU2#?s8{atFaBsPe-qM4uk_gZTU5lcAP6sJAn+~GrU=XLX z*3*6z(L9MFaRd2mHqI;`8d?b#(^}H>OW>D@rMxoLOYl8;%u&9FuQa{-zbkedTiEE? zYPr@SaT5`7%Pgh<XO<I_CVA3yL_k_Z+(w{P6)X5@H&1UXX0Cr}8%HmmlFdH|v-WD7 w5-IBpdba7UD>}eqCe6jpGrXGL;)br=oh9uv6Ph$vVL+PZ=dOI-a8|tk0Db>s)c^nh literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/sandbox.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/sandbox.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4088975e6fb32ddf54f83b3e54c50bcca7e9b8a4 GIT binary patch literal 16501 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/site-patch.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/site-patch.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e069ad9081c4c8d424f4caba2fe812ca16582a5a GIT binary patch literal 1664 zcmY*Z&2Ah;5U%c--JSij*XuZmBOfdaVeP>V0;F&-5hy_f357@wa$;f)!%o|t-PxIO zPaDV44hIYeBslO898lhZ3-8c3#3>KJB`3b>U0X@-bWe3x)mL9v)$EOKx7GVYDX&TN zFTF7&<WDfmcd^8H1pP#`PoxCJlE#ws1}UNoBJmB>9_<eNA#B}P!Fmnz9%lI$u;31m zl&HFr1yzEkf<}@?9%EkMMAB5U<v5`7OPUgme8%Q*U$d%%*AY-8Wqsa{Y7U}4cQy_7 ziG51I%%jS45CNGc8zTUqf0ndb`OYn%QHxC5IoIg<e>C;!{=q*~)oF^S#&OG+EO+$Z zbOOm^uGlkI#A-OMP0|Yj@~A^`&8Y&K2A8T|1>{k8t`d&`bH06<kOithtvPoE@R6Vk zNzcH&MOB-s4((+t<eNnrw@B{_jI)>YG!yh>+L~ud4+TJ9+;TuJ5LDAPO*?eqli0(h zaWLw+Vm)C3d%%m`Eq)YamMF$W0xmFTJfQoy9^bG_^Mp2;FDG<?1sH{WdVZ60djFuu z=`zdntcVjU_F&+TP@e_5BVlQ-abn@P3eabgszs`L%)MH2#RS$bmyr*CaB%Q&^w@ft zDs1ueTpuVo1!31BT1l>K-;rH%HeDLmsjS|x`Ax!Lv~tC7;P%%EC>%qQV7wOH0h^P7 z+=KNj3y6US?XrW{?x6kf75BDnJ$m~1!B-C-efs!;t(_&=2k+bEA~MHeGAVLxln#f{ z@K{;DOpJQ*&b|CJjk8U&ewbwOx;a+sT1DylCTlm>CwY9Ds-a+H4F2kT%w0_P<)PO> z=3tG#6$9DT1$0(14<-FB>7)*B;uRwdgbgOqSTUP{v~v4B>m$nKPtq-@Uw?etOp4n@ zQfwtzX`(dUx}!e)C^jm;T`F^0m^@F*w?uev0d07^U7Wve?W9R*hWVtpJ79iHwu!b2 z!|(FkZ11G`FiOk25H8JZI}Fv)5uzz=be$>QuwHpyTA7!&p|bB2ooCiNQpN^F8kxgf zPi(C$(!|&XU!zooZ9p9vqpi;;)=O1p8*!quXrgQohKEV2!qB!k!Qm{Sww>nD)y6|* zZ2JpWp3k(-wXF@)yhMrOWN363ylg9qV=f7Bb%PJ;QBkNYw)GkN!HQnMv0mhbZ@%vp z$#B0>nwVMb*Cyxeioa2^!DT1dI@3^EukmrcG${Q<U*}CNR^?FJ_BhMWvd~@C*7Gzj zkQfo~%Pih+&LW2ql9Q=3XJkcTWmdR)&X%@=p4EVxp!^mKi4J~!u_2nWFZ*Iu^kr8p z3r{TK91}ZVdXP6nR|I%_!jrdTThwGnuEC=Tiv_tTuZy~<%O3o1LUU8}ydKW=7Gmfc jmWPAch6}+33BxzIao1@_FxZ(D=B}g2ozVHbBO2m=x0iU1 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/ssl_support.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/ssl_support.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c354e3f7c75693c1efee8ab817ff832323552323 GIT binary patch literal 7162 zcmbVQ+ix6MTK}s0-tM*?C${4xo2g_byJ=6-CUavno5?2YWHN!p8QhsQ+e|3RU8n7` ztE)QaRFCae^0HZG0SS267bGMQNGpM~e*@x?7bFl*TTdW_#6IxAD+r0-_f=nPC$K9z zImf5Y<-48lcE06$y*mG6r7k%{|3b%pS24beX1;9``S@>9NYtK;Eoxiid7Ikyc$}kl zZamIYJ1=9K!UFY*)Gku5MC}sw%G54XuR`q#Sqwc#VU>C_)SjVUjoLM`j^@W;>eQ~& zR&<{7YL@n^r2mvG%K|}|{$6C!Z}`AcAiqd{iTpC{6sSE%eueht=_S$L8SdK)bhJXM zNPA~#?;N$ykt)&NBDEI*`Vv4d3F!Z3&}y0T*nlMguj<VGeud%{UQ#%^NL`!u!OD3$ zx*&8`DXdd(h1x6ByFl#=WNk%T6N>)`P_3i4WakWp7e_mV^_qN-&s?6I`F%daT&^&B zKonv!idM+{#Cqt1uvz*6#5YUo61{}%!Qurne`om+00el3et@H2BY%PXv%C{v9{T49 z660feW`>Vl#_S^bOESB}{PFA?jM!ghnKBrM{PX0m@SgS+Qdh_a>lgX+C04JJe~GVw zSKlNbI4{c>Ok31yyzw(uu8l@MEe>=T2HWY(Zj$ufP8g^tNpn4~pBB48m?+(_)45G$ z;&6}zar8jzSf_Ij4ioKlrW1?bRXXS%1<}r@Po8|%`qYd3Q0a8G8$`a_@!ahJPo%ZL zxZamu5PIAAs&<r4+`gCWnzS1CRiw1rjkRZ6MAbEwbk_R&!CDfUHQtEcyP3ghc65?$ zFeaQX@~)s8bi72FY|FstHM8q!wRU3TaVWecj5}U9+BiX_<2ZR0QM0dl)wR}<NmOs` zJHfX0^wHX5(B5i&XG{sm$hQ5Tuy00YL?v@7^iB9<B#`_3`jn$g@UuNH>Fm0@u}LDY zry7>7;~w#67JoW?r{f=Fn0btO3>36L`~!OizJFWJZ8UOe*>xF`>!wxL?Zy5e<Z;b) zpAEb)Tlp)}3jiYBf8JS3di}M2(7zc(Ch@}X<}a)FKJ*h6uNjpL`biw)!j2D3=$b*l zAG1`B1n>KRX5h%EmeKz+CbpA9$G<9C9&H`Xe2%3Zq8B-OjxX2{sK;mz=3=v=zsS>b z_?sN9yeP;>oX_vr_%71(0_}nAqHHYDbNq*&$dlfq1cE40B47b#8SVQP?=W96roB9S zspr;cux|sa_%w|4U(oX$?cuY`fUW3zf(ZVu!r$g^<lOjE|8%rFfrBgaPVA9mS6{QR zS0TSj{tUeo?ySSN=y{RuKfOdRa8|I6;0SJp^USukcn-&E1Ru0F!yB=(3_rBYD>a7p zqC(H%gX>Hj7F&(EVgJ`ynP9Vy*XhLC=TQ<no1d&ZAKZH9{Tq%^V&cvR&G(w`R;$kF z$DZP&wKcivW}uR8GuAt6yGbux)7=gqeRFj3W_EIX@RQVPYQAfI4&6p-tqyMhiqrF= zBj+Fp{f?)7;{=g&%#@w`8!d+w@grwg_|4yHK7D(bKa6hP9NJ&3W)rIz-a~7mwHvc( z!Sur*Nei8L5GA5;X<n<oP77gt0IyW^`Y>2OtwMj{R}O+?H?_4&i^_DozDi5j9C{rL zI&rTbz*FV-;vh<^j~;G3-h8lruk|1;h#@wrsqIH;d2Ekqz2_ae6Hd}RoSR7teMXa( zL)A@su-vqwRnLQG1TB?go4eZENpm<dH8*`0f=XvyKQdyAg7uqh7^~>0P_&9xK0jww zt$BOSsugn9*<8_DD%5iG*5$%V?rN@XU9i7y=_Yn}*yQ+E8a1)7$G8x-tp!S8RH7WP z1hzR_ECB{&Qx{PMI+UZsyR2RJpMFSR;5$zvtIH7^#w|80XgI4FKEL3Q)`H3H!OTSO zt!KAr3lrua>G0_odSL|p{?kVUqh$=N@~1Eq1;dX{V)*OVVE7SjJ^PBb5;z92A(%Ov z{JfQj#ez1@MT!K=NMKXgBioQcEWs|odh|^?aTuI@OAc3=F&uz-t{mH5BZdqklhe#{ zqwakSsb(?JNp`)&S!Io0b*@9VebtG5<vR#<xK772j)vpZ5vI0}CPs#M(uzC#DrxSh zq_31_0M{E07z>P68Gu#J>R9nsn~vD+J0ITq&_VE>81V$2hGRDlLLu;mYzO`gXM2!1 zk3Mre-`C2R(Q*`nrcOuolZ?jWNTxpEbYyY@u;B#;XX41|BE%20YC4Z2#|!|>m>WWH zcMyq7nUW=}8wXg~6E!Cb!)4X$Cr3`Kv3A@aq_bwQy$8>9FHAPz7SbFX#70^g%_6Ia zd%ZZ~C2=#uuaAY~T+@ypD-(Sq$)xBgn7-0Z+;y&*p?$*{Ui#nnUen^bh983*I1nB8 zb%0F6nWAG_PtxXe0~Nxf!RxTxkpwj=Y4y8aI8a$U&*5^#HuXi=WSR?ABo0eo!KdaZ zs8`T6N@<?&Uti;0<&ifqY0h|2n%h@LY2ix-iiyGYDeobvL5y>TeE^k<Rt-*L!8(h- zb5`CuV-<5Na2wgzB36p_HR+e_SJMi1A$QRP*r~LFpBk`^oFtlv!xD-)0hP$vYLs*t zCx;)mf?hvV&X?nq(b>(?#gF)=y+N{z$TQgPgdXc8^d{)3c#vR(M5#G(VoV7)abg!R zVB;imi4ufu@m;V;&gokXi!+_du{`udmWmW8h=Rm*k#gmY3cLC?z?~N39nAd+n&Dd^ zt6~i=zc%S@j-j2Pln>?j^d)q^D+$aGiMnt`;$OcK^5KbEjoe0uLnQy0JwC{~VK@@N zLxV*=4qh$#1Ktnb>~!HIDeG|*2@}i_t8{AbA0SKo7GPw2Nn9!44!z#C@7?)xMu0}c zcTNHtCGt%U`NriOy?I-*Wpf9E>~O<MOMWbi$SWB|n$zl;;2Gl-bk!-8KVyWMAdA+} z`FTh;8bv*aBbt+0eTGq#T-T2~uB-W8^e5a+lGG`SqH%wWMN>ov#kXtu4n~t7i})_u z|4*O!<nZn*`rLu|v()JqQ)yNV{;@!~{VJMq(BZ!MrZe5n@qJr}KlpZGXA{Mq6K&=@ z&yZ#!xsCIUe0JscFwT_v+dP^Iitk0X|0M>a3pr~IFP^**20c~lv34@mGid94^xx4< zsLiYoQ6Eu~L#gBypck)LsQ3$u113*O?B!%U+ar|<?7_^)mXX3k0wvDHEgqFQDT$ED zVhlilj!-UP8P0~sGyLY|RSw5C25yl{0twPyOrqQ{D|x*jMoHj($|rMDY4|s;G>rDl z3n!>kz<rFS7KDWF)2PD1qAzYB62$|=Wp@-np_9n~mk{Fllnvye2FC-}?ZPCG1HuRK zmuZ|$i$>ymdZwcl0*O1-8qN2G<PlG%w1f!ZC5cW;yPlCjp3muD!4}Pm0-tZfbml;N zeRl-0zW!kIiM#pW*FS%>`QUzb@%%tcXO86(5@*t~*&QT)d=RCT)~BE2(EY7VWX@r1 zR3n!uPfJeXwT}m(Fmy_PI87GS`w2Fh%jgIJ=B@k{_{eIZW>@T@b=l5Y7pyvhPTd+_ zc#U?AK)h<``XS(D8vO;2rn)O5QQ*5+_%YfsBiB4PaipxWtgfP}S24&`6*`o?0Q=`z z2cc!Sa{R~J4t{lb_n|^6<e)&pj_-N{d78WndMJ@(S>1q>rb$@gj4q36T!TQd1YXMq zGJa4z8z^|;+V%ji9C4LOi*M2u-jHVm@Rhgmag0M@u7<h4Ma!(yu2>VU7&f~L=FD(r zka30Z03J?77tFx!U{(@fuvdNzflt4IX0D?H1RUpA0Fv}8Jca?_)E~;cYmH(L3JB1C zFFf#$3>2HQR|DU_2?+YP(Q(-E^o~i3`v?3NAtKMIU&b4=m6ljx`%3=<KIGmA510jO zxEMzrH4QSOT>w~-+>xsbX@O@MVF!mb97`rN2v8;jexBj{Jp*SEk#(h@@ur#9NSJjN ztq4zJz!gr!V&cN;3ql!k3C;n9MpQVjONA3gFXg_6BhgB#gTU=e5dpdc*Y$fMr<Z^r z!iEckV}k50$dEs>R}g>jGoiR4DJ2s<`7u5GGasQlo?!hjyHj8tXAH=<rjvpR)S$)- z`dW>`@G6WQZ_!8`4r+PFq{`X*CzzS2(%3*)bmklAGDX1ULlF>yz>$Tw9Y5sYM>Ccn zD#<<ycyJGJlVYTJTqo)fukW%}I{~U>TDJjiln3A%%VXSW#YMRhIUZv8)RZ}z|1%Sj z-5O%i+drR;S7Q_N!?8*D`6UdFmS4xxR<wXiMokEp{5D^*T=1B&oZiJrp+7A>Zb`;I zVMOoq8gyl3u#8Ez{woHijE=0FwaotR`Y*si=5Y(BvYgECu>eIxK+ah4NAL<tp7<v; z5m?Py%*&S4UcZ;-Hy=NK(kP@gD1ii>Bu15E=24FWi*O@*+hxQrBWrmsGQh6-0NAdu z^2oX4$g_&X{Arec$|UeL5<LApxUSf5%vA8VZfS$riH?soZJiIihYp&SCG1cxcEX73 zn1P`X_1~pLQh>}M@u%bha6iM<O>sMT>^jgllW_5B{T`mQTxfQ<sC<LpV;ga#HX3DJ z0H)NAjg(||(_&!QA~frW(3j>Tb(o;i!VIH`>>l7@i27>#45qy(k@>7vooVY-W!Z!O z2U>RN_99&LoHgMW3&b^A;r9a!j?OX5%n`hRSXOH*x+rRhU<3(tQA~k8-a4s|aJZ!r zZMag@YVnA|HKJBq5K{Fsz}B4Q>JoQC-?S55ImE($p-t5DoV8?Wo^4#yAd2(`cL8@_ z;|~6Z+83wA+$MyfbksD#VY3&1sf@%oo#VZ1u$h?a{rw$8g)BKT$7p)OTbNGH-cdSc z;!UE1zFy`Pxs0bg`k1><dE@Lo<URok6{81pF_yQ#<|1+SQs%^_eQDe4?6W*f6WNd} zHIhk{T))eko7}NoN@}3l_e(^O>z6Prl6alq((>)BGJc1(*L;SqhS#(Fv#;7qBbA@Q w8@f_kz*kKaf6l&~%hDb;iF24MqD)t`m-0n>?!8)LslN2)T)9?RIA5#&4~R2mB>(^b literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/unicode_utils.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/unicode_utils.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79b02da0bbfc4828d8e09e06cf6cad48ab3ec3ad GIT binary patch literal 1214 zcmZ9M&2G~`5XWb2$N6XiZ3^XTAt7XmHkV4RRD>$ga5P8}Y8wefR=jDQI%~7Lrb*PC z%ByhTm3)N@ufU0!wVRf%va{pa$!_NNALm7<)7t#O`EMKG7d#ji`o}ocCo~a$7$gA0 zwa;M4Ox%LRf|(6N8(3sR<iK~#b0Dfg<QgBHIz$cQyL8aNZ~nnkA@EsYt9U+U^n`=f z4V>?BsuYa|xIxQcYQe1q@+D{+rg%7`I7SAGee$Mw2WBu>VfOzS7@-8b_%7j8bivVe zxN3o%0%Po4FgU}cfo}&xJNR(2tmS&Ld+0ZcR;*&7bSTDL5|W~+`CO0mBICtIF5+<- z@hH?`(G;nig-N{Rg&T1S7cLiOZGSHF`ckG6OLnqQU;YG1mHs{M=~>px;%wL4lO($b zeE%@gJnbp2^Gv5{q8_@{rK4QOiQ3B+MU$?ZWvSu~!q!Cttjji;&7R`A%{r{cWCx>b z&JI4baT?ANoyVMah}obdc?*!eBH}BAj+!%=Sg^8SegHQXoP6oQ%7(>OCBuzPG7L_? z9wB4bFpi1w^%0z7><s5ADuJk%=PeIMU#MJiPhW-_4fihMZ(MkU$cvR%qKw{{)Zk;# z_pUE-TcjSJXMC)A<QdAbxbUu1d8JHZrC;FJrH$1Y<s=o2?Y2<G^9!ygal+Bpe0KMJ zS*L_<CDw`2u$0V^E!-Nq6E(u*qBRah6r<`~6*dNpkfkB0#gppnQTgMaVXRce?J~#e zvbNPhZMIMsxs7{c>MI(wuDgE^A1bKWz^sHSb`UBvP<?_*?~-X=a(rvq)43F0)gkv_ zVxdzn^d`9&>o^r*;>i@-NASS6BsI;t>b~jNvTCbvm6ixrQcFE9vZdvMXkeqi#%)E% zfK`>XgFdpa;Ub@)8E)P8@*ciFT#8Z?>PiDa(pMhbK^&x^*?2okqdej7=+8ls5N#y5 J>9pJJ?SH&|5_SLp literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/version.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/version.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc01ae5cdb87bba6cd685be050a5c88245f67e57 GIT binary patch literal 299 zcmYj~F;2rk5JmskMoAnjr3zdjMR0=zLJ@+3mL>&|W(C<%<k;C=?XH2;T!2eZaHVaj zxB?Yx6ak}|ucy(>{|7~pkKUMH0er;ytzo2#IPNlvj7?~O1+X21fi*!Ucp<D4EK=O4 zLu8zx&S7UDBAIsUJ4LvSpYuuf8EtSKa>u?kUhBq%UaM-QpVVY86sBGY%TBj;$u5jm z?1ikHx79=IE3HEBk*(`sD8vqh2!pHVC7bTx9d-}{e&p+{^cz!}%1kTe{C(3*Px$y$ hde-G%{D0gz9+_?E&o)}N4WCoAbNwj$NlIfX=o_GWQeprA literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/windows_support.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/__pycache__/windows_support.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf42352dd08ce574e959636e0b9da306269a664b GIT binary patch literal 1031 zcmZWo&2G~`5T3Oi$4ygGDgg%&@->IXYK!=(s*1KrMWrf5O;99XT-V+ZC$`t@ZV0K; z3+2XhaNt#V1YbGz6*w{LC~X9*?Ci{V_M6#nCQsJZD(gQe{iOl?hNY#W{uZ~`MG@kU zKn&pC=>%K?p$4H2-_WlCMcsg~q|6)qs;euVx_OKDp&bx);8G{%f+O6*Mj-))1a689 zBOUm&d(_Sh5W#5Y<zAGAY$5`TFP1`3NFHuspuh?{b<+L`buBl1{!!%SXrfN89#V)u zhmK4#CyTPpC>7F=<IPv}#p_T~<_IdsnPe;$%j#sF)f3|^V_Y_}X>RSsesUT5`(>3G zH(Whmgt0W9Huho`__5eWWgdtHSy}AMKI2Jlim8w^sgvC3kJI43IBp_TUR{PNsSL^u zWP?-)Uq$VXM)hX(vLoCgMS(OT-$*=>1cn+6br>3OO+c9?7@7;E41En|1UzfuSt-nl z;{Ce#gtX5zxIt5gnGRxDM6RkPeZ{8hswr3BD>kkUm9`vEdk}>oO>JLF9$k(lwHX?A zKZ;S~b{KIQNXDm)N^$F$v&0@qne93bb|M(D&y@FLHfaPbaXyWykP%CTv-RfX_V(7! zjx)b@k@<3PVJBlD?MrG)`b9PhysKIurx_Iu<gZX})qu3?)x6?)QKFjXdAT_c%1y;` z9Ou@E@|4Cq+wKNF;}~l_Sd=e%uC>5&&C~b2PWRj`HG600&D_GVDw4Ry;n~?~UglUX zW_PV#l(sl$yl&)%D%E}XA8!8W_~f+Z9dx_rCx;)pE$`h)v)O9rI;ZmAX;?v0si!zp ztrzPkV5LH8<SD6XrdA^+;g8W*H@Jldf1rd4Exb!;YEb3_X6+>`9LIED{dtPvs*<W+ GHU9!`e))C) literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/archive_util.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/archive_util.py new file mode 100644 index 0000000..cc82b3d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/archive_util.py @@ -0,0 +1,173 @@ +"""Utilities for extracting common archive formats""" + +import zipfile +import tarfile +import os +import shutil +import posixpath +import contextlib +from distutils.errors import DistutilsError + +from pkg_resources import ensure_directory, ContextualZipFile + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + + +class UnrecognizedFormat(DistutilsError): + """Couldn't recognize the archive type""" + + +def default_filter(src, dst): + """The default progress/filter callback; returns True for all files""" + return dst + + +def unpack_archive(filename, extract_dir, progress_filter=default_filter, + drivers=None): + """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` + + `progress_filter` is a function taking two arguments: a source path + internal to the archive ('/'-separated), and a filesystem path where it + will be extracted. The callback must return the desired extract path + (which may be the same as the one passed in), or else ``None`` to skip + that file or directory. The callback can thus be used to report on the + progress of the extraction, as well as to filter the items extracted or + alter their extraction paths. + + `drivers`, if supplied, must be a non-empty sequence of functions with the + same signature as this function (minus the `drivers` argument), that raise + ``UnrecognizedFormat`` if they do not support extracting the designated + archive type. The `drivers` are tried in sequence until one is found that + does not raise an error, or until all are exhausted (in which case + ``UnrecognizedFormat`` is raised). If you do not supply a sequence of + drivers, the module's ``extraction_drivers`` constant will be used, which + means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that + order. + """ + for driver in drivers or extraction_drivers: + try: + driver(filename, extract_dir, progress_filter) + except UnrecognizedFormat: + continue + else: + return + else: + raise UnrecognizedFormat( + "Not a recognized archive type: %s" % filename + ) + + +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % filename) + + paths = { + filename: ('', extract_dir), + } + for base, dirs, files in os.walk(filename): + src, dst = paths[base] + for d in dirs: + paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) + for f in files: + target = os.path.join(dst, f) + target = progress_filter(src + f, target) + if not target: + # skip non-files + continue + ensure_directory(target) + f = os.path.join(base, f) + shutil.copyfile(f, target) + shutil.copystat(f, target) + + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + with ContextualZipFile(filename) as z: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name.split('/'): + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + ensure_directory(target) + data = z.read(info.filename) + with open(target, 'wb') as f: + f.write(data) + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + + +def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined + by ``tarfile.open()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise UnrecognizedFormat( + "%s is not a compressed or uncompressed tar file" % (filename,) + ) + with contextlib.closing(tarobj): + # don't do any chowning! + tarobj.chown = lambda *args: None + for member in tarobj: + name = member.name + # don't extract absolute paths or ones with .. in them + if not name.startswith('/') and '..' not in name.split('/'): + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal + # files + while member is not None and (member.islnk() or member.issym()): + linkpath = member.linkname + if member.issym(): + base = posixpath.dirname(member.name) + linkpath = posixpath.join(base, linkpath) + linkpath = posixpath.normpath(linkpath) + member = tarobj._getmember(linkpath) + + if member is not None and (member.isfile() or member.isdir()): + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] + try: + # XXX Ugh + tarobj._extract_member(member, final_dst) + except tarfile.ExtractError: + # chown/chmod/mkfifo/mknode/makedev failed + pass + return True + + +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli-32.exe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli-64.exe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 zcmeFad3;nw);Hdr?j}u==7yyqfJg%kqCtqpC80t4LPu^(N8=-ER75n&prFR&UceDB z@phavWskhi=#1m|%%F}lj?UsZGsvQt5J<wlxB%iv+^cPuAew~rzTZ>Todne9_xygp zKi+>{KBRBmT2Gxib?VePr|Op8w9@9V*=$byS(eSV22c7I6u<xdPaBf^ja=8y_RqdM zMy;_&c8r=e|E_9ZWz~H@sk-eRU&U?r-g}?!yZugIm2t1{u6uo<tFQIlbKf0zPV{)P z{Hdx3p3OZsJoLz%^k3!LlXGT?_n*zl!t?Wj+&S0c89qN_PPKRroO6qKy5>w4&mnWJ z$MZk#s+do8oC$GRiOqJ$BTifH-`O?kw07GVTXsfYo9!LM+%035<l~tu!a+MdD4b!l zx#$P~(ob6@QVCi32fWp!3#G~;R#uXJP`*?Q1#MsC+HK=SDD^YfZaV=`{(t{#x7k)o zP=BzhiTa&Obfld17JdjI>U*jm2#J3_n{DpIsylAeZ?oA}or@^cX*&;p@8Yl5zaYqC zqReLd_+ljZfRn*^ItAvsb0S~E#7db_^bvivWg&Uk_wpg@|NZxW0s~rXw%@JA7W#9w znC{QhVoUu#b(VUadc9_T;ft^jG;@np*brtX*3qDS^H;5NPdwDuuEig)w2D?9%(2-D zI|{#yRD9iR8?D95?Ge^qXDz=|8CgU9QI*v>6KammHk?*-@|>EZqYYnO$MQiT*8IwB zjcsG6_)Vxma~#U=Xm-rjtfpi}VFwC1Cur7YyoLi`)=#&Vu0f#zy$X$$g*3L%uW3y8 zmuYONzr5Kox_P?Yrm@-nV3;*)<|dyyN4-Uz-LyUZkNTT;gI4>+ToAv;T(1p4{=!XK zEb1>4F$Xl(sI2a*v18FK`oNW%)lhSElHqI)TC-QUqg#xxw0P7X1TG@+NBu#}xJW$Y z4{GsQ{sQzzi-r6?etCazhNb=jn^N~z-~hqkY$f^}g8yCNU9xZn3QMGGaTEl`MFX9C zG^<s!wrGyln&R1p8$mpEuS^ZJR%JJ%CnC~F_JWC^1fz-owidt!7;Jo($7U15xt3-u zUy3=Y#UB^>k^_1rR8RtYQ(Z&ZG}fxIF8)$B1zR-ss6<%dcHRYkqOqs_HH5(0O@!H7 z(-{Bn=}Th=WLG2XbB!I3m$?Ojp&R@&FvUVkV@K53GMlm?8)Q{d_^}qt<JSQ}bq%^# z85y!6Wu_fu!h<5xXjfL}<24xlQolK<Y}moa%gnBlx{vj6u;wHYVoUM>LZgkr!HyQY z(XX%piOS;*!3)0(v9>){ouv<muoj}vo%}U`p*cDWEvoX_VEsf5bo|t5S$>_)(%i?U zS|zq{MF|F?IUKvFnF@^q@cbE|2r&0wnTB_zh%nk~0w9tZmW7^zXwRVMAE05(%JFqu zi~-E^@F=^jZj0_N+-rF+c@HZ$%}<d0_%!MT$rJu_iQe0gTG&7sJ)p%S{>o5%#{9y) zvDf^><cadi=%<{1=JIB@%@)4_lic$tKm*-W&POiG`_)0B_u0q`nyieVZjA~AiER|o zPeDoHmXg8-5KZA0ypAW5Be*Q@ODI~`V2tOVyU<?T`_lXL(B|^nK`vC{X@3_%QoE@Q zk6W7<;LupaUuJH#Vy-7pi{-r)b%;2kR)X8|hSJskLRLE=U2XP{R2!8YKC`*r{Gk^= zyn%S3<b(-Hsq3jbVRkZH!9lBme{1X;utZF+Nc<Z6vSC-UDO+X6Z~hv#8j%!o?1=<+ zEd4ZGu@z|HN~Y-k_J7-KrED`MRfM(i3<Z%XMtf3Li#p?XS<4C{%=vz}Vh1qx1d4<m z+xgr52n$o*mjyuWV$Osd2|%-S_Zf5)W}5^X1QQf<GI;F`>h&rSL^*gD7~pzOHv=pn zZpOX|VMKkAilc(3scUTLaN!oqd+b0OM&e5aa-zmVIg^N-3ba7uqC91!t)^(Ao-0Z= zBRe=&VB_K>f*4`+Pn0a&i?Yl$8QqaZV>2w}Ro8`hpBI~vsjPOLi(vhXzC8J=&Bped zU6wJL|AUwqsICB*_!{IcXlEQCj!$<ajsQlYi2^( &sjKl@1{;unAiW2w^OujNoW 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli.exe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__init__.py new file mode 100644 index 0000000..efbe941 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__init__.py @@ -0,0 +1,17 @@ +__all__ = [ + 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', + 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', + 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', + 'register', 'bdist_wininst', 'upload_docs', 'upload', +] + +from distutils.command.bdist import bdist +import sys + +from setuptools.command import install_scripts + +if 'egg' not in bdist.format_commands: + bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") + bdist.format_commands.append('egg') + +del bdist, sys diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..193ef925dc69d5b961f6fdd9059cdbce5d5d8628 GIT binary patch literal 721 zcmY*WJ&)5s5Pj>!j&n)QCR_*+6xXJ>qyPzu6GEa#NOZnp<;!e>k9F4aZVpoOJ17z2 zFKtW3U$}~KKDfhLuil%Td2dED9t=*>A4<IlfZurVjTpb>-~Qx__y|w{YJu9I5EOwr zpcvEzoq&3vK4<_s1tp*q^awNrJqDd&HA2P;BhV9QfigfAKs0;|-9pBqjGsccQHIDu zew#oAxQXz&gZew@*^aW|1eg1V8@8U{n}E0qaK#E^e4IY_VXlkZ`tCIq)=9Nm9bsLS z3^#=)slGZN?_ss|9a6VSo67f9Znv^nTbFC?W3FYgG`@2T^$tMl;@U^Gak*1jZ1Y=X zDrbFY8_z7V$}#tCr>yhovF4v#a*WtTT{LxZtyWy9YCqU_{iRqpIazO0X_J#Av#>te zlRvx-Oob13sqd$vPB@UYSpF{kuyvoz`h3RZd|7BU4QgI1>SmYIuJ1_6lS!G4n?^UT z&~~;kWtp#Owv(&RIMKK4)@DPVVpBO|?sN7|$<owi?&P7+W~cuLe3Vy}TGKDolg7Kb z?%vH^S<S1Wx;PAf@k+gXO-`Blz0X5<P@hX)LE)sF@uK3(($Ge$H_c48X>}-uA`!z@ ND*8bhBw`@a;4hcW)C2$k literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/alias.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/alias.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..823ad1e1d0cf89a8b42765da89201f8288ca1185 GIT binary patch literal 2607 zcmZ`*TW{P%6h32ny_al~CA3M?mda29wW>`JR1}Gef?9%vL=Xy6rB#vTtS5;RUp6z| zl9={|z#~6{2cG#8{06`B)W5J#d}q8HwilfB<jgs9IrE+GoblS?VyE|qlx3UfADVj{ z$lG{zh9<&KP(qXn8VC~Hw<xhFwP|42eVY=8(gqD0l)5x<DQ(iA37bPvgMK9%wCL-| zrKrgrw9=&uOm9=vqNr^~bSUc3p1<%Mdy+4zD-UB`jEgwY-;Ihm&%RPBSJ2yOIP&dk zK}K;A4D;+DKCBjUGbGp#wX7CuWpEHDawvE;JQiLD?*qL08#HI{vTF~2yh+alJ;jgc z#3j|Ff>^!~w0GL1M-Yz%T^QY=pc9+a&fE}~_k6d!_x(68q!(shs1C=e%nI)yS6&hp zQhB3L={P&|_Rl?il*qG9Jxb!@jz1CaOvL*W@pvL``wn&{QY~%}4pJR7zEwF&j#Sk! zQ_!`sekF!~l3Ip+vb|NLqpeXq>c^Qb!X)Y6m-jx23Yl+dS&T<To+o-<9Oh{nX3<ud z#G&3ComWkLbjrT-#=47!tVPikOX8~N2=xZ~Lsrfn8^ShTeSk(Hu7de7u$Uqs1Bfv| z$Pw8FMN0(05a{D3t$_?IA=nOU*T4s`0KsQ&fCcz<W-M5ssB2^hi-32zY8ZFRj~>c{ zI0MYUF;~TKTzJJ%Sa@;vBtMbb%V7iRX|AL<J*X}}h+dtPPp7<g#t)UNWST#bl~9vw zwdma$X8_d4e%PL|yCfD9jLG$YQMru<`~hQX3URVP3V=^703v3L*hRn_7+kHySzN?e zvXnthVqG~1vQ}@x47xj7CI=?kb<=}dt)jVwSG#CPEQ+=$uhlVqb-mZS`Y9&9;3_lS zB6Xh%n|(fZI0q0`raY7gsKuIJOvLwmd-pjXz1;bBtP4+%<S;%s_vBePERu5r>}4w4 zxkSy&!c_X+Pe(HI#wIEH{TgB4t?}p~!Y`m<aH#A=W@-)lDaP6t>Ke<O19PZcN0%d@ znaqsJEn$mtwZ`S;buUqIFqUC70rYStKD>z`4vzzKc`(rE0Yg)xAXu{5EKo>LK1?C8 z%m9Z9hn`xjy#QnuiPMki5yu@M)=Oa?iq8q){(Gu<jEyh_8=(mO&MbLm)9GZo4p*kX z{%3KsFuZYj>?(W2n(V{r!br1qtc+Ac9u_Ss+A{+pO7xpW>+B`Ax2fnD8}bfkhBr3F zf`9B*mkYL8+HdbxO#`ab<?@5NqIh3&R<NS~;!`e}N`zWdCyrVN)}^<b*Imz~CsH8K zP%_6^WD4hoQcSLi@chN98{r~Q@jmW?Jgb%uWiic^Ac}{DVMWy#sW>aDE~;)C7J>0j z-M|txeVpSw&Xmo4E@{d^Q?>YlU_w^SNSz02oFOR<uWs^~6&}-^){&Q}R@oSR7X$Qr zXh^JBZIsInD0f{r)>RbHHvYO|6}=_VL`mJS%63ge%-r>D<CnUE$?7T^zgx9}fSn0~ zsuKih9*q;0yFqX|4wI>+83a*2gnA*8dZ=P^>kY0?o#fk4<Mz?PEcJAqRNb+b>ax5n z@8edGVK!5kYN9xK6rX19s3yNm!C^4?)!cN2Yq`R;UD2_6R=3e@8L)<&n*1=jjJ3(A zpCQ!O>-uAhIS!tITPQtsdT|om<*b4!+n$+BYO!gDZwxkV%uEd?E1N>*Je%<4&}8c> zI!s%lHPC$x^j+Iyvbu*!z8@xKuivkwe*J~uRSpAFF7^BT|5DpX@?n@%R4(@WGmd-? zO1_1op!9ID@SV!xm?)-7<?4K_hEi>yGY6kR?rrFH@EYVu^u!97F?}suv25S<7Y03M zx%u4Ll>DWmO{E*$`0pOylxO&y$ToF+w#oOCHiRCm&yAQ8VG}A`CWhvQ0mkQ=`W!&B e>71jNajsgQ)y(^X(@*m^NDm>tX?HuT_x=SP6H#LT literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f09c66245cdcf20ef2cc5b8a94f41fbb678d108c GIT binary patch literal 14945 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 G*8eZA4aCv_ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66c15d2b65bb990d444611ab3756055475a7548e GIT binary patch literal 1833 zcma)6O>f*p7=G>bdN*#Oq^Tg{Lt;3D$_H;sTLh}2sE7(q1k~JCLY8+uyKy>eyEEga z*=A2cv>cK63mo`MzQUz{At#<0dpCiAgm-8Bdgh(y{d{I;V<Xu5jq^XdM1Rn=$AkPB zL+xQo@pniNoj7#j(y&9{q%Nf$`Vku);vKVk(V-z09XblVw>U(HV>2%w7s6u<HNeD) zhK_-4P5^L)H}ojQziY6ET}pl6_3E`znkgO2a+XXSqJZJ~?gf`JOF7fWoTYq{R6?_r z9vkuF<V99UrVEx9R%ucQQJiM^^ig0DJ{_>9RnGWy8fW<gItAmos$>J1Co|5HJY}$> zvLa^*HcDBPT#7R`PQ<tpiRS6RV%;CGFU4tcrkDie-7Hr+5#lbZ6zs7mGB3fS7AxW} zHJ3Rw&Z1e8CsUrnx&=aHh&34rZX8oA%h}WKzcp)GW}`~O6V;e}0QY$*k}<+h)G<5F z^f9aQ6z+}-_==MzHB0yNYBs_an;<76u3_H*FKv#CS()f;l!;8AHTYv>+CJuO>h~3f z`WVwWTEX_jg+q?EO>xpOtL7VJJqq2!y1&e8=+(E7lo%!uYg&7S%%;)+)*Y;ePVFf! zCcl&HW9{<Eo}QI^WmZOQ5~I)g!!J_Ji#^44RqCP;>bltC?yYJ+D9@x1s7(yzVIp_K zoo`(2!|EzHqu6PO`V~SG99sQ?XyMSg4G(>d7QJw3;gUwbdvwxm174te5xhe?KU+GS zyO11uP4wEK2`FLP`6mE(=m`=8eMl!hy@3h9`n0ovO3y+pfQn6gcy!)11|57Kh5f@z zC#s!zzO{>1&+@CXt^zR$1&!$rhWZ-Q)W-6|{xS-9*A&gQ)w2wS0aHoqVk5sH>zGTw zxb)nx&!2yER8(@z?>%C>uM8^|(eA6Zs}=*D$a(lL3RR9`qvg~1Z>qO#4N)Pqr=<v+ ze|BT(|IlUb@7i<oPntK2@@wwhw2n6G$%ZbWTf2jMwI`5A$i8{sf6%@k+Afr9NZ@6# zFF-p(je`$OR!xf6f_Ze+N%1Us#$#3TaXiTcAMA?)H-kEWusr$J&}aVsvTip#V`0Bu zzfSM^)|BgI*5o=)OH<c|F`NIeSa&lp{$=eWom}eBmp$m#y*BB?0C#39gJ$q^7&MwO zJRRP?;f;+xbfw{r+%l8NgnS2+8R}h3<ZL?I_ytbjZU=#T2hx@^fA2rjav1t`KaNfB z#Bm+O@vKNIVdV8VeqJS_-RZ?~T8!h^ve(*diec`BtFqWc7+NdC-Ssu!UH9!;=nX$G oiNqx-)S$f<1}m@XUb|$Ko19)DTgk*)_xBt34ou-}&9^&$0m)A0(f|Me literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72fba38c22f4676d88de67e56deef7fe2b2eea8c GIT binary patch literal 981 zcmZuvO^?$s5FN+qw%ZR_R+TtXaSLc079p`9gjPZVPQ4Tf)QgoirkidO2iwt#s(V`g z3J3m@ublV`oR~>MY0)~Fmx(=oe&d<@gF*M`yOh@+z)#p2KKkcqCPawwWsm}_7_2;) zad;Pd5Oes33mhb;*&7ZsoMbQ!{9m{UCJVy9gQIhfW*#F*fEgp&dPhUXh&lElZV~Ye zodYCmyTLq8j1^Z&p5(@Ah6D?uqv4~G{|3#B5jLo@61riqK~)}Hb3h+?FAqRJBEcID z!Xumpt@WxqYR0rIid1GYw<9g_Fq=eavX)|@vMkEukyWEBr7uU3R%IS<w_R9UybQy6 zxisVAtG!V9Sm|Y$7*oopPtHzXY$IKp5{S~&^%_T{$$S!cno`h|OTb;9ven7Fw28{y z@HQ!RsPB9u)6cHm2z1AFtT5%gnKF(qviJw+9&-PFAKI)4i=;Sdjz4)WpPj{4s?bPV z7FMa$?79t0xK{v7QXe2)3(a&9pmoUl_#CqJ!~MwHv@fWBH0VpRwxz?~!RiTs^$={; zX)CN1zzqZT5t{|uq+b7oKhuCuKD-V5Sx+QJ=rYIVSUO+nWT~;4!Eu}mm~NwAWnV*| ze(xY0p_vW>pl;5F-um8u+RJ<rv|LAsJj$dHt}8^Q;xZ+_FT|HJO6!&CHY(DcgD5jy zoknV?w1%M1?)EBusQdvH8mpX|adXk*JqeoRRl#~dUPbv2h}?Bv)tX+@Z5lf2nEwIA C2j)ot literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/build_ext.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/build_ext.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23be9cce6f27fc26ee0ee8a374493f8b8aa37d6a GIT binary patch literal 10931 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 C_p(O- literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/build_py.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/build_py.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99b68baa56eb51b53472f93d98f9aad41ea784a5 GIT binary patch literal 9256 zcmb7KOKcoRdamwi&Wpo`_>d?|vRd+LsnJR!Th8t}hE~?DXnTWX8Lg#Vc_(HX&FLPp z$)4_ERgXjtBm`?2yEYIY2yzOtw@nVY<`m=*AV^LDf&@qoK_xi^Ir$Le?o+=1ukM~9 zsU*nQU976EuE+m>|Fd*%ZmzlbCt>*fnh^gXrhap%-^ZgaSwaN(-x9G910lLXSk$&f zY>9y_y0&RoL|hSjj@X+K-70^9o|@>^ih5mi>qWgGx{adV6y0V~pB3F!QJ)jtIj%b* zo)?1!(Oobr&4_qW49<w|88KKA-6b(t7TslG9j);2s)$#_U{!Qih4m!4CY<oB*l!B? z@4~XI4+HF{E<VEn>f$AKzbbx`SmNUk1MH{C{Y?>8=@j9rc<G4lj0h?sm=!@wd}fL6 zIT2u2^E9%%Mz0>V7rrFAwJq)J#OXHvwt8vuG?bY)^t0VfbW~Jy*skcxz#r;rKZ>(Z z>RI!*@5d^{kj4+9!zj6vrEm9Ww&GVo<vt#D8AXUSEjlA;4t{_ISf4h94LaD!jI3kS z;~srPKl%&qi3fO;g90BtYTM&xkh)2l?MBJY=AQ~|%u!+7*E85rsJita?Pa0Llx*M= zF1~tjI~xpd52N9&C{dXo$G5&6{>nQ+7N)mVn2m;6n#O9n+DiumKM8JckD@s6hDV*@ zk*>>8;?W70X+L<xc&R*fr+B&9c68nI5`PeSo^E>HAPq(_)mxr-F!E#bMiM|LJ2bTx z^$`u0@F*Ka%i?wq)$&JVxsONv1Bw$gB~lu)g31n&HJD*u0|r2Kjq9iY$qlXpPC)N0 z*U<^|&T$=Znis(W*D+vG1ZTJoAT5btnd=w~$gXl7pgJppb6m%VfYy1gFNokZ5nSLp zCb=krOI$xALd^5J2rg6eB|xw&0vGJPqU#0G{g1)@_mf>e>4ky2UUaX!Id|M_*U#K2 z>BXZURBqsBzRMVJpGDcOJM??|{!XZxO&7n%yW#W*Uxuz4hP|jCVeY4q@A~d~{)I;~ zt-HS584bcDbF<W4XP8`XuXlK|M`4(EF>*RVq_WNi3K?yWvM5c~-F_<FL5fv^F!Q5W zb<8%t8>{ptHXbP#BBn6ZP5WqLzSHLeP}671JxWKk2eaKHcN@^>U91m}a&#%|HUWu> zBd>!hJgEW<UEaH!4nyhF-pmntBw6&MzXUawG6GsA#GWPgZ1J2KW8u#pt435jhkB_w zBZeIj32J%(m&N^6v0oMP2YDTx-`O!EY9g<&3WX4F>LyXyV}7+8+DT=!BhO%Yz1WWu zKaR$smkw#aO1Fr<1!;9_noW8oJY@buSuwkrc_e{B)XN}sYhFQD&l?S~W*C@7kG&~$ z2FrKbl1*%6N;+9ESI~C_k6J__tVL_VYFQ1GO_byF#WJ0f+doF>8GOo={$o^#l#p?` z#x;v;q~lD#{04X1;w4t2E=$Pob62J8a?08azkz6DJWLvmFS{`QSQmtT(p48(L+mxh z-Ym@!u*P_4SrAE!^=)<h-uFlg0?nkz)Xh?`ZZhb4>F{V;vVc@3g&RaN>}9Du+Wg>g zcQF@JZ~G_<dub3#!d<(in-dW0dV$~WoS|mEWOqI%ZZ6S!=~$atZWQWyOe$YPp<A?& z2Td`ARgk2z4Z3D`!puuY*>IGpS2J2ypv%9357b!{!d|f)yJ0oyLAh+<KWE&^cW^|C zzen;zKl)q2!yNu5D$il&EU|A3d6oGCi82CV<ORIW?1^+?G#EuD?tJWzqxgt49X2|x zxg^<!_KaTe=pYjr;{NG#dNjb#GU<73n*psIYMzAkRm}Gu9z}*n*ew9MW{p?M^G(gu zBO^?|DxMO_`)C-QA#VsA=Xr&jj4<?|3AYMV0HR*t)r{DKe^MiI;JnXyJRFrzZ1KVo zFM!z@A$=xRUF<c)b3hzW#2>uqGj%q#)oC{+ZAMof{^X8sMvCn^?1XNSrbu?Y>}VJ& zJ)?$klueN(=bHhRB)I6RKOBZh(5@OHRn5EZtoh5zLf3L+>KdR!I!jl9dzg-s)NEtM z5AdjY6vDb-FIY>UXcg*Wyjs%KRLla$)B~M~!9(+q3^QP?%woc#UEy9w46lkl-a**O zC$h%xeHbRB-$OTst|XhXem&pwO(lEKhVrIam1=YX@<UX6-G%!DsRp7JeW=|ds9ktI zQ6C<Zc4#h1jMmExx8eTIG~_Pg&8uZdlA?Twhy6BTH?8qndHNH`Ev1JJPY+3uf@#SK zKvH3eF90&ON+k()fFAU)@xg#|zbnKGTl`#ze&JjG%uG?Gai24_HZTw%G;M>uKDnOG zru-Tf?2%HU9|<y@n_azYs2KCLbwRuUD_9qkfh?x|eOnw<#Ulm-{82kq+9Bsz*JKz| zrEP1w^QLx)@bH#vIZF(B$hv&hyi3F;dB6ADXtVbRv-0L~svT!Q=Wd+#;DFylrTDmA z(+i{-N^=-Vc?T29w^3+kFO3r2Fq6j7w!BWg3ou#16l2?tF@QJeWj+|N(Tx%}=A@SV zHqFe|@h#MTgh!F-6!t>pnzLY?wZ|9#w*!=}KIxtk`=6p=uumm(8LWC)VfA5)4E$r| z0)3Hjzy^h4)CAN=RudU34wy7(3`od}YCeo+n-zO4;v4vhSI?_FfR)kS9Q6|>YP1#! z)we!Ea3B+QDp_3EtIH|7e$3;9zqOt-b-g{W&l+)w{S1EKfC4GROo@_YQCOfPAxt+S zbh8VoXL`FnSTom`>A<6Ie;am-6zvrIs*z&lGhc{k?#fiaalKS{LKCCVu1^@rydo28 zw$h!aXis_J;SjE47<A`Md*EliU4&6hYMSZgEbXFE7R>LvX!h{rMzRVOSFsxQg1uy| zqP~Rsl*pd|SSe=&meP>?EgFY^owI&p>(9j}FbI%Wun@d=#NjWA%^O>PL}p^53;>6M z&%|MX!srQ@60nz*2Psg<E2$3f*Niqy2Xath7<__t>f%MC_#XX00@g>RA><o85(_Z8 z$j?O&n#OZNG!83u@P>GD&=gPDak9r>dvL-xijr4&N9~re-KCVucR>hU9qbzw0?8xr z=>~aPxjFK;6}^<J7};Gd;&lp6y~34cHwg9@D!O?B1@b%SmG@|sdLh!fnjzo;j7T>z z$Q&|tvO_~p@ct6|pag{?msr>rtvT@gJf1c1op?XKP)dDXnR3oc<`b+4;B4@I4Al#r z?|`Hp6geajv}LZTOO!KsgqJ|V;hX%TB8GR!0B&quW_`|#g)*Rzz;~zz=KI})x5X3c zgI{cbKn=LR+#pE(8$rsjbYtu98Cc9vXbGAQP~oA3jVd7lI{`=l4B+JOM}!<%wNO5< zi~UMbx5a)fuVZjlOlaVkPt`2?p?09DfHW*o69<2W4P!b?fvJCocCd$dn(e%N%ObEg z*q?mMI>1{HXn`?Z73Ymg+gr?cP4Ax&;o6l=T@QD5yeR3X;|fw4?K5%%bT{Z(DLnJi zVjwP)7x7*%_)1Y82u2K%BjVLxrQTUeb>tzqUL{*oL_9&+&9Gwcfpy0O+GKAGzU%P0 z6b0(Ki2yYS`~E1-3|?m$uU&i4@78mrsw5esZZ(X&-XJi>%nG#ChoP0>)2@@oL0{WJ z|0Gs#<FlXQQM9rEQd^b-jGnbG*>iBrmaW&(s#;g@tO3I<>jL!HR5W+eDJs!Rt^z%b zUI!JXwY6E8MpA7jHlyc>S`+pBhZw?!URdLErNkT`Q<}&c29xj4>-{GxN8mir3|nc5 z^N*e+OTvMgqg3G=lq%%B;ECu0urg*85>kG97mb$M%4G+l(jxyG7Vz+$N#DlS*GUCK zSg;!68TAJ&IDjKZIOiZHG7%3C62KRq8WW6~2}gf#Irr?LEnh-{sz7E%{P3fX5pDwQ zBrRWxjBPW_Fj7{S6<*v~%=#%b0a@ef_?-v4VQ=4MLkz5jWgNQhdcbysXrJwK5cXoE zcQ^$HE!hj%wbQoT-c*!eIQ4$~SDWMuPtWNNWeWQ{c-OtAT;yu})63pOn2YRFrjX+^ zt3$HfAVnq$$w?P}S&ZDziLG33UvVGCp|3(X6^Hn`)4Wc}BuW5HGLbIKJ2Hjt2!>g@ zS0}rBm<PaD^MjhqQoDH-F2^GF&-pG7_Pe(q2D<+1;nDk2rgAF&nd6s*cW5-gQc2RH zUqL3J1TrI^c9bGNgBVFWGV}x8pmYq<T(Q#Ckmgr<o|0eO#S6A;6N{r~^Nmpq(ycM6 zkWH<?m6acZ9l8$ll_AeIm9RA~CG3Fs1s?Tv6vD1RT<5GAd(E2Tn0(o~jFw}sLWn65 zQ>o0^<Fln09XseTsU_EorHJep%nBp{OHEt^xQ3McAk}Fhoh!F6Y>I?SbcE<whU$L^ zf*_mXFYuTkh_XZzyLft%G7hTX6MA@$q^KtW2Maq{3b-+leG^&>u@C>`{;|;7ydrr= z$c#UHl=|cptjZ1hS;fjU%_fc}Yv^`miis5&p5hN#gTKUMG6yjKOHiOwP9G_<Dc<); zNz$)y_UVl3GZZ-A=WJ%bD9k<`4o5`OXe>wkoHYUrH#Ex6Kn6I1;1W54Oa!v}Y^=%K zhy7&F?+a0cgRF?~8J6MC5F}vP!o$Nv2m#06`hc%C{=e>ii7mnvosl9fbp-`Zv2|_| zF@9cf@5j~wHk9Mb*0p}ZUN?LD$kkBdh%yfBr~_IP_nSQLuNrrE5bGZf<-Nb7g=p2P zHSUzaKOF{4#finI$2LujIK635A3G-93}a!5=}j9Om+#c>Cv-=&?dQo54i6Gc`A@Vx zA_#>B2u0pRRZ^-+o}=PE72l=ednj<p1m|<n8zs@fDD*<gj)!4#DuOZ8_z+)oTTC@? zN2a5p(zPOTsqKd$a@_{5Am@;lU>fqyK0xzt@TfHul<&$zmkJWOl_jf%j7`&-64cY= zEKM?<jiMI@GM&T-ssS&cng^K$mQ9nSw^HDe?`jCn6~-l@@LxH%PgfR4QHZqbFb^Vc z<<}KG*gd}8FmarFU5%oQf<?9o6t$HT;0mIjAf1DVuI*A_>H01WxU~%f6!3)tecs!3 zeN}!$cWIqcZ0Sw~({N`&iRqW^@;hDznYY3$(-lPSyqOyZI+8w}VqxG>m_pLxPNW6$ z5BO2A&#D1rn?@ki^2Dj6cnKgyq+=i{anDPMDb7wb=w*q?FVQMQ=1wUxua4GVAvVy7 z_h~+c?fa;;9o#<R9*NykUa$-I>DeUWr{#;S@GeLI{soUol+>%RYO6?<j4%HmyV-27 zNJ=Wo1u7O%=o)T0(w^tZ73y-SxJpHv3Q|ClvNG~66=drqIm7a|s36-a$vzoFKte&O zQ@HuPL745Pfe}<D-lX6IkPk%ytXveWdev?<TPv*^%9+-D>r88|wbrV%UT-<AYU>;) z-Fu{?=vT!<eCpv*U!Z`%yyUnJdLGf9NzFlW_Um+wbQo~j(**7&f48;DZYWSu=7j-^ zx5Sg=9dY<g!qCRnEgk~f!9z?+8S|4SdrXpM3<af>@#*6-TL1oUz=wg)Mf%4L;rx+L zg4+&QzED0TWTz7TSjYVcuLj%j%*e$n2D+rNASYqcA)ny@htm~52qgLKboWbM4l+Cn z>G-Oy7a1O1*$<EC0y|6)>!9@TjjrXhYHR;Q2q7h=`!75u@8UGzRkUDsn^0U7+q6*Q zF{OehdK3L0&_}<C!YC;+uk7exB2*q3%Zh&kG2o<&W%Bg!(qSACF@sAOb(Z`NW0cu5 zXB&pxsfB4_1C~oK@Dbgrvnx3M$5KOZ``!FHQuSms%*s1hxY&t{tVSBsbq8s<cg=+< zX$|^a%kOci&Ytr1c6mdq+`$N}yWz*r{3CV4-45N`w^TUvDIpFGirJJ~1hI6L3U|BQ z6;H;ldvRZN)4h=pH*Xx@5Uy}(ar(h3mD)$oL<$?%i=|iGF-|d}cW}O*g@@TQN&j*J zSvEjQS7W-O7($hh>NBG%1GRIK(?7&p3zStPbpp<nV=da%+Oj3-P5Zn_A<j>hCI6e% zVE462XCA1R?t!l5JuI2VA>^~fm{fjBg-^v#sQ`bCo$j7tGMU?M90<uwzJKXnIMv_5 zKNjf>(x>nj$u^o4CJ8}zb!sef&z!9a5BVQB=-FQz3{#mgL>Rw($SIPr5+X|I`dxEz ia*t4_NZ~Ewb_JGu@}IqET|~UFf=FR)=HfpuEd4i~;Ao@( literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/develop.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/develop.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81ca3c0721b9471e2b02131aea91021adea51161 GIT binary patch literal 6518 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 KJW{&+oBsoa`yxF6 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/easy_install.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/easy_install.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef028aa14121eb0d7dad31ad657bfa7dbb0fd685 GIT binary patch literal 71233 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 Va;`aE=bD+xF$$HAPEJf8{Qr7Qe$fB` literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/egg_info.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/egg_info.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fd3a6bc802d16ac6b1013a0ef1f01698d460771 GIT binary patch literal 22536 zcmcJ1d2k%rdEe`~XD~Pk0_1X+Y#tyv<O1X#+Jk#&SHyCcI<PB(TJFv+H5g1cfC1*> z>j6o$$Wp~zD{?vUT8HiY5tp@=Y&njjlx5|tB;{C+b5|;fD^A)<rBq2J*>WmQDix=K za#iyCeXqOcASfxRWPs^;{rcVC{k`w??C5A=;+I_aTPsTaTh;eTA^j4*o|90@QL2oq zrEt@*R5PK<NoDaqsTwKOOsjI*+^19{qncS&&YJtQYUETiugZCIpJDlOPTE4+>Pr_? zxe(=#sPagZE~;`dN{_1YXp|mP<*_I|uFB(4dP0>aB%M`_N!6TE<tfv5PBr$a=CmqL zoBO<K>{rbhRh}{T1=W~U%>$}@z}%0>{XtbeXzq)u@sMgBQsqPDepEFcR?SCL`4MwJ zrW%J;^N1=RQB7NwZPh%g%12f6m?|Gr&Eu+kTs2Rq@(I<PQ{_3;JgLejO--!CDYbc8 zl~2pS$5o@GnrBq`jCnkv8fR7WQB{5v_mj$*QttsE^XgS+pK_*ogR48E?j==u0lE8? zGb6b(%1ugc0=cuwIUu<QlzTvO&nf4iavqY_&MW7TavqlSW6F6%Ifo_vxN?pt$CmUH z$~mf>W0HPSImeZALed{m&YW^iO8P0~oKntdNk6Tel5)-{=d5}UkbXuvk1A(g9zCm^ z1?8NR^abT))N<*({~6EiZg;xvcEek!wVTaq%UN*O*DLkbTDwrVsNHJUwX3#M_qw{i zy4|g}Tc<pmMdn!q542nBw)KvUns%+->bkA2_aU*mWCgiP^@jUN)J1w`5x;1l;ax@{ z-KsWT(Ymeiq=;%aUEQs8s@)CTCmZecCH{K#+x%%(JNU_7G{ZwO?QuLv6mL}<TNUlz ztaWt*_am-T?^e*<T74b2`Bj#yV6dfJFx9DQ&qd)I+Zc0`!wm9Xb<M4`s!cZ-HIFe4 z4|5EP@+7(&*{Qn?r_!jmTrViR((3A+H`?`9H<+wrDiyS)cPbs`c)>`wU0K7l*(%16 zT5q&hIhIbfwpCrPx7KSGR|lUleAD<|#MjWgrS4klj#8USbuG1-P@BLdWF}NMr8d)& zX>yX}3wM%g%~CUWQ|k6iqMK275-h!VJ(qYlq3)*DU1XtBHhciiabOD%aGz05N+GR( zLEXtJ{Y7;Lj3up}M)x;fl^aw|Ne2lv6J|SEbvGx?Wn@%&b^9l+J2`bHueOxZFDB3| zZV%oqs5@XQIqBd(ur)M=+gY~L`nbi1sDj>=Wgg0d$K*jl9vn`fA&htS?ufdBf78SB z7JC>`2b~cqg?q59;Zmz{siKs^eO&7HnZD+Js=r`TY23#JZ@AVq+_B@d(!b7e8W3Rc zSYug{$HED71StFC2~1ts=G{?s2Z?Mv(En;Vqbke=<i?`1cSfUDi>6gn1R%y09uTtZ z1}$UNTl@HAcnD^Zp2qVV-%-~9Nl$<WypRFDs;;pHAcRII)GP+RT$=R%s9@uBRaaYH z!;m-e)h6}X#8$ge-*W9!XBN7*yQl1W%kH+p0<^on-Kc8Yz1`8SM<Q7;?QGONuz|HT zP>#K(+f93|)vR`F8w=gIhg%!<+J;?iG}^a3`&PZ-)T-L?*she6c6yw|b3uz$FcojX zzT8DMuWfI&Shc#^-tJ;#XU?6nO`B5R#go>K-P&%hy4r594YXHxJu}ci`RR8)JLg^h zkOb%_&YbZR3upYo>5pER^UltBr8Alj0_)7K_0e7Hon7nbu62Fa`s|XQdI#0~?7QXD zA8mT2QXU+r)2MfYMB58eTsQD4w-Y3^8)RIsR_(Y!-o<cSOv42~b6Y_c+_i&cE{*B^ z>?Mh6L8i8`-P-c>G31mBH>-`hQ>krKbzs$kv^)z6jVf4}Nn7=DUQ!jdm}1Ftw%%%i z1=WMJB!U8SD>c;e{+!Z}q2b+&=eo_#xlX+UmhE)`h54u5C!cY;Zu?x1`}Ze9L2xb- z1Ph&=U^0d#*)$pW3AF89#YJT^$^D5bYcz4tnn@O|Oky-SZ6%W#t7wf|1*@2t#CH_m zLgHcE<C{EUjU|f78I;Q;C#;M$k=SQVCiA$Cq25?RKY?~@Y&`m8ka!7S?+<Wsv0lJw zToV-EP>o`-2Z6T^eFq#Tt=91<t-vjit|JY$2mNJSL||6AU@=fzCV30efWGAB)h3wJ z)Ieq|@u?q0a-RB;NOy>H3R<X04^f<>DXK^hQ=Bsm73na=In(INrZ{IBD#bC1bEeVV z35s*3p<SG$IA?mALVdY3ALJrH_-AWBx<ua1Q%bK^J@<vca(6%3BQT2TYP|(nw1*@I zz1XK6cdfeJ=w1Mcc0f>ecf+;4_O`CMc2~P@X*bucuFpHfZp+y{|FYxQys?2^&5nKA zU07eRA3uNoBj-Qz_%kKac_>Lk8r?0h`sy|~0minvJHOm<YxT7qGM7fZR`1$)E^G%4 z-(Nf1YKMI<?jBo&M$!eBsx`J9w|^Axgp;^liv%uzp;{Y(`$;4mMQK}!6M|CA0alqu zKrE90K8a|q0G}XvQ3l9l9%Y$WE+v<Qe_VpDApjG#VuYZJ)CkEYK=hO7Jji2`6<LIU z%UO}-9ADM#Ew@FbMU=20eG|_-Y7(B?SQCmim&e)06u{W6gK_w7rQM-==6wPA-UKen z$`AbchoVLo?yohlNL(n<N>WJ3<g6v>v}EbmkTpDt2@c=8*`g{|r)c;J3VB>=mGBS7 zy$+YENeLFh_rZN8q)#kFwXy9Eb*(>+sy~Ns*jwBrM;<Fzuj8gGIu(G}g_e}0PDOP| zsk=$hxS&=6nxa-c4}s29N<9zpNwEubNHgo6vhF2d5Kwo{`oAG^hO+ciz<q6?AfzHA zCEW;7KrL)DJ1#CTCyGP98IEk5tSxuPqrk1&j*AwX0F&3P*X*`-Tpd?OYt@_Wx?@-M zY8`AD%C~l<2r0VVvc2t94{9#dQqyiI06EfN<aM^?I*WDa%!^nTL0bI^Q^d-pQaZ@4 zyIt^j9gNi4jRy34qE(P`P$fta8}$fEmQn^Txk%eBr`s$d%?yDlnDnYQ-G~qbvHvWZ z@Cvx7?39&<5GYvwLouq{S3Jf~$^mvS`1w6x4FC&r+!TEoFa#$jbsDIq1gf|N_)rFV zYeceLXhq1$vOKh`olmH4USM5Nn<Huy`WQ52!4X|2>9+(mfGl0;Y-2<QRyWtIT7#C1 zhVXA)Ydxt_-Ep;5Q2KY2Wm(+`wK=Ia!R7a?^JA8JyJe}j*c`aOQd>DujB$%8O)F^k zP@g-0pz6qh_(`emjM|*#_)w(+y%6~ah@kAfdoUaqZh)q<Eb@?K?F;K|LDOBf*v28X z`EdA%Z9Eh;2|)%E0Xa#vl~KB3G5rXaPEzI>#&%d$pdsTK(nn}-z}VpU^Gg3q3+YWe zY-RH(D^uY|KFXtow5l9a{V-t8aaK1CR$u{>spgja%$)ba3v-^I<u4PDUv7!2G+>q5 zWVaxcSkibq5OTLK*mK_eoTq1jG5R7dem*u{cdhx-2~8_3DE1q;K@RvYR-t~G)!yLc zRTdiq@~^v2gva`0d@{}_1+YDma;xU*8D?Z7rk{N?G$~UJ5VIbY(r=QLiTxYo*|pfk z&>d+Jd%^T#l=Zr>bSWsK4@Qg`=~f`kgCxeOZ8n&xZENO?xh-#7%Tun0p2kB%k4IT7 zwFw(F*k9XlYg?6JL6d8O>cOz8<x#45DCD3QuNx%6mVz{NcUK3wXzsx{3c;X`7o(Ih z>|ks#yNs2I>!du$c`_1AGSP8{nZ(3e9d3a>QTFFCXzv+Zlyv~A<alB{k+h&{;(8Pc zW!_3!hmzw^GY{i##+tGYQ{hZcWs24b<W5<A!e_YcOEroIe)yZhm+0Yv%1GSWPzKUq zC!jR&ez@OSmwR@(F}AhKXW$Q{+P6rlMf?~$je3IAW>pkfCThcg6)RmbO3CV90|&dN z;YP4mxb`blcUB^fx<Z6@+y;b!U0<`^W~aMTh~>cLwWtm(uvWV@FV7!^sKLF4r380{ zjie}Vq>id*udLi+XX2qaU0PW&rV%B>Kx@(xghv<cc2Q}m-Evn}!ls9stihsy;E9K| zvSLPT`iQ1dT3HzCqrX)bMkYs%|0=qiZ+GJ6wp$IDoBeCz-Ue2Bk5W(?Bd`XQ3iWPP zwdl0cj<@YXK#INCFM8X$vr%o~k(j)vv8XF+ZK$;??0OBRrdxWnx9E;NRHCc5-BNGO zmi!ZQT>7pJLyF@Od+Icr;L_od8EPpT6ne`p6sv_EGv>J_1_mjPKN#s-yi(ebRO;47 zwW~iZg@`0UTE;v~KGUX;wyyNG5fG_G8_Z{fME1ej8cn1U{v)xl-K$=W6v58`b$k{X zkhkFYz~>%vLqUSD&}T^to6wX6!$ZX?t-P`_&M62$N>vePn-BuHg~$TUz(sKnG!EIe zTuS@DdhNmVKzMMyp&?Q2*>08W>KarfH~?Dh?N*H%P`%rukrghT0CyX_%IH>bFWODu zRCOKJOxvzIP?TtVuqe@B)nzMO6gV?uJTy9-;7tz!{0SCgaR3`7Af3|N-L?5=g2b)W zrBXhGEM29Vic64u<LxKF=UcV5;|5vGp@KOCsdfhjeOllE!@to68XDMZ548mJ8tV?{ z#IOaR+sOXU_<9s%Dzgt<aa_KmmcMTZ#6<d9ztWvVm5Z!=2A6)o0!|{T6UsZOx&l>z zo8SU)Ve9zMEE=}d$E$uc*!Tv+&6+{mlqJ%)(ZBv2FE%bg22@{fZIz7bZ{|;5hCz8+ zK3e1Q$M||&SCyE+oc-x|zI_x>1BaClCmv7u72J>?3o_q>86avST&@t8m}#il2_hrM z*a4XSvPrRKB6O%(oWxZ$7mQGE2<5&}7;<jQ@ov?-8=52-P3JA7hlp3diM#|x>gAA7 z)_C#|72?@=LW7z|JSS3T7GDA4-$265iB|(IGg3?k6TB^w36zV8EMEV3sNce`Y$O$| z8w<k8Xvw5r(N~$1rK+|m&JokH$pn&6wB0Dd&p7xzrt~l$dLmSDOX+XP0E^+RpxCIP zeQJBDC4VBGu}}jPg?#9>a<xC+s&?zJBO3KpkKW1BSdeLML0Q=_N)Dk=9$#~zycolp zX0+ai+#nk|{+aOFjhk+e5)H}5Lt)0c##DzFqE=9Z!r)Yl)5D9X5s0FK1YCU?GrAzr zY79X#NP?mZgyb{|D{BIZ$UeC~nmhoNWHjLy<2j;e49WrYd>&N+s1PeLCg>vuLzVb; z4H)z@%r)HCFkSH&15N3Tpw8=O=jYy@YtA{a))sLuh8~Q#I<`D=P)FC8`ayU}<@X?G zQ$#{RcH}K8Ui&P6G@b=b!gv}<6yx_Iz8<Y}!&X2p9JA<36apAF<N$KSZlR?msuH{^ zA#R~Fro>FEz*A?~&aqcrxI5`;T7LaAS1!J?Of-NOxm90ty{>R)f28jbd9aN^^nv(E z+y-M&l}fX^1+|-)6Xc>y{io!X?2<}*DJgQeJQ+QYH+X_XvpEERY^Er6lq)92ZGwtx zp0vC_Uax-4ir0<ckF`*?!Nn0Im<_QYf;26-rv>V=DP&Lq%NH&y77h7WN1=259(Qc8 zj95TW<uqjMY?z$olB1KnP_aqjTEX^>JgDT24VGT&Gn(`=hW6nSF8(hUmfBtSg8eoe zgEkBhO@~8lUG;4ZZb0#@+Nb7aGojvv#sqEjxq@hX*bQiiM8DP6Ti8HEE46L|!Wc}` zJ|_AU+|N*gZ@P_k=h#A_@J7R>zK7nZ(?)Wa(l@MaRLPERuQuG~LZLKb%s3*X!G$VQ zM|r97A~a7%s&DW@{Lq(h3CW_IghDV3WQWfQ<S8T+NMZ^W%9NE!?E`@qE&p%~>^+UG zC7{$tP*Fd{%hR|ZgNBZNmX`}A<2k0E=j8>H@gmb7<>e)2?1wofc50;(6e^Ww+u3fo zNEa)W8{5?e*9Uiyw_Z)x#gYt)P=j>jDGbI}vGMCxTX9CQ<*pkR3umIfj81|a7P5og z*&T7U1sQ+@`j)=JQM7ou$qTg*;hQ4Jgno?OOib2Xt-ci$N&YzVxYn%ioyG+_2gxK% zyCmE}dF&1pN2gNz)5Y=Px$)`ZSTR$~A)PDcq!u9;e@Hto;p_cXTwKV2zP$k;`+LX% z<H3JQ($G*L^D>e~0{+{aq~Xy8$`>S!Ot|}tk_Pd>zdt5v6o5~ELekhOh(iNV7~UI+ z4B*~Cyib6NQ4|0-2I9?sG!k$AV`JbEu<XN{^QiH{55+pMl6dR=K5|K+xC&Xno1*lF zkcKu*&kKkfHYl{0t`x)kh1|(?Ma$;ipLP2y3EVASpOc+ov<3k$Te;qAk;w|4j2tL` zH(pcMTD1flPD{i8IBFQH1buL@;R{0zgZr3<KZqKJx*s<D0U9ny!)Ay0q-X&cF_!ke zhQDtOj@UF~DQ`Dw7~Cpscoz+0rxqhN+ryua8U{S>Yxs*p4MWbD5yLkoY!x7n8eWD| z?=5L~OqSx`MGa%47P!>ccIXGR5Vs)XJ{zqxe2dZ2df$$Em|zc7jHpC?8=d?&0pz4~ zaydbGV_Bvi*vW4bxQo~0POublC$oug8gLNyI+;yeYyFgTGA*5aG3sPLU2=jX>=o*o zh-L5hqE==k2YAtXU8>JY^}iccKQK@o>fKOvcqNg;>JxOJVy_HfqQ?~8PcVn&(xIgQ zJDIYF<L9EyoL$TI=R&Lg0)&K!cbMrg^c=HuOe^BloOde7y0^p1VZ!#G?XQVF>znoV zw%6FfCa9D&E`U8-^T)UiUTs80{qezj+kdgYZK?@-w!>ZNTO07U)9&o|FvcB3qmDX= z2Y;o%g9i^@w!foA2p8soolZiuZX>+qrW;Re_P#6%R9LYW`ul(I1OW)x-o2eg!ou(C zCz@YhKhYFTKTG}n{GZKpufBuyx`sc%&&ZGMpY3lx8YXu*_rjrc2kN-%XXMBBp8~?| zHKHHVjDJe>ni?GvU3;V2foXpM2w+^+RoP4toGp!&r;QJ_(uKc`p%@ZjM1j4!y<X{P zY#bR4<>w&+jGZhR$}iwH2yqm9DT2=NeYn0s4+?RSzO1m6{u*2UfR`jLrEKVMVx&`$ zF@uE$U^e`{Ac?t`M{tQ^0D^4ztWUaAum}60HPql^8Jybl)R?FYsLY{s(Rv7a)3`MY zeaWQq3<}sQonU_6niV}OpP0PwZqg{($PZJ=By_M#AWTM|E$lg%SkR_0o><UQk)h$0 zP`6iUx*!gV98nwrkf{fZ<^Ybpc>QJBJB*%#6(0mc(<i08s2iptAH<wh#O4c*Nbegb z5wk<HChLD8b~9aZo9&w}V`U<4$B-Jja7l#-&4HEErK3tnUmgHSvF`@->G`FuAgWKd z5aY8gj$=m0#H_+lGo1O<q1l-ecYaA9!1Vosc|g8$^~3*#kNykDE~SDrB6`+cOc4-H zOFQ}(<%vO?d^{3*C_$fk9#4l+V-&l@>{g5@@5hM};<`#_tdp=S55QJ}wKNk0Z=iS# zG@>iNq8*(_0zfmW9)M<aq(y*(hNXy6EHqUh*vckFAJ*~9Vbp+GlD=g<6{7X2g&M{u zAF5@<6xu(cuC9wlcKxu}veE~YBGJy^lS1N433UTI#WH`W_ckgTw{N<R07hL(1c`<7 z`t!^l^lj}Ho+q3cG4$eBxjyVWuly77nuJ8Z@O+~U_q+EZ5>W;8BmqY7EyI231S#tH z$b60ca6?7^`u#m>a+oi(E8|T&2ukxOhPxYBe2z&L|6wHJHSb?<Lo~}J%Rl~#k<KAX z@43(z;u9R$w{Z#5f~^CirfNU5PKaJq>d$c01dIap_l-H^a5W+cKcw)O%4xr1%uufk z%z!*Z3#ii|T+y80LjiGtfmUU2)e>}qeuZkdiaX2dLiLu^aw+34#dH+mRga4Mh4Lu? z9|3HAt3dJ&F|J3$j8OakfPMNmFn5@?-@(sb$fy4j9{ggosCflOx)38mtS&?{WiJd2 z@^P`N*cG(d(NSJ%ybw9{U*_en;1W63ew7)-&T?^WyU~c`%bvLUODOj99AFL!l{#P@ z!S0{`(1QmV<G=u?UqEHxKpbcbijC2LoI|{y1U2+~QD>J+3I9_uj3bmLZ(Sp6{=Wn< zR!H#P#&G(UiDaOO^I@2Uj#o%>hbiHgQSzG+&{XR1-s=(31ZkHa(nd_jCEWDW1lPcD zPpm}9J+T^+B2gc{AIl~D)1dbPAp0&_)L+6S$kOEnYUl%e$dP1PdvT<%q29MRBg2v4 zIJNw-7{;RC4e%qvR`}6bB<_dnJsEd6A(=)GsE?po?jbR_l%RxqNTC}}gmm~rfz&^n zy*Ske7}R%S_#_VX&qegj`{qK}c#tu|a74Uui`j&CK*+%91X*TwW_licndDC>^(PhM zhhdq5dwn5lqE8+|K7|m4K^;Og?SCak?)yR8kKJTfk-rbTEIa@($j{=YBEDu{4L5kP zL9zpV*j-ygq#s>|h*&~k@p`D?Fut%aU}<SjHn@+AGlxqkgbz^&!_^e~N3h#AEP*XU zPJNsY(QG|fi9d?G?{5=Kp~OAgLpZSre-PVa+#gU}5J>-ZG_)sO_c-64A~_n8jOOcT zgz*8!_nu}f?IA?Zf)HjOFs}QsXithDn*$2{0E$?Q!56c+SRsuuVG!VZ3$P!Ra6~cb z0Ymg5S%Yt24gO9{I4Ka$eRJQ7tC4zS?v(VHED!^;220aNc<bOcX`=AqRX58Kv%5$| zgu|1<9_&A2dlu?(mulA<6;0Xb#cBOx=tPqN!3`@1M}YJj`Y$pgBL<)osxm<e!52-# z=4Fn(iT*8={zsf>0SRmXa?2<&Zu#Res7*^Th>4=?Q>JMn!NKBRwh7F@V<?+}W2Z7D zqY^e8WPqx4<^E074Sn4~nj`myr3;bvcO$Y;{bMppW~`>5Om9rbaAO!TM-zz>gLcS4 zh#o*fq58cT+pf5<gKLN*MyTt8P?FgQXt%H>z?CJIZFs%?{g1h|DqPwKPG<DiE$j_> zjJu51Om>DkIJbZeBXTYA88mia*~DG0tVlmAD>g$OdB({N9U6_DFyIA&Q5$V|oVH<m zt%CJ|$`MP@ZO3hBoLH!9^ni_fGs2!4$2BiwCG>Cd!nGC<JRp)b3u}jM{a(D<xjvmX zd>Equ_1O`81qJ>-5?D}(I3vXge51x-p-oufQ@y=HJf;850vRl`yy!WQ766Y4&<Lw+ zg;gLWNH@k=$x1tqDrmphXNn^^yf63Vh*qqBmb&xuwbogLM8eyPkjUSbkVx!NiBf?k z5q61~`+Er7gcnpIA<;9`=_UUty-Bh+1YePaOjNO>W6#gq-d4TS0TBIDQUu;LIBsqu zwyX=dNJ-kReFZOtVHsCTBf;o)tIqI?iV3<K6Y%eN2%2GT&&^UU@Kl!x)#y`Vxmy%W zea5u$iUe{<d>)Q~?0CU`gaCvMg3zO(L|X1q)GZ?>pjM$@s+`%Tp1V=bBV^<mNe&Yp z(dGL@g@=*A?yCg5O<Jksl<X>}63N5~D@XNrUxe}tJr1-~n$%xKJ^eGh{46iO#*65d zwD`n;($uFl705ns(ARnU4PMBXjN0~FObG(_SXYmKksUo74HcU=my4s=vPl;U#jN}m z@tZ?_!R&INbo@yo^%A}wB>3?54L5EggN%nd#2R}K%P2cI*t=mGTN2o#$x9j=H`tdM zku);l`yZ7wPIn+bI{pFF=W&kc_y@Oa5TLtHO2R)q4Gi3`-^XzLkx#w6botUN%U2OJ zU&H+5!(UEV2=6o!6scfoal+UV$idjnBOyX?yCsnvrBs<)aX>mbXyJ(ut~?rVFq7ex z$0W=PJJe=(dvBH@yL5ldg%@)OZZiJ)N26M1gZuw+#J}wPC9nb}?B4Q^40SggZMpZ# zK{X|_0`YV4L~w=T797cJAt0s<X>82^{h30*wo!e11ra<3xqej&VlO)^C_E+HsKJIt zlnqq?vE5-A)2#3t$i`8@Ofgu7=w1Ib1{#b>%ts84pjdSfAsYe^M>s+!Zg~`Ebe!1n z8H|g5FWxTrcM(sU^4hvvhBH>YV9qv=yg)$VjE8a3^r%ZTAjTr3xzy80DA4_W@sOG8 zD7C?<p~YuZ39*wO{wDFgh_81H7c%=;;gJMHv#}$9sbK%a(Ov5tc-D7O91I&%N6?H2 zX0tAACW;w3$})o^4)(=sRB5$!Q$l(tF%aXXfokI)8yfK*6=ICx=u`Oe*LxcmqvvB1 z_pltHr2~3P(9#K?C6pLD$W2OC5~pMnl0x`=I?RIb!G0ahA4nd@#2)r!`ZWnc9CW-w z(42}@6T%W+968z{dPW?966*!rfp_fHov>Ck=~F%JAf6@R#94}Ea|DUdve`du*$j9U zE&WeWwBMUEfJA~nv}qpU>az=Y5g&_&fkj8?%fcX5@8!_(A7UAb)TpZQcu@E*LBszN z8rHwX3sqi2EZC64ZWGkYHnJi|9v|a8x3?}B6Ae{H`S<W>KSwECEIo=7g23!Yq7L^Q z>)uFy94(Pkh~5v*;2jBlJjevdf#I<>oD2?Byp8rY&USm-9eA&?VG-^a={%Z|fRG5& z|0y#DF<qV?<){fdD((Kh;Sod7$3UjoAR1r9SAud4F&YVBNY8&R#-3<McC(K2wypJf zDi(G)zR*V@C*k87{y`o=aB#TR0BGS1_n^cTk6CbGj16q*y(aU|@O+Mw!51vYKQ%O! z2Q5`RJx+~vWqMyjBIGr4C`VYa(fa@#Q4a^Rgx_0;6h^$#J*mRDCvf(61e_)o4Df@} z+5$*LZRAchT9c~UmvoQ2Lyk-F(CLE)aBc_JacRS$mI-P6B*s~qFyN*NZLnFio`1kw zvVNn$(=aodkj<2EK5By@!;e-=bU?6sbCdxGdd+(ajB+Kt8Oy(%)iqHS%Ne&`sWpd> zLuiiXQNm*y3C0-h!{0bU@b-xa0J0s5`V7gVUm(R$A!_m~P}xDk5J$K+qMR5%I2Juz zDr53OR2rDDLcbLZ7{wu>07vL4MF}WaV5m3_54JlizmfCYkX&XdNXtn#KY9AIcl?Rc z=_?nP?_7Ly`OdowI6hb^=WtjA2hH8vMoAjc{~Y5r!Ffdn*U~pkrfPun0UibgX|S@& zW0l8Q`UEdFFUN2xkB9Do$fX?lQ-2o^gB+{zERB>MrtW`;BF_*2vOk5TAIH*9Aj}J1 zh{HomKP2RraL)Uy979j_7HqoAycRDM>%zS?S)XtcymbQS?&>vTZ)(z`Ac5vU`UWRV zNVw+vc<?{LRRl$N@*1jkvREvp_?^lYi=xBEd@_mR<ZFTouOR^>i20<UHlPAvNT^1B z1i%uk>3y6;6Jbfi%~0Vr$jnb)c`KBhpNn4>V%QYp_b5Gi<fpz?ha8l6J-#MHB#wP5 zdRxdT`*c-Um^riv^B)#G-#5})=i35cRl_gK9cdfl1ZN`U)c|s;xZX9AG_VSxfv0a_ zRy4V5_ytG61=y?fU0fiAK8>Fs7j?Yn_6OzF#|U&0M5*!QIF7c96pObJvM5r-SC;Wt zkm!OyjK+_pgM1;uAaed2LTW-eA&p?W2)7x<a4Cek($YpzISPRgP07tMp39$>f`}Tz zV|n9*bqx#)K{VKI3X7R0-s&0_Xv`$BqVd{~Zc%L_en~2aQB0`Ls9;}CqEMF4dF7m6 z?})hwY^5)uFAV=GZ(UwK#>-p0yvz#}u2>cBY?(vK!bJ6__?YWbo-{fI9X8#a%37nk zjw3KhusB0-Lcs)ubWqN;8xEYp<t%>r2nsSP_Tjsr`tPIs>x9cR5)7-(LlvIEUottJ zm`?0ZXqJd!L{vv<1Eb?e7#PtFCFl)5U{C3#AH;|Q-@Eqmm8Hu|uU>%r-$m$#BZ20K zTs7x><P-@MItfgb*XG#g7oIv=_zWCB#P%>&9ZXDKGvl3ugG^V+)Z{)oAcUj4z-<<W zslcrg8zbyVl%5j;IQu<5`q#Y3k_qw4h07A`r#=8HM21>vuOhY`r^TvVs0^Mf2Blj1 z-yjupffR1|74%(10!ssu?iAIU5xZiuf(yJSr=#f}#j)3D;eg+<lrT$a)-JgeOB^sH zS^H)D3K;<r!D(hi-u^3O3T&bNeKSfMV9SJZ&o`>gRj2wQq8XKk0?MDO7<}q~cTc~b zYRZG?C)pmU6Je^bv0NuScSYvmA$}nPuHsgkK?*H-IMT@Ma^Cn=D>XfYa<F6W@3+oT z32VU0(iYSI9{t5=$IeMfvbJAFf;1Q{BarVN(l9~5L&f1nJ&61QOd+j0kMWEzsQ>nh za$rh?@8b3I5<`fXM0hs9uJHyQF>?R3(W=6xz!)-!KS5hJUPe@j5I$uw{!vrRU$JsR zCNNTX=W~LYcdr+MV*k39iXv{!X{Fq<aN*0Z%OuMa!`O}UrUU4$zmFLUuZ44&mLH7W zn>ZyZF~V}JR!+tv%xDm)c_b8|0Uj#-Aud5$+8u_+)cxS-5F8VzqJ$qzh=@K&u>2wN zVz3OLJVUI}6+r>K7VPGNiEb*;zzy^kJizJ+WKc9-y~L6~CDcDZuxuIqAJMF=lPq9) zObSJWZ<av+CzJu64$j`pdx)+Nge;V==ZYGUmsWkQN7_7wq5sS9JW2L~ey<~8xE|(W z$hkL9B^Gi|d&7jqBMWH`ROER*h<%as$eE32pYBmP#v!OKRDKdS>w@jqAExR6egd?2 zgzmAX=>1@5xR#QEwP1En$S1%BXzhk3Y+!8-0bRlo-s7Cv9~@h!&BEZtBn_Skkob46 zpBn&^Byz?dN11skB&vs}$$Ef$T$donEndEF!9Z(PUgXsuqiGs8f$cTa5Zt~Gc6j~I z7T$+21ibJh=HM9r1SerQM<$WSn{xDjN3$`CCUFyUj#=E0D+^-=8Uld#Qn8S_%J+$x zWq=&{p(0`w!B#ph{*%#KDog(lbaSaj;^2pf6ORC(3z3H+(;$L{7hD<UB@_bAf>J<@ zfusK)C$ND+CIlGiSw2PupcHr>8pADcE1FLD+LQ=5Hu@Doh~r6o#}XNVC>B@wKmc(Q zDR>=*h-e$R<t)}iw2M!$^dMC9A0h93&c1+zg66PaoamAtgMkb@rXbQ5hmL<Sb0`GC zGDM>TR^!wpZm|a3nSX+5EKlp}Q6}Dl@GnRd$h`e|x}8wKcrrm)i`Tc*yAY-FmNvEv zr7dpv*TOS9Tq+4}he}7@pJyxGf}+j`8%#`HjKk0=-}VOLh1F};I1{~<!n*O6x(4b- zbrc}U8?_U@a03v)5wa!%NM=c3;ph3%tHK;M+ssL_BKGRBb8lXAceOMgnq`t3zWh#K z!-5&n0aJzwe5Je7aXq0OyrBv%Qcq8z4BunGxACpxn0m)Rl?#tO6ufmLBSOM6I}ZZv zVR@l{g8hI%;F<Ky`$=@btU-teqXz3aL<If*9ASR|#o$Cu92R+zv5r8DPvLC=hwyd* zypIk9$pZY4Amhz79!-sTDZoWJVc-Q+$AV*3VR{(D*xbH<QNifA{VWk^@%m$8Pst%k z@>$T6QKN8T<2gbUbO9+1co<kN-*`@4y9TJxzA|r{F;SYY;+%Qap4Z2ZABUB+Moa09 zPrN#RdFj&Y_M7HK6HqI$MJf8IoP<YUk}Yl`6c#h9$`{0dCGbT(i1ajX>@kLve}Yza zq}D_3n1|GUp<*J^1Ab~}!Oul~`uoF9FD#sy*Qeig&X(Tw&YTeTZeE8}Dh9d8Wo3-q zsl~7*bbk%XE3jlp{S6ZJwlUj|W7)-J6(sq(MMQT4U%>D_&-`yj4~N0dO}P6f@hb$s zs0wM?@C+!TZhY9%8Gya?T#&6)oOTT-rlu$dWOq>Zpy}w9t$}jB678~;CwgVDg^ss& zNC0&(*2`uC5)@$KpvYOxJY`b9!`mb}))p_&=9FfvLV2=hS}cJ1;YDjgP~}7S<uBm< zm<!xP@Qlt|=#|ivGvx!ljQHiAf(gdkMK)MIxK|k$lB+8(`6(M+XW#{)V&mb3nK1r% zmX>b?^W?oI@-7v5ABr4zHtIOZU5?<&%SZ;sG_Vn?zsuo__YH@KE=(-z^gv(HvdpmM zCwO_1m-l&T^Fl*VOdg|-{ULA3%0=Lc&=a07<SxMPLm=TGp&?=p)V-KQRgbXA;FP)f uD?)M%{P9Wrbi%rTjau9%i&tj8JM)_}+zXw;?q{|*0tZc@m>SO&C;vAYr(<sb literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e746ac987fef13c67d2af4d4fa08cf6f0b078b7 GIT binary patch literal 4235 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34298b9a8ebcf372608f8b896fa1a613b0d9b555 GIT binary patch literal 3197 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_lib.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_lib.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76fdb815691ad9fbbf8dfa9db123ff92aeacf362 GIT binary patch literal 5407 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_scripts.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/install_scripts.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..328b8ed6edfa15d776ad7c578a1a59da7d3df764 GIT binary patch literal 2444 zcmZuz-*4PR5T3PtzVrPc*Mugar0M}G=mbr~4+$ioszhl85)o37Dp^9tId3k$`fPW1 zk2I&`DV2EP-{1l9!2h$aJn_aeFYwLYT^d52>|}R6o}HQfzL{+GdhPx%QvMVX{Xv(W z0P}koT0>;`6;u#S1;v5{uRSU}n)oycC~i0n?1U7Dt9g^+rkndzv}hVp9MQB*ahs+c ziaR78W&vdldJba^k`1<W?o*6Sj~)%fKXEV(h4qVSyg&49_kOO8$`58HuS(nfHZ@1z zNRwu%No`-2dZuKO<w}lBrA|it@#^t0xrd=Yhmgb}AcENApkkko%Y1f&k6yXNF(DL0 z(4yy1!#sjlZM&A2+N4F1=#k26qvxOAuLfnMrfD%)Yz>wg?+xl=rUz+xGLYkOl9z|o z;8>+~E!9#}j|4p8hyQvQUts8)5Qb<XXyVZ+(K)AF@GOD11UJ0>2gASymCDB|gtlGJ z%iQE?k<VpP)tn)18)cQq8W{|<EDnDq)q&>UU+<Y|y;tY;ou!+1K9(PSk{Ma;X=!G) zsj5O>o{p;NG%d5eD{=4EC#nU5T?`#Skm!r~n^(2|@7G1l>`nv2#ry*@fEW=SV77?- z%!Ley;et2?h#wG{G)Ubg6Vjwflh!IdWkh3g8H!j=+N8d7sp3UvY2nNx)1_0uwnyfb z<%E}ObdE%0(s%M2od<O0J45)^=hM#uGV64@KnSkHr?bXNq2UxlrvRKd*swyAPH}}B zbOtw@r2b+o@mJV<)onJ&T&Kw<J@H7j#A$=ZI0y<YnrzWIIUUTmm&?g(1RZuJqGxxU z+6_8|pAk)7XMIF*|9hO*cAo9fX`6n=y*&L=Ja({&_7wxowpMtwy@Od^WGgJ&wtOZ> zGm{<^60b54E;+^x0`YMt$#tS;C064H^LBk=j;eAO`oo*{)(hn9F5$8(Q+)!=JFeK~ za@ThMv)zHc<l+?{cfs%Gl3uC_hZh+4p>12$%pB&0)Cv`g?DerU$zfhP<Yy~e%E!Cd zMR|~FsTiKB$NFxsOs6vLa1MTyN^>=7!c1z6io1^-s~@Y}NEL59&daPi)|WS}uTQjE zV`IUAL}J#L0VKMXqhwU1THE%as-{Vus&pE+*u_+hbsVKSIg)86mF*t$3Cp|>JF3n0 zJekL#%#+bHvjJx#4i7Z1Vs|e~d*Q+HVh{JRyc`=kbISVeQ$Ea*eIb~kY73%|p+A5i zvF`OmS8RBZh`hjC6TaBS-kMk!JR%X|ClYIZ<aP1pmY8o`B{pA%FeAr&SmXeB{t!d| z4#8wbM{qp@n4Wrc7LqWoVSrK~0aFuj_OW}3&Dg>_Aerd{4PYB^ZZ0Z7xMGE4wf@cV zdGXHlSPS(VgxKQGQ3&v@qq(adSb*n<9UNj!$Fpr{3NZH3usMI<-8$;^-~|f?jJ1KO z2IfeviuT~5%Q!X-J=+)^O{>iIMl+>kX_DDA)lcR(zFMFkgc;n{tL6Y(x3v|=`9GlI z{;;pEAzA8e7Vog&E?@(07Phm>IS#a5rEO57>DgdX<)zwYy^y;}nb~HhPMDmE>nZvI zHf_UU0=^ZMmc#Y}Vx0x85~hG{jjGbXUl@k_GH&K$G%}gJ@WzG)V3Gz3h{%e=tFXF- z^FGATn-Jt}dYgbtpJ651Vng&G=R2z~mXzMTjQ#y#)3y@lPm<VnlE9N$Au;bJ$<tX{ zu%}oxlO(G~N#c5rL$l(uFZsjmL^-T;N95|DU4Igx*A2RFxf(L;+K7pT{~-$PQXRi> zvA!r>SNv7$Y?+NNiqX3~+kvpX`pGy^QdcuILPg@Lv#2$E4KH)ewmw_LcbDt1X43S* Kx31`VJN~~*uW6A0 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/py36compat.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/py36compat.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe7c47c3153e52e17d11b9fc9217d28134ce2fa9 GIT binary patch literal 4916 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/register.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/register.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22d5fb192de8be81f81480f9742beb9adb37e7d0 GIT binary patch literal 586 zcmZ8eJx_!{5S<0?z>_n^#>CD}iaQz;EsVM33cG8rquCJHBar38T_`km=U=h#FKuh( zU$Alp4s&tCJcc(rZ(fGW`FwW%A;cL2_=2P3V7|i8Awr4|0|`(tC@hF<cuFluZFt9m z4Z<dNZ$pG6gKgk^V-su=!tq#`tT6Nqf&hpZ$zlg}J5Wp@nou_iqiQrIVN^1n5?QWW zp%S#%A9|D88be<ryrHq);hq6&dy9olEPdmUZD4JTC$fy^)viX(Q`J>Gsmn61QsdMr z&lCw78~K14M+>?81mz+3vku#`37foG<dtq?DHnI*_C9Sz9cs~bO<UJeAEyW1aP+-w zUepwoTnz0XfHh~Y{$CkqZUWbMoL6xvI5#uS%R22O<v!=nT`Y%+nqc$b)a5*_6V7|( z-slmWjMr#dKhkHu)i(xCbd};dyEd14d9b=1y%_hv^mm7Gw1j`!#(NkHKGLtyw7LuX E7icVhkN^Mx literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/rotate.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/rotate.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad0b7e09ebcc1f033af20af55d9b1a17402a51c2 GIT binary patch literal 2752 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/saveopts.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/saveopts.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9da7ea561a493e59ac0d15f0bc17bcbcbf2bf5eb GIT binary patch literal 951 zcmYjPJ#X7E5IvIeM-l}M`iU%sfG+V6yF-9<2#Nv;(4jz<3;~Q5gd)-|Q+<V`g2b?= z^cQsO-l2bqYp4E&PQ6o<)`EGaj(6`pz2l4R?aiGZT7TmJzhLc&aQ_aMdyPTik3kMl zFqkqZI7~UP_lkoO@D&dQXbyJ*rUFz1XQSS4?1B*wTUr?}v#Ok#dDyCIZ>myWq)um4 z@bDn{J=q>^G!O?;A_uY(B=SW>g4oD5?SbkcNk0r-daV)EEnc1BF3GB*NK3V!n^GtD zWG?Ylk|r~g>%}3JC$6dM+-S94;Iwb*aW<PLl}#%DSzE*+&23}GI-vvn@8deg<-TKB z0$c*D7#NHkZc11(xMXnhDT9@OB}!)Sg@YZ#)h^t8XpcGN@30OdVCeyT<gkj`*n?Fc zmiU3ZZ99P_zH+#Xs0T^zusMRGs}nd!z;oYgCA2l9Wk5q<=-t^!oZ1K#F5=FVgiIL? zL#&MR)?73+itwmAm7QDR(OmoPMJki|&@)~aE^MMjO3%_J_m;*LhGc1(7CH=+y_L2p zM}rVKozFr<6gV91y(#A|h^$aSAVUz&W<gx1`A@J<5arMD#259XHub(Kolo<8|4<*i zQC?S*b|${6a<{(i^iCcoKdx_sK=KVlbB{3q+hBdZ!(%4+9*fyazKH)7W8o>?8!1V- zlwniKqEbyx`&i1WCe6E(ft0GsFukR;%dBayu6>3Ct@5?-lyc-XEl2kwMg@J|=1xb^ nboc+Kj63~fOrasIl~z0etbvj{mXO2n=w9Jlx`mFse=hz4E6ej1 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/sdist.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/sdist.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a18980d6d85b7ee83ba818062a35b8a69fa053c GIT binary patch literal 6643 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/setopt.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/setopt.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..964e16dd9d5a8dc025108b387d52dfea81e36667 GIT binary patch literal 4925 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 TVzU7qn%>F6;?m-qr!V{;9sIz} literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/test.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/test.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34810488c00e4191f66b5334177130d1f794e8c0 GIT binary patch literal 8354 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 YyFmVL11_;;wh&UjW1(kl*c-L~14oCu&j0`b literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/upload.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/upload.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adc29c1428974664fd787e8620f573287ddb4814 GIT binary patch literal 1382 zcmaizOK%e~5XZ;6n@2+m;Uy3pus9(0(DVYLREUQV0)z-iJpj2_+t}M~*{m1aDQpC% z@>MwSmG;VsufT~JZxSlR!-~B#u{|FD=I;yZ>%GAjrEW$5-{4q7AMRtfw{ej8V~_)k z8#{oU!8Cwz2<)*8K}PTyXChD`90YI_!Z@HEJ8|nfZii9K>h`S6bs{I^FI#}dee8A{ z2ZiAo9o6i`*b;+;6nPv`aM|*93uGH)$J=Oh@su?~k>*K{V|#I^jLD?pQl-f(cf2{6 z@2dUeFw=%R&GoKJvVxb1wePi&ejoY?KTJ%fT*Y<DWtOJOsKW90No9wA&4l4O)aXlR zKE!UfaBu(zj4uBX;D`ak&p`;~ko<!Pj$moG$i_bf-VZQ$Hj3MIq)oQxFHsNDtVr@~ zu7oaKrVCqlmuc3Q1tAnmU!+D)#amUGtk|p1i4xt?iBy}_5(FPvm8W09tYMZv9&Ea4 zxmjlAMpjst<oU)ebz@69r8li|v(jmu+vDa$Pp3&CHyen<vN93IIYHO%;s9(At+76v zUsx>oJ^K|gqD9+0v3qD#*9aP_1aW<0@Db_Zh_pOIgm)Cc&a2`KL@t82JuutA7<*GN zc#Xo?iNpDGUlXeN1LqW8ok~lDR)yt6h%X2Y`Od5?jk1<M`Y=%q-KMS-qwXx$jpA0_ z6C#_I+BhM`{XOMYK<l1SrM8*VrmDL$t4xthRlT-~7zc*H7`m%x-V8l*+c=!ZZpniv zL~xhbI-6fz!23seR~$)see9m&1{&2#FFuqV%IQ^c5qU9i0i=PacKsJMdXT~V$%@)b zuNRJb;mI##y5MeKap$W402{?&-9a`aM{^1@sZT#s)vivAd|Ehsgea$&H8e<k$3S$@ zy@I{b5P~?#&a(OCC5Ar;c@%f*t`G!U2rAE1%UMo#Ux;_JBwx&Qgphh7gqNuYZs@RM zmGG(fa*!lj%Pjg)JLvcNJ^u>h$P93zJ}oorW-iO^aPbiQv<d$bvhLn#^14f9vh-B? HY!Lngz=KRf literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/upload_docs.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/__pycache__/upload_docs.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ead2ddef9ba31d54ef5cc3dc3bec6988f61d03f6 GIT binary patch literal 6577 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/alias.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/alias.py new file mode 100644 index 0000000..4532b1c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/alias.py @@ -0,0 +1,80 @@ +from distutils.errors import DistutilsOptionError + +from setuptools.extern.six.moves import map + +from setuptools.command.setopt import edit_config, option_base, config_file + + +def shquote(arg): + """Quote an argument for later parsing by shlex.split()""" + for c in '"', "'", "\\", "#": + if c in arg: + return repr(arg) + if arg.split() != [arg]: + return repr(arg) + return arg + + +class alias(option_base): + """Define a shortcut that invokes one or more commands""" + + description = "define a shortcut to invoke one or more commands" + command_consumes_arguments = True + + user_options = [ + ('remove', 'r', 'remove (unset) the alias'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.args = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.remove and len(self.args) != 1: + raise DistutilsOptionError( + "Must specify exactly one argument (the alias name) when " + "using --remove" + ) + + def run(self): + aliases = self.distribution.get_option_dict('aliases') + + if not self.args: + print("Command Aliases") + print("---------------") + for alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + + elif len(self.args) == 1: + alias, = self.args + if self.remove: + command = None + elif alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + else: + print("No alias definition found for %r" % alias) + return + else: + alias = self.args[0] + command = ' '.join(map(shquote, self.args[1:])) + + edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) + + +def format_alias(name, aliases): + source, command = aliases[name] + if source == config_file('global'): + source = '--global-config ' + elif source == config_file('user'): + source = '--user-config ' + elif source == config_file('local'): + source = '' + else: + source = '--filename=%r' % source + return source + name + ' ' + command diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_egg.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 0000000..8cd9dfe --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,472 @@ +"""setuptools.command.bdist_egg + +Build .egg distributions""" + +from distutils.errors import DistutilsSetupError +from distutils.dir_util import remove_tree, mkpath +from distutils import log +from types import CodeType +import sys +import os +import textwrap +import marshal + +from setuptools.extern import six + +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from setuptools.extension import Library +from setuptools import Command + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_path, get_python_version + + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_python_lib, get_python_version + + def _get_purelib(): + return get_python_lib(False) + + +def strip_module(filename): + if '.' in filename: + filename = os.path.splitext(filename)[0] + if filename.endswith('module'): + filename = filename[:-6] + return filename + + +def write_stub(resource, pyfile): + _stub_template = textwrap.dedent(""" + def __bootstrap__(): + global __bootstrap__, __loader__, __file__ + import sys, pkg_resources, imp + __file__ = pkg_resources.resource_filename(__name__, %r) + __loader__ = None; del __bootstrap__, __loader__ + imp.load_dynamic(__name__,__file__) + __bootstrap__() + """).lstrip() + with open(pyfile, 'w') as f: + f.write(_stub_template % resource) + + +class bdist_egg(Command): + description = "create an \"egg\" distribution" + + user_options = [ + ('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), + ('exclude-source-files', None, + "remove all .py files from the generated egg"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ] + + boolean_options = [ + 'keep-temp', 'skip-build', 'exclude-source-files' + ] + + def initialize_options(self): + self.bdist_dir = None + self.plat_name = None + self.keep_temp = 0 + self.dist_dir = None + self.skip_build = 0 + self.egg_output = None + self.exclude_source_files = None + + def finalize_options(self): + ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") + self.egg_info = ei_cmd.egg_info + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'egg') + + if self.plat_name is None: + self.plat_name = get_build_platform() + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + if self.egg_output is None: + + # Compute filename of the output egg + basename = Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, + get_python_version(), + self.distribution.has_ext_modules() and self.plat_name + ).egg_name() + + self.egg_output = os.path.join(self.dist_dir, basename + '.egg') + + def do_install_data(self): + # Hack for packages that install data to install's --install-lib + self.get_finalized_command('install').install_lib = self.bdist_dir + + site_packages = os.path.normcase(os.path.realpath(_get_purelib())) + old, self.distribution.data_files = self.distribution.data_files, [] + + for item in old: + if isinstance(item, tuple) and len(item) == 2: + if os.path.isabs(item[0]): + realpath = os.path.realpath(item[0]) + normalized = os.path.normcase(realpath) + if normalized == site_packages or normalized.startswith( + site_packages + os.sep + ): + item = realpath[len(site_packages) + 1:], item[1] + # XXX else: raise ??? + self.distribution.data_files.append(item) + + try: + log.info("installing package data to %s", self.bdist_dir) + self.call_command('install_data', force=0, root=None) + finally: + self.distribution.data_files = old + + def get_outputs(self): + return [self.egg_output] + + def call_command(self, cmdname, **kw): + """Invoke reinitialized command `cmdname` with keyword args""" + for dirname in INSTALL_DIRECTORY_ATTRS: + kw.setdefault(dirname, self.bdist_dir) + kw.setdefault('skip_build', self.skip_build) + kw.setdefault('dry_run', self.dry_run) + cmd = self.reinitialize_command(cmdname, **kw) + self.run_command(cmdname) + return cmd + + def run(self): + # Generate metadata first + self.run_command("egg_info") + # We run install_lib before install_data, because some data hacks + # pull their data path from the install_lib command. + log.info("installing library code to %s", self.bdist_dir) + instcmd = self.get_finalized_command('install') + old_root = instcmd.root + instcmd.root = None + if self.distribution.has_c_libraries() and not self.skip_build: + self.run_command('build_clib') + cmd = self.call_command('install_lib', warn_dir=0) + instcmd.root = old_root + + all_outputs, ext_outputs = self.get_ext_outputs() + self.stubs = [] + to_compile = [] + for (p, ext_name) in enumerate(ext_outputs): + filename, ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename) + + '.py') + self.stubs.append(pyfile) + log.info("creating stub loader for %s", ext_name) + if not self.dry_run: + write_stub(os.path.basename(ext_name), pyfile) + to_compile.append(pyfile) + ext_outputs[p] = ext_name.replace(os.sep, '/') + + if to_compile: + cmd.byte_compile(to_compile) + if self.distribution.data_files: + self.do_install_data() + + # Make the EGG-INFO directory + archive_root = self.bdist_dir + egg_info = os.path.join(archive_root, 'EGG-INFO') + self.mkpath(egg_info) + if self.distribution.scripts: + script_dir = os.path.join(egg_info, 'scripts') + log.info("installing scripts to %s", script_dir) + self.call_command('install_scripts', install_dir=script_dir, + no_ep=1) + + self.copy_metadata_to(egg_info) + native_libs = os.path.join(egg_info, "native_libs.txt") + if all_outputs: + log.info("writing %s", native_libs) + if not self.dry_run: + ensure_directory(native_libs) + libs_file = open(native_libs, 'wt') + libs_file.write('\n'.join(all_outputs)) + libs_file.write('\n') + libs_file.close() + elif os.path.isfile(native_libs): + log.info("removing %s", native_libs) + if not self.dry_run: + os.unlink(native_libs) + + write_safety_flag( + os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() + ) + + if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): + log.warn( + "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + if self.exclude_source_files: + self.zap_pyfiles() + + # Make the archive + make_zipfile(self.egg_output, archive_root, verbose=self.verbose, + dry_run=self.dry_run, mode=self.gen_header()) + if not self.keep_temp: + remove_tree(self.bdist_dir, dry_run=self.dry_run) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_egg', get_python_version(), self.egg_output)) + + def zap_pyfiles(self): + log.info("Removing .py files from temporary directory") + for base, dirs, files in walk_egg(self.bdist_dir): + for name in files: + if name.endswith('.py'): + path = os.path.join(base, name) + log.debug("Deleting %s", path) + os.unlink(path) + + def zip_safe(self): + safe = getattr(self.distribution, 'zip_safe', None) + if safe is not None: + return safe + log.warn("zip_safe flag not set; analyzing archive contents...") + return analyze_egg(self.bdist_dir, self.stubs) + + def gen_header(self): + epm = EntryPoint.parse_map(self.distribution.entry_points or '') + ep = epm.get('setuptools.installation', {}).get('eggsecutable') + if ep is None: + return 'w' # not an eggsecutable, do it the usual way. + + if not ep.attrs or ep.extras: + raise DistutilsSetupError( + "eggsecutable entry point (%r) cannot have 'extras' " + "or refer to a module" % (ep,) + ) + + pyver = sys.version[:3] + pkg = ep.module_name + full = '.'.join(ep.attrs) + base = ep.attrs[0] + basename = os.path.basename(self.egg_output) + + header = ( + "#!/bin/sh\n" + 'if [ `basename $0` = "%(basename)s" ]\n' + 'then exec python%(pyver)s -c "' + "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " + "from %(pkg)s import %(base)s; sys.exit(%(full)s())" + '" "$@"\n' + 'else\n' + ' echo $0 is not the correct name for this egg file.\n' + ' echo Please rename it back to %(basename)s and try again.\n' + ' exec false\n' + 'fi\n' + ) % locals() + + if not self.dry_run: + mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) + f = open(self.egg_output, 'w') + f.write(header) + f.close() + return 'a' + + def copy_metadata_to(self, target_dir): + "Copy metadata (egg info) to the target_dir" + # normalize the path (so that a forward-slash in egg_info will + # match using startswith below) + norm_egg_info = os.path.normpath(self.egg_info) + prefix = os.path.join(norm_egg_info, '') + for path in self.ei_cmd.filelist.files: + if path.startswith(prefix): + target = os.path.join(target_dir, path[len(prefix):]) + ensure_directory(target) + self.copy_file(path, target) + + def get_ext_outputs(self): + """Get a list of relative paths to C extensions in the output distro""" + + all_outputs = [] + ext_outputs = [] + + paths = {self.bdist_dir: ''} + for base, dirs, files in os.walk(self.bdist_dir): + for filename in files: + if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: + all_outputs.append(paths[base] + filename) + for filename in dirs: + paths[os.path.join(base, filename)] = (paths[base] + + filename + '/') + + if self.distribution.has_ext_modules(): + build_cmd = self.get_finalized_command('build_ext') + for ext in build_cmd.extensions: + if isinstance(ext, Library): + continue + fullname = build_cmd.get_ext_fullname(ext.name) + filename = build_cmd.get_ext_filename(fullname) + if not os.path.basename(filename).startswith('dl-'): + if os.path.exists(os.path.join(self.bdist_dir, filename)): + ext_outputs.append(filename) + + return all_outputs, ext_outputs + + +NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) + + +def walk_egg(egg_dir): + """Walk an unpacked egg's contents, skipping the metadata directory""" + walker = os.walk(egg_dir) + base, dirs, files = next(walker) + if 'EGG-INFO' in dirs: + dirs.remove('EGG-INFO') + yield base, dirs, files + for bdf in walker: + yield bdf + + +def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag, fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): + return flag + if not can_scan(): + return False + safe = True + for base, dirs, files in walk_egg(egg_dir): + for name in files: + if name.endswith('.py') or name.endswith('.pyw'): + continue + elif name.endswith('.pyc') or name.endswith('.pyo'): + # always scan, even if we already know we're not safe + safe = scan_module(egg_dir, base, name, stubs) and safe + return safe + + +def write_safety_flag(egg_dir, safe): + # Write or remove zip safety flag file(s) + for flag, fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe) != flag: + os.unlink(fn) + elif safe is not None and bool(safe) == flag: + f = open(fn, 'wt') + f.write('\n') + f.close() + + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} + + +def scan_module(egg_dir, base, name, stubs): + """Check whether module possibly uses unsafe-for-zipfile stuff""" + + filename = os.path.join(base, name) + if filename[:-1] in stubs: + return True # Extension module + pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') + module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] + if sys.version_info < (3, 3): + skip = 8 # skip magic & date + else: + skip = 12 # skip magic & date & file size + f = open(filename, 'rb') + f.read(skip) + code = marshal.load(f) + f.close() + safe = True + symbols = dict.fromkeys(iter_symbols(code)) + for bad in ['__file__', '__path__']: + if bad in symbols: + log.warn("%s: module references %s", module, bad) + safe = False + if 'inspect' in symbols: + for bad in [ + 'getsource', 'getabsfile', 'getsourcefile', 'getfile' + 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', + 'getinnerframes', 'getouterframes', 'stack', 'trace' + ]: + if bad in symbols: + log.warn("%s: module MAY be using inspect.%s", module, bad) + safe = False + return safe + + +def iter_symbols(code): + """Yield names and strings used by `code` and its nested code objects""" + for name in code.co_names: + yield name + for const in code.co_consts: + if isinstance(const, six.string_types): + yield const + elif isinstance(const, CodeType): + for name in iter_symbols(const): + yield name + + +def can_scan(): + if not sys.platform.startswith('java') and sys.platform != 'cli': + # CPython, PyPy, etc. + return True + log.warn("Unable to analyze compiled code on this platform.") + log.warn("Please ask the author to include a 'zip_safe'" + " setting (either True or False) in the package's setup.py") + + +# Attribute names of options for commands that might need to be convinced to +# install to the egg build directory + +INSTALL_DIRECTORY_ATTRS = [ + 'install_lib', 'install_dir', 'install_data', 'install_base' +] + + +def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, + mode='w'): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" + Python module (if available) or the InfoZIP "zip" utility (if installed + and found on the default search path). If neither tool is available, + raises DistutilsExecError. Returns the name of the output zip file. + """ + import zipfile + + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) + + def visit(z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + p = path[len(base_dir) + 1:] + if not dry_run: + z.write(path, p) + log.debug("adding '%s'", p) + + compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED + if not dry_run: + z = zipfile.ZipFile(zip_filename, mode, compression=compression) + for dirname, dirs, files in os.walk(base_dir): + visit(z, dirname, files) + z.close() + else: + for dirname, dirs, files in os.walk(base_dir): + visit(None, dirname, files) + return zip_filename diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_rpm.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 0000000..7073092 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,43 @@ +import distutils.command.bdist_rpm as orig + + +class bdist_rpm(orig.bdist_rpm): + """ + Override the default bdist_rpm behavior to do the following: + + 1. Run egg_info to ensure the name and version are properly calculated. + 2. Always run 'install' using --single-version-externally-managed to + disable eggs in RPM distributions. + 3. Replace dash with underscore in the version numbers for better RPM + compatibility. + """ + + def run(self): + # ensure distro name is up-to-date + self.run_command('egg_info') + + orig.bdist_rpm.run(self) + + def _make_spec_file(self): + version = self.distribution.get_version() + rpmversion = version.replace('-', '_') + spec = orig.bdist_rpm._make_spec_file(self) + line23 = '%define version ' + version + line24 = '%define version ' + rpmversion + spec = [ + line.replace( + "Source0: %{name}-%{version}.tar", + "Source0: %{name}-%{unmangled_version}.tar" + ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( + "%setup", + "%setup -n %{name}-%{unmangled_version}" + ).replace(line23, line24) + for line in spec + ] + insert_loc = spec.index(line24) + 1 + unmangled_version = "%define unmangled_version " + version + spec.insert(insert_loc, unmangled_version) + return spec diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_wininst.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 0000000..073de97 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,21 @@ +import distutils.command.bdist_wininst as orig + + +class bdist_wininst(orig.bdist_wininst): + def reinitialize_command(self, command, reinit_subcommands=0): + """ + Supplement reinitialize_command to work around + http://bugs.python.org/issue20819 + """ + cmd = self.distribution.reinitialize_command( + command, reinit_subcommands) + if command in ('install', 'install_lib'): + cmd.install_lib = None + return cmd + + def run(self): + self._is_running = True + try: + orig.bdist_wininst.run(self) + finally: + self._is_running = False diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_ext.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_ext.py new file mode 100644 index 0000000..36f53f0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,328 @@ +import os +import sys +import itertools +import imp +from distutils.command.build_ext import build_ext as _du_build_ext +from distutils.file_util import copy_file +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler, get_config_var +from distutils.errors import DistutilsError +from distutils import log + +from setuptools.extension import Library +from setuptools.extern import six + +try: + # Attempt to use Cython for building extensions, if available + from Cython.Distutils.build_ext import build_ext as _build_ext +except ImportError: + _build_ext = _du_build_ext + +# make sure _config_vars is initialized +get_config_var("LDSHARED") +from distutils.sysconfig import _config_vars as _CONFIG_VARS + + +def _customize_compiler_for_shlib(compiler): + if sys.platform == "darwin": + # building .dylib requires additional compiler flags on OSX; here we + # temporarily substitute the pyconfig.h variables so that distutils' + # 'customize_compiler' uses them before we build the shared libraries. + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) + + +have_rtld = False +use_stubs = False +libtype = 'shared' + +if sys.platform == "darwin": + use_stubs = True +elif os.name != 'nt': + try: + import dl + use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') + except ImportError: + pass + +if_dl = lambda s: s if have_rtld else '' + + +def get_abi3_suffix(): + """Return the file extension for an abi3-compliant Extension()""" + for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): + if '.abi3' in suffix: # Unix + return suffix + elif suffix == '.pyd': # Windows + return suffix + + +class build_ext(_build_ext): + def run(self): + """Build extensions in build directory, then copy if --inplace""" + old_inplace, self.inplace = self.inplace, 0 + _build_ext.run(self) + self.inplace = old_inplace + if old_inplace: + self.copy_extensions_to_source() + + def copy_extensions_to_source(self): + build_py = self.get_finalized_command('build_py') + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = self.get_ext_filename(fullname) + modpath = fullname.split('.') + package = '.'.join(modpath[:-1]) + package_dir = build_py.get_package_dir(package) + dest_filename = os.path.join(package_dir, + os.path.basename(filename)) + src_filename = os.path.join(self.build_lib, filename) + + # Always copy, even if source is older than destination, to ensure + # that the right extensions for the current Python/platform are + # used. + copy_file( + src_filename, dest_filename, verbose=self.verbose, + dry_run=self.dry_run + ) + if ext._needs_stub: + self.write_stub(package_dir or os.curdir, ext, True) + + def get_ext_filename(self, fullname): + filename = _build_ext.get_ext_filename(self, fullname) + if fullname in self.ext_map: + ext = self.ext_map[fullname] + use_abi3 = ( + six.PY3 + and getattr(ext, 'py_limited_api') + and get_abi3_suffix() + ) + if use_abi3: + so_ext = _get_config_var_837('EXT_SUFFIX') + filename = filename[:-len(so_ext)] + filename = filename + get_abi3_suffix() + if isinstance(ext, Library): + fn, ext = os.path.splitext(filename) + return self.shlib_compiler.library_filename(fn, libtype) + elif use_stubs and ext._links_to_dynamic: + d, fn = os.path.split(filename) + return os.path.join(d, 'dl-' + fn) + return filename + + def initialize_options(self): + _build_ext.initialize_options(self) + self.shlib_compiler = None + self.shlibs = [] + self.ext_map = {} + + def finalize_options(self): + _build_ext.finalize_options(self) + self.extensions = self.extensions or [] + self.check_extensions_list(self.extensions) + self.shlibs = [ext for ext in self.extensions + if isinstance(ext, Library)] + if self.shlibs: + self.setup_shlib_compiler() + for ext in self.extensions: + ext._full_name = self.get_ext_fullname(ext.name) + for ext in self.extensions: + fullname = ext._full_name + self.ext_map[fullname] = ext + + # distutils 3.1 will also ask for module names + # XXX what to do with conflicts? + self.ext_map[fullname.split('.')[-1]] = ext + + ltd = self.shlibs and self.links_to_dynamic(ext) or False + ns = ltd and use_stubs and not isinstance(ext, Library) + ext._links_to_dynamic = ltd + ext._needs_stub = ns + filename = ext._file_name = self.get_ext_filename(fullname) + libdir = os.path.dirname(os.path.join(self.build_lib, filename)) + if ltd and libdir not in ext.library_dirs: + ext.library_dirs.append(libdir) + if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: + ext.runtime_library_dirs.append(os.curdir) + + def setup_shlib_compiler(self): + compiler = self.shlib_compiler = new_compiler( + compiler=self.compiler, dry_run=self.dry_run, force=self.force + ) + _customize_compiler_for_shlib(compiler) + + if self.include_dirs is not None: + compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name, value) in self.define: + compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + compiler.undefine_macro(macro) + if self.libraries is not None: + compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + compiler.set_link_objects(self.link_objects) + + # hack so distutils' build_extension() builds a library instead + compiler.link_shared_object = link_shared_object.__get__(compiler) + + def get_export_symbols(self, ext): + if isinstance(ext, Library): + return ext.export_symbols + return _build_ext.get_export_symbols(self, ext) + + def build_extension(self, ext): + ext._convert_pyx_sources_to_lang() + _compiler = self.compiler + try: + if isinstance(ext, Library): + self.compiler = self.shlib_compiler + _build_ext.build_extension(self, ext) + if ext._needs_stub: + cmd = self.get_finalized_command('build_py').build_lib + self.write_stub(cmd, ext) + finally: + self.compiler = _compiler + + def links_to_dynamic(self, ext): + """Return true if 'ext' links to a dynamic lib in the same package""" + # XXX this should check to ensure the lib is actually being built + # XXX as dynamic, and not just using a locally-found version or a + # XXX static-compiled version + libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) + pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) + return any(pkg + libname in libnames for libname in ext.libraries) + + def get_outputs(self): + return _build_ext.get_outputs(self) + self.__get_stubs_outputs() + + def __get_stubs_outputs(self): + # assemble the base name for each extension that needs a stub + ns_ext_bases = ( + os.path.join(self.build_lib, *ext._full_name.split('.')) + for ext in self.extensions + if ext._needs_stub + ) + # pair each base with the extension + pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) + return list(base + fnext for base, fnext in pairs) + + def __get_output_extensions(self): + yield '.py' + yield '.pyc' + if self.get_finalized_command('build_py').optimize: + yield '.pyo' + + def write_stub(self, output_dir, ext, compile=False): + log.info("writing stub loader for %s to %s", ext._full_name, + output_dir) + stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + + '.py') + if compile and os.path.exists(stub_file): + raise DistutilsError(stub_file + " already exists! Please delete.") + if not self.dry_run: + f = open(stub_file, 'w') + f.write( + '\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp" + if_dl(", dl"), + " __file__ = pkg_resources.resource_filename" + "(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ]) + ) + f.close() + if compile: + from distutils.util import byte_compile + + byte_compile([stub_file], optimize=0, + force=True, dry_run=self.dry_run) + optimize = self.get_finalized_command('install_lib').optimize + if optimize > 0: + byte_compile([stub_file], optimize=optimize, + force=True, dry_run=self.dry_run) + if os.path.exists(stub_file) and not self.dry_run: + os.unlink(stub_file) + + +if use_stubs or os.name == 'nt': + # Build shared libraries + # + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + self.link( + self.SHARED_LIBRARY, objects, output_libname, + output_dir, libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, extra_preargs, extra_postargs, + build_temp, target_lang + ) +else: + # Build static libraries everywhere else + libtype = 'static' + + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + # XXX we need to either disallow these attrs on Library instances, + # or warn/abort here if set, or something... + # libraries=None, library_dirs=None, runtime_library_dirs=None, + # export_symbols=None, extra_preargs=None, extra_postargs=None, + # build_temp=None + + assert output_dir is None # distutils build_ext doesn't pass this + output_dir, filename = os.path.split(output_libname) + basename, ext = os.path.splitext(filename) + if self.library_filename("x").startswith('lib'): + # strip 'lib' prefix; this is kludgy if some platform uses + # a different prefix + basename = basename[3:] + + self.create_static_lib( + objects, basename, output_dir, debug, target_lang + ) + + +def _get_config_var_837(name): + """ + In https://github.com/pypa/setuptools/pull/837, we discovered + Python 3.3.0 exposes the extension suffix under the name 'SO'. + """ + if sys.version_info < (3, 3, 1): + name = 'SO' + return get_config_var(name) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_py.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_py.py new file mode 100644 index 0000000..b0314fd --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/build_py.py @@ -0,0 +1,270 @@ +from glob import glob +from distutils.util import convert_path +import distutils.command.build_py as orig +import os +import fnmatch +import textwrap +import io +import distutils.errors +import itertools + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter, filterfalse + +try: + from setuptools.lib2to3_ex import Mixin2to3 +except ImportError: + + class Mixin2to3: + def run_2to3(self, files, doctests=True): + "do nothing" + + +class build_py(orig.build_py, Mixin2to3): + """Enhanced 'build_py' command that includes data files with packages + + The data files are specified via a 'package_data' argument to 'setup()'. + See 'setuptools.dist.Distribution' for more details. + + Also, this version of the 'build_py' command allows you to specify both + 'py_modules' and 'packages' in the same setup operation. + """ + + def finalize_options(self): + orig.build_py.finalize_options(self) + self.package_data = self.distribution.package_data + self.exclude_package_data = (self.distribution.exclude_package_data or + {}) + if 'data_files' in self.__dict__: + del self.__dict__['data_files'] + self.__updated_files = [] + self.__doctests_2to3 = [] + + def run(self): + """Build modules, packages, and copy data files to build directory""" + if not self.py_modules and not self.packages: + return + + if self.py_modules: + self.build_modules() + + if self.packages: + self.build_packages() + self.build_package_data() + + self.run_2to3(self.__updated_files, False) + self.run_2to3(self.__updated_files, True) + self.run_2to3(self.__doctests_2to3, True) + + # Only compile actual .py files, using our base class' idea of what our + # output files are. + self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) + + def __getattr__(self, attr): + "lazily compute data files" + if attr == 'data_files': + self.data_files = self._get_data_files() + return self.data_files + return orig.build_py.__getattr__(self, attr) + + def build_module(self, module, module_file, package): + if six.PY2 and isinstance(package, six.string_types): + # avoid errors on Python 2 when unicode is passed (#190) + package = package.split('.') + outfile, copied = orig.build_py.build_module(self, module, module_file, + package) + if copied: + self.__updated_files.append(outfile) + return outfile, copied + + def _get_data_files(self): + """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" + self.analyze_manifest() + return list(map(self._get_pkg_data_files, self.packages or ())) + + def _get_pkg_data_files(self, package): + # Locate package source directory + src_dir = self.get_package_dir(package) + + # Compute package build directory + build_dir = os.path.join(*([self.build_lib] + package.split('.'))) + + # Strip directory from globbed filenames + filenames = [ + os.path.relpath(file, src_dir) + for file in self.find_data_files(package, src_dir) + ] + return package, src_dir, build_dir, filenames + + def find_data_files(self, package, src_dir): + """Return filenames for package's data files in 'src_dir'""" + patterns = self._get_platform_patterns( + self.package_data, + package, + src_dir, + ) + globs_expanded = map(glob, patterns) + # flatten the expanded globs into an iterable of matches + globs_matches = itertools.chain.from_iterable(globs_expanded) + glob_files = filter(os.path.isfile, globs_matches) + files = itertools.chain( + self.manifest_files.get(package, []), + glob_files, + ) + return self.exclude_data_files(package, src_dir, files) + + def build_package_data(self): + """Copy data files into build directory""" + for package, src_dir, build_dir, filenames in self.data_files: + for filename in filenames: + target = os.path.join(build_dir, filename) + self.mkpath(os.path.dirname(target)) + srcfile = os.path.join(src_dir, filename) + outf, copied = self.copy_file(srcfile, target) + srcfile = os.path.abspath(srcfile) + if (copied and + srcfile in self.distribution.convert_2to3_doctests): + self.__doctests_2to3.append(outf) + + def analyze_manifest(self): + self.manifest_files = mf = {} + if not self.distribution.include_package_data: + return + src_dirs = {} + for package in self.packages or (): + # Locate package source directory + src_dirs[assert_relative(self.get_package_dir(package))] = package + + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + for path in ei_cmd.filelist.files: + d, f = os.path.split(assert_relative(path)) + prev = None + oldf = f + while d and d != prev and d not in src_dirs: + prev = d + d, df = os.path.split(d) + f = os.path.join(df, f) + if d in src_dirs: + if path.endswith('.py') and f == oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d], []).append(path) + + def get_data_files(self): + pass # Lazily compute data files in _get_data_files() function. + + def check_package(self, package, package_dir): + """Check namespace packages' __init__ for declare_namespace""" + try: + return self.packages_checked[package] + except KeyError: + pass + + init_py = orig.build_py.check_package(self, package, package_dir) + self.packages_checked[package] = init_py + + if not init_py or not self.distribution.namespace_packages: + return init_py + + for pkg in self.distribution.namespace_packages: + if pkg == package or pkg.startswith(package + '.'): + break + else: + return init_py + + with io.open(init_py, 'rb') as f: + contents = f.read() + if b'declare_namespace' not in contents: + raise distutils.errors.DistutilsError( + "Namespace package problem: %s is a namespace package, but " + "its\n__init__.py does not call declare_namespace()! Please " + 'fix it.\n(See the setuptools manual under ' + '"Namespace Packages" for details.)\n"' % (package,) + ) + return init_py + + def initialize_options(self): + self.packages_checked = {} + orig.build_py.initialize_options(self) + + def get_package_dir(self, package): + res = orig.build_py.get_package_dir(self, package) + if self.distribution.src_root is not None: + return os.path.join(self.distribution.src_root, res) + return res + + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + files = list(files) + patterns = self._get_platform_patterns( + self.exclude_package_data, + package, + src_dir, + ) + match_groups = ( + fnmatch.filter(files, pattern) + for pattern in patterns + ) + # flatten the groups of matches into an iterable of matches + matches = itertools.chain.from_iterable(match_groups) + bad = set(matches) + keepers = ( + fn + for fn in files + if fn not in bad + ) + # ditch dupes + return list(_unique_everseen(keepers)) + + @staticmethod + def _get_platform_patterns(spec, package, src_dir): + """ + yield platform-specific path patterns (suitable for glob + or fn_match) from a glob-based spec (such as + self.package_data or self.exclude_package_data) + matching package in src_dir. + """ + raw_patterns = itertools.chain( + spec.get('', []), + spec.get(package, []), + ) + return ( + # Each pattern has to be converted to a platform-specific path + os.path.join(src_dir, convert_path(pattern)) + for pattern in raw_patterns + ) + + +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def assert_relative(path): + if not os.path.isabs(path): + return path + from distutils.errors import DistutilsSetupError + + msg = textwrap.dedent(""" + Error: setup script specifies an absolute path: + + %s + + setup() arguments must *always* be /-separated paths relative to the + setup.py directory, *never* absolute paths. + """).lstrip() % path + raise DistutilsSetupError(msg) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/develop.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/develop.py new file mode 100644 index 0000000..aa82f95 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/develop.py @@ -0,0 +1,201 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsError, DistutilsOptionError +import os +import glob +import io + +from setuptools.extern import six + +from pkg_resources import Distribution, PathMetadata, normalize_path +from setuptools.command.easy_install import easy_install +from setuptools import namespaces +import setuptools + + +class develop(namespaces.DevelopInstaller, easy_install): + """Set up package for development""" + + description = "install package in 'development mode'" + + user_options = easy_install.user_options + [ + ("uninstall", "u", "Uninstall this source package"), + ("egg-path=", None, "Set the path to be used in the .egg-link file"), + ] + + boolean_options = easy_install.boolean_options + ['uninstall'] + + command_consumes_arguments = False # override base + + def run(self): + if self.uninstall: + self.multi_version = True + self.uninstall_link() + self.uninstall_namespaces() + else: + self.install_for_development() + self.warn_deprecated_options() + + def initialize_options(self): + self.uninstall = None + self.egg_path = None + easy_install.initialize_options(self) + self.setup_path = None + self.always_copy_from = '.' # always copy eggs installed in curdir + + def finalize_options(self): + ei = self.get_finalized_command("egg_info") + if ei.broken_egg_info: + template = "Please rename %r to %r before using 'develop'" + args = ei.egg_info, ei.broken_egg_info + raise DistutilsError(template % args) + self.args = [ei.egg_name] + + easy_install.finalize_options(self) + self.expand_basedirs() + self.expand_dirs() + # pick up setup-dir .egg files only: no .egg-info + self.package_index.scan(glob.glob('*.egg')) + + egg_link_fn = ei.egg_name + '.egg-link' + self.egg_link = os.path.join(self.install_dir, egg_link_fn) + self.egg_base = ei.egg_base + if self.egg_path is None: + self.egg_path = os.path.abspath(ei.egg_base) + + target = normalize_path(self.egg_base) + egg_path = normalize_path(os.path.join(self.install_dir, + self.egg_path)) + if egg_path != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to " + target + ) + + # Make a distribution for the package's source + self.dist = Distribution( + target, + PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name=ei.egg_name + ) + + p = self.egg_base.replace(os.sep, '/') + if p != os.curdir: + p = '../' * (p.count('/') + 1) + self.setup_path = p + p = normalize_path(os.path.join(self.install_dir, self.egg_path, p)) + if p != normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", p, normalize_path(os.curdir)) + + def install_for_development(self): + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + # XXX + self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + self.install_namespaces() + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + with open(self.egg_link, "w") as f: + f.write(self.egg_path + "\n" + self.setup_path) + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self, dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + with io.open(script_path) as strm: + script_text = strm.read() + self.install_script(dist, script_name, script_text, script_path) + + def install_wrapper_scripts(self, dist): + dist = VersionlessRequirement(dist) + return easy_install.install_wrapper_scripts(self, dist) + + +class VersionlessRequirement(object): + """ + Adapt a pkg_resources.Distribution to simply return the project + name as the 'requirement' so that scripts will work across + multiple versions. + + >>> dist = Distribution(project_name='foo', version='1.0') + >>> str(dist.as_requirement()) + 'foo==1.0' + >>> adapted_dist = VersionlessRequirement(dist) + >>> str(adapted_dist.as_requirement()) + 'foo' + """ + + def __init__(self, dist): + self.__dist = dist + + def __getattr__(self, name): + return getattr(self.__dist, name) + + def as_requirement(self): + return self.project_name diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/easy_install.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/easy_install.py new file mode 100644 index 0000000..3bb5a4e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/easy_install.py @@ -0,0 +1,2347 @@ +#!/usr/bin/env python +""" +Easy Install +------------ + +A tool for doing automatic download/extract/build of distutils-based Python +packages. For detailed documentation, see the accompanying EasyInstall.txt +file, or visit the `EasyInstall home page`__. + +__ https://setuptools.readthedocs.io/en/latest/easy_install.html + +""" + +from glob import glob +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import ( + DistutilsArgError, DistutilsOptionError, + DistutilsError, DistutilsPlatformError, +) +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from distutils import log, dir_util +from distutils.command.build_scripts import first_line_re +from distutils.spawn import find_executable +import sys +import os +import zipimport +import shutil +import tempfile +import zipfile +import re +import stat +import random +import textwrap +import warnings +import site +import struct +import contextlib +import subprocess +import shlex +import io + +from setuptools.extern import six +from setuptools.extern.six.moves import configparser, map + +from setuptools import Command +from setuptools.sandbox import run_setup +from setuptools.py31compat import get_path, get_config_vars +from setuptools.py27compat import rmtree_safe +from setuptools.command import setopt +from setuptools.archive_util import unpack_archive +from setuptools.package_index import ( + PackageIndex, parse_requirement_arg, URL_SCHEME, +) +from setuptools.command import bdist_egg, egg_info +from pkg_resources import ( + yield_lines, normalize_path, resource_string, ensure_directory, + get_distribution, find_distributions, Environment, Requirement, + Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, + VersionConflict, DEVELOP_DIST, +) +import pkg_resources + +# Turn on PEP440Warnings +warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) + +__all__ = [ + 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', + 'main', 'get_exe_prefixes', +] + + +def is_64bit(): + return struct.calcsize("P") == 8 + + +def samefile(p1, p2): + """ + Determine if two paths reference the same file. + + Augments os.path.samefile to work on Windows and + suppresses errors if the path doesn't exist. + """ + both_exist = os.path.exists(p1) and os.path.exists(p2) + use_samefile = hasattr(os.path, 'samefile') and both_exist + if use_samefile: + return os.path.samefile(p1, p2) + norm_p1 = os.path.normpath(os.path.normcase(p1)) + norm_p2 = os.path.normpath(os.path.normcase(p2)) + return norm_p1 == norm_p2 + + +if six.PY2: + + def _to_ascii(s): + return s + + def isascii(s): + try: + six.text_type(s, 'ascii') + return True + except UnicodeError: + return False +else: + + def _to_ascii(s): + return s.encode('ascii') + + def isascii(s): + try: + s.encode('ascii') + return True + except UnicodeError: + return False + + +_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') + + +class easy_install(Command): + """Manage a download/build/install process""" + description = "Find/get/install Python packages" + command_consumes_arguments = True + + user_options = [ + ('prefix=', None, "installation prefix"), + ("zip-ok", "z", "install package as a zipfile"), + ("multi-version", "m", "make apps have to require() a version"), + ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), + ("install-dir=", "d", "install package to DIR"), + ("script-dir=", "s", "install scripts to DIR"), + ("exclude-scripts", "x", "Don't install scripts"), + ("always-copy", "a", "Copy all needed packages to install dir"), + ("index-url=", "i", "base URL of Python Package Index"), + ("find-links=", "f", "additional URL(s) to search for packages"), + ("build-directory=", "b", + "download/extract/build in DIR; keep the results"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('record=', None, + "filename in which to record list of installed files"), + ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), + ('site-dirs=', 'S', "list of directories where .pth files work"), + ('editable', 'e', "Install specified packages in editable form"), + ('no-deps', 'N', "don't install dependencies"), + ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), + ('local-snapshots-ok', 'l', + "allow building eggs from local checkouts"), + ('version', None, "print version information and exit"), + ('install-layout=', None, "installation layout to choose (known values: deb)"), + ('force-installation-into-system-dir', '0', "force installation into /usr"), + ('no-find-links', None, + "Don't load find-links defined in packages being installed") + ] + boolean_options = [ + 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', + 'editable', + 'no-deps', 'local-snapshots-ok', 'version', 'force-installation-into-system-dir' + ] + + if site.ENABLE_USER_SITE: + help_msg = "install in user site-package '%s'" % site.USER_SITE + user_options.append(('user', None, help_msg)) + boolean_options.append('user') + + negative_opt = {'always-unzip': 'zip-ok'} + create_index = PackageIndex + + def initialize_options(self): + # the --user option seems to be an opt-in one, + # so the default should be False. + self.user = 0 + self.zip_ok = self.local_snapshots_ok = None + self.install_dir = self.script_dir = self.exclude_scripts = None + self.index_url = None + self.find_links = None + self.build_directory = None + self.args = None + self.optimize = self.record = None + self.upgrade = self.always_copy = self.multi_version = None + self.editable = self.no_deps = self.allow_hosts = None + self.root = self.prefix = self.no_report = None + self.version = None + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + self.install_base = None + self.install_platbase = None + if site.ENABLE_USER_SITE: + self.install_userbase = site.USER_BASE + self.install_usersite = site.USER_SITE + else: + self.install_userbase = None + self.install_usersite = None + self.no_find_links = None + + # Options not specifiable via command line + self.package_index = None + self.pth_file = self.always_copy_from = None + self.site_dirs = None + self.installed_projects = {} + self.sitepy_installed = False + # enable custom installation, known values: deb + self.install_layout = None + self.force_installation_into_system_dir = None + self.multiarch = None + + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + + def delete_blockers(self, blockers): + extant_blockers = ( + filename for filename in blockers + if os.path.exists(filename) or os.path.islink(filename) + ) + list(map(self._delete_path, extant_blockers)) + + def _delete_path(self, path): + log.info("Deleting %s", path) + if self.dry_run: + return + + is_tree = os.path.isdir(path) and not os.path.islink(path) + remover = rmtree if is_tree else os.unlink + remover(path) + + @staticmethod + def _render_version(): + """ + Render the Setuptools version and installation details, then exit. + """ + ver = sys.version[:3] + dist = get_distribution('setuptools') + tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' + print(tmpl.format(**locals())) + raise SystemExit() + + def finalize_options(self): + self.version and self._render_version() + + py_version = sys.version.split()[0] + prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') + + self.config_vars = { + 'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'py_version_nodot': py_version[0] + py_version[2], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + # Only python 3.2+ has abiflags + 'abiflags': getattr(sys, 'abiflags', ''), + } + + if site.ENABLE_USER_SITE: + self.config_vars['userbase'] = self.install_userbase + self.config_vars['usersite'] = self.install_usersite + + self._fix_install_dir_for_user_site() + + self.expand_basedirs() + self.expand_dirs() + + if self.install_layout: + if not self.install_layout.lower() in ['deb']: + raise DistutilsOptionError("unknown value for --install-layout") + self.install_layout = self.install_layout.lower() + + import sysconfig + if sys.version_info[:2] >= (3, 3): + self.multiarch = sysconfig.get_config_var('MULTIARCH') + + self._expand( + 'install_dir', 'script_dir', 'build_directory', + 'site_dirs', + ) + # If a non-default installation directory was specified, default the + # script directory to match it. + if self.script_dir is None: + self.script_dir = self.install_dir + + if self.no_find_links is None: + self.no_find_links = False + + # Let install_dir get set by install_lib command, which in turn + # gets its info from the install command, and takes into account + # --prefix and --home and all that other crud. + self.set_undefined_options( + 'install_lib', ('install_dir', 'install_dir') + ) + # Likewise, set default script_dir from 'install_scripts.install_dir' + self.set_undefined_options( + 'install_scripts', ('install_dir', 'script_dir') + ) + + if self.user and self.install_purelib: + self.install_dir = self.install_purelib + self.script_dir = self.install_scripts + + if self.prefix == '/usr' and not self.force_installation_into_system_dir: + raise DistutilsOptionError("""installation into /usr + +Trying to install into the system managed parts of the file system. Please +consider to install to another location, or use the option +--force-installation-into-system-dir to overwrite this warning. +""") + + # default --record from the install command + self.set_undefined_options('install', ('record', 'record')) + # Should this be moved to the if statement below? It's not used + # elsewhere + normpath = map(normalize_path, sys.path) + self.all_site_dirs = get_site_dirs() + if self.site_dirs is not None: + site_dirs = [ + os.path.expanduser(s.strip()) for s in + self.site_dirs.split(',') + ] + for d in site_dirs: + if not os.path.isdir(d): + log.warn("%s (in --site-dirs) does not exist", d) + elif normalize_path(d) not in normpath: + raise DistutilsOptionError( + d + " (in --site-dirs) is not on sys.path" + ) + else: + self.all_site_dirs.append(normalize_path(d)) + if not self.editable: + self.check_site_dir() + self.index_url = self.index_url or "https://pypi.python.org/simple" + self.shadow_path = self.all_site_dirs[:] + for path_item in self.install_dir, normalize_path(self.script_dir): + if path_item not in self.shadow_path: + self.shadow_path.insert(0, path_item) + + if self.allow_hosts is not None: + hosts = [s.strip() for s in self.allow_hosts.split(',')] + else: + hosts = ['*'] + if self.package_index is None: + self.package_index = self.create_index( + self.index_url, search_path=self.shadow_path, hosts=hosts, + ) + self.local_index = Environment(self.shadow_path + sys.path) + + if self.find_links is not None: + if isinstance(self.find_links, six.string_types): + self.find_links = self.find_links.split() + else: + self.find_links = [] + if self.local_snapshots_ok: + self.package_index.scan_egg_links(self.shadow_path + sys.path) + if not self.no_find_links: + self.package_index.add_find_links(self.find_links) + self.set_undefined_options('install_lib', ('optimize', 'optimize')) + if not isinstance(self.optimize, int): + try: + self.optimize = int(self.optimize) + if not (0 <= self.optimize <= 2): + raise ValueError + except ValueError: + raise DistutilsOptionError("--optimize must be 0, 1, or 2") + + if self.editable and not self.build_directory: + raise DistutilsArgError( + "Must specify a build directory (-b) when using --editable" + ) + if not self.args: + raise DistutilsArgError( + "No urls, filenames, or requirements specified (see --help)") + + self.outputs = [] + + def _fix_install_dir_for_user_site(self): + """ + Fix the install_dir if "--user" was used. + """ + if not self.user or not site.ENABLE_USER_SITE: + return + + self.create_home_path() + if self.install_userbase is None: + msg = "User base directory is not specified" + raise DistutilsPlatformError(msg) + self.install_base = self.install_platbase = self.install_userbase + scheme_name = os.name.replace('posix', 'unix') + '_user' + self.select_scheme(scheme_name) + + def _expand_attrs(self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix' or os.name == 'nt': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + def expand_basedirs(self): + """Calls `os.path.expanduser` on install_base, install_platbase and + root.""" + self._expand_attrs(['install_base', 'install_platbase', 'root']) + + def expand_dirs(self): + """Calls `os.path.expanduser` on install dirs.""" + dirs = [ + 'install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + ] + self._expand_attrs(dirs) + + def run(self): + if self.verbose != self.distribution.verbose: + log.set_verbosity(self.verbose) + try: + for spec in self.args: + self.easy_install(spec, not self.no_deps) + if self.record: + outputs = list(sorted(self.outputs)) + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in range(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + from distutils import file_util + + self.execute( + file_util.write_file, (self.record, outputs), + "writing list of installed files to '%s'" % + self.record + ) + self.warn_deprecated_options() + finally: + log.set_verbosity(self.distribution.verbose) + + def pseudo_tempname(self): + """Return a pseudo-tempname base in the install directory. + This code is intentionally naive; if a malicious party can write to + the target directory you're already in deep doodoo. + """ + try: + pid = os.getpid() + except Exception: + pid = random.randint(0, sys.maxsize) + return os.path.join(self.install_dir, "test-easy-install-%s" % pid) + + def warn_deprecated_options(self): + pass + + def check_site_dir(self): + """Verify that self.install_dir is .pth-capable dir, if needed""" + + instdir = normalize_path(self.install_dir) + pth_file = os.path.join(instdir, 'easy-install.pth') + + # Is it a configured, PYTHONPATH, implicit, or explicit site dir? + is_site_dir = instdir in self.all_site_dirs + + if not is_site_dir and not self.multi_version: + # No? Then directly test whether it does .pth file processing + is_site_dir = self.check_pth_processing() + else: + # make sure we can write to target dir + testfile = self.pseudo_tempname() + '.write-test' + test_exists = os.path.exists(testfile) + try: + if test_exists: + os.unlink(testfile) + open(testfile, 'w').close() + os.unlink(testfile) + except (OSError, IOError): + self.cant_write_to_target() + + if not is_site_dir and not self.multi_version: + # Can't install non-multi to non-site dir + raise DistutilsError(self.no_default_version_msg()) + + if is_site_dir: + if self.pth_file is None: + self.pth_file = PthDistributions(pth_file, self.all_site_dirs) + else: + self.pth_file = None + + PYTHONPATH = os.environ.get('PYTHONPATH', '').split(os.pathsep) + if instdir not in map(normalize_path, filter(None, PYTHONPATH)): + # only PYTHONPATH dirs need a site.py, so pretend it's there + self.sitepy_installed = True + elif self.multi_version and not os.path.exists(pth_file): + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file + self.install_dir = instdir + + __cant_write_msg = textwrap.dedent(""" + can't create or remove files in install directory + + The following error occurred while trying to add or remove files in the + installation directory: + + %s + + The installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + """).lstrip() + + __not_exists_id = textwrap.dedent(""" + This directory does not currently exist. Please create it and try again, or + choose a different installation directory (using the -d or --install-dir + option). + """).lstrip() + + __access_msg = textwrap.dedent(""" + Perhaps your account does not have write access to this directory? If the + installation directory is a system-owned directory, you may need to sign in + as the administrator or "root" account. If you do not have administrative + access to this machine, you may wish to choose a different installation + directory, preferably one that is listed in your PYTHONPATH environment + variable. + + For information on other options, you may wish to consult the + documentation at: + + https://setuptools.readthedocs.io/en/latest/easy_install.html + + Please make the appropriate changes for your system and try again. + """).lstrip() + + def cant_write_to_target(self): + msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) + + if not os.path.exists(self.install_dir): + msg += '\n' + self.__not_exists_id + else: + msg += '\n' + self.__access_msg + raise DistutilsError(msg) + + def check_pth_processing(self): + """Empirically verify whether .pth files are supported in inst. dir""" + instdir = self.install_dir + log.info("Checking .pth file support in %s", instdir) + pth_file = self.pseudo_tempname() + ".pth" + ok_file = pth_file + '.ok' + ok_exists = os.path.exists(ok_file) + tmpl = _one_liner(""" + import os + f = open({ok_file!r}, 'w') + f.write('OK') + f.close() + """) + '\n' + try: + if ok_exists: + os.unlink(ok_file) + dirname = os.path.dirname(ok_file) + if not os.path.exists(dirname): + os.makedirs(dirname) + f = open(pth_file, 'w') + except (OSError, IOError): + self.cant_write_to_target() + else: + try: + f.write(tmpl.format(**locals())) + f.close() + f = None + executable = sys.executable + if os.name == 'nt': + dirname, basename = os.path.split(executable) + alt = os.path.join(dirname, 'pythonw.exe') + use_alt = ( + basename.lower() == 'python.exe' and + os.path.exists(alt) + ) + if use_alt: + # use pythonw.exe to avoid opening a console window + executable = alt + + from distutils.spawn import spawn + + spawn([executable, '-E', '-c', 'pass'], 0) + + if os.path.exists(ok_file): + log.info( + "TEST PASSED: %s appears to support .pth files", + instdir + ) + return True + finally: + if f: + f.close() + if os.path.exists(ok_file): + os.unlink(ok_file) + if os.path.exists(pth_file): + os.unlink(pth_file) + if not self.multi_version: + log.warn("TEST FAILED: %s does NOT support .pth files", instdir) + return False + + def install_egg_scripts(self, dist): + """Write all the scripts for `dist`, unless scripts are excluded""" + if not self.exclude_scripts and dist.metadata_isdir('scripts'): + for script_name in dist.metadata_listdir('scripts'): + if dist.metadata_isdir('scripts/' + script_name): + # The "script" is a directory, likely a Python 3 + # __pycache__ directory, so skip it. + continue + self.install_script( + dist, script_name, + dist.get_metadata('scripts/' + script_name) + ) + self.install_wrapper_scripts(dist) + + def add_output(self, path): + if os.path.isdir(path): + for base, dirs, files in os.walk(path): + for filename in files: + self.outputs.append(os.path.join(base, filename)) + else: + self.outputs.append(path) + + def not_editable(self, spec): + if self.editable: + raise DistutilsArgError( + "Invalid argument %r: you can't use filenames or URLs " + "with --editable (except via the --find-links option)." + % (spec,) + ) + + def check_editable(self, spec): + if not self.editable: + return + + if os.path.exists(os.path.join(self.build_directory, spec.key)): + raise DistutilsArgError( + "%r already exists in %s; can't do a checkout there" % + (spec.key, self.build_directory) + ) + + @contextlib.contextmanager + def _tmpdir(self): + tmpdir = tempfile.mkdtemp(prefix=six.u("easy_install-")) + try: + # cast to str as workaround for #709 and #710 and #712 + yield str(tmpdir) + finally: + os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) + + def easy_install(self, spec, deps=False): + if not self.editable: + self.install_site_py() + + with self._tmpdir() as tmpdir: + if not isinstance(spec, Requirement): + if URL_SCHEME(spec): + # It's a url, download it to tmpdir and process + self.not_editable(spec) + dl = self.package_index.download(spec, tmpdir) + return self.install_item(None, dl, tmpdir, deps, True) + + elif os.path.exists(spec): + # Existing file or directory, just process it directly + self.not_editable(spec) + return self.install_item(None, spec, tmpdir, deps, True) + else: + spec = parse_requirement_arg(spec) + + self.check_editable(spec) + dist = self.package_index.fetch_distribution( + spec, tmpdir, self.upgrade, self.editable, + not self.always_copy, self.local_index + ) + if dist is None: + msg = "Could not find suitable distribution for %r" % spec + if self.always_copy: + msg += " (--always-copy skips system and development eggs)" + raise DistutilsError(msg) + elif dist.precedence == DEVELOP_DIST: + # .egg-info dists don't need installing, just process deps + self.process_distribution(spec, dist, deps, "Using") + return dist + else: + return self.install_item(spec, dist.location, tmpdir, deps) + + def install_item(self, spec, download, tmpdir, deps, install_needed=False): + + # Installation is also needed if file in tmpdir or is not an egg + install_needed = install_needed or self.always_copy + install_needed = install_needed or os.path.dirname(download) == tmpdir + install_needed = install_needed or not download.endswith('.egg') + install_needed = install_needed or ( + self.always_copy_from is not None and + os.path.dirname(normalize_path(download)) == + normalize_path(self.always_copy_from) + ) + + if spec and not install_needed: + # at this point, we know it's a local .egg, we just don't know if + # it's already installed. + for dist in self.local_index[spec.project_name]: + if dist.location == download: + break + else: + install_needed = True # it's not in the local index + + log.info("Processing %s", os.path.basename(download)) + + if install_needed: + dists = self.install_eggs(spec, download, tmpdir) + for dist in dists: + self.process_distribution(spec, dist, deps) + else: + dists = [self.egg_distribution(download)] + self.process_distribution(spec, dists[0], deps, "Using") + + if spec is not None: + for dist in dists: + if dist in spec: + return dist + + def select_scheme(self, name): + """Sets the install directories by applying the install schemes.""" + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + def process_distribution(self, requirement, dist, deps=True, *info): + self.update_pth(dist) + self.package_index.add(dist) + if dist in self.local_index[dist.key]: + self.local_index.remove(dist) + self.local_index.add(dist) + self.install_egg_scripts(dist) + self.installed_projects[dist.key] = dist + log.info(self.installation_report(requirement, dist, *info)) + if (dist.has_metadata('dependency_links.txt') and + not self.no_find_links): + self.package_index.add_find_links( + dist.get_metadata_lines('dependency_links.txt') + ) + if not deps and not self.always_copy: + return + elif requirement is not None and dist.key != requirement.key: + log.warn("Skipping dependencies for %s", dist) + return # XXX this is not the distribution we were looking for + elif requirement is None or dist not in requirement: + # if we wound up with a different version, resolve what we've got + distreq = dist.as_requirement() + requirement = Requirement(str(distreq)) + log.info("Processing dependencies for %s", requirement) + try: + distros = WorkingSet([]).resolve( + [requirement], self.local_index, self.easy_install + ) + except DistributionNotFound as e: + raise DistutilsError(str(e)) + except VersionConflict as e: + raise DistutilsError(e.report()) + if self.always_copy or self.always_copy_from: + # Force all the relevant distros to be copied or activated + for dist in distros: + if dist.key not in self.installed_projects: + self.easy_install(dist.as_requirement()) + log.info("Finished processing dependencies for %s", requirement) + + def should_unzip(self, dist): + if self.zip_ok is not None: + return not self.zip_ok + if dist.has_metadata('not-zip-safe'): + return True + if not dist.has_metadata('zip-safe'): + return True + return False + + def maybe_move(self, spec, dist_filename, setup_base): + dst = os.path.join(self.build_directory, spec.key) + if os.path.exists(dst): + msg = ( + "%r already exists in %s; build directory %s will not be kept" + ) + log.warn(msg, spec.key, self.build_directory, setup_base) + return setup_base + if os.path.isdir(dist_filename): + setup_base = dist_filename + else: + if os.path.dirname(dist_filename) == setup_base: + os.unlink(dist_filename) # get it out of the tmp dir + contents = os.listdir(setup_base) + if len(contents) == 1: + dist_filename = os.path.join(setup_base, contents[0]) + if os.path.isdir(dist_filename): + # if the only thing there is a directory, move it instead + setup_base = dist_filename + ensure_directory(dst) + shutil.move(setup_base, dst) + return dst + + def install_wrapper_scripts(self, dist): + if self.exclude_scripts: + return + for args in ScriptWriter.best().get_args(dist): + self.write_script(*args) + + def install_script(self, dist, script_name, script_text, dev_path=None): + """Generate a legacy script wrapper and install it""" + spec = str(dist.as_requirement()) + is_script = is_python_script(script_text, script_name) + + if is_script: + body = self._load_template(dev_path) % locals() + script_text = ScriptWriter.get_header(script_text) + body + self.write_script(script_name, _to_ascii(script_text), 'b') + + @staticmethod + def _load_template(dev_path): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + """ + # See https://github.com/pypa/setuptools/issues/134 for info + # on script file naming and downstream issues with SVR4 + name = 'script.tmpl' + if dev_path: + name = name.replace('.tmpl', ' (dev).tmpl') + + raw_bytes = resource_string('setuptools', name) + return raw_bytes.decode('utf-8') + + def write_script(self, script_name, contents, mode="t", blockers=()): + """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir, x) for x in blockers] + ) + log.info("Installing %s script to %s", script_name, self.script_dir) + target = os.path.join(self.script_dir, script_name) + self.add_output(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + if os.path.exists(target): + os.unlink(target) + with open(target, "w" + mode) as f: + f.write(contents) + chmod(target, 0o777 - mask) + + def install_eggs(self, spec, dist_filename, tmpdir): + # .egg dirs or files are already built, so just return them + if dist_filename.lower().endswith('.egg'): + return [self.install_egg(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.exe'): + return [self.install_exe(dist_filename, tmpdir)] + + # Anything else, try to extract and build + setup_base = tmpdir + if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): + unpack_archive(dist_filename, tmpdir, self.unpack_progress) + elif os.path.isdir(dist_filename): + setup_base = os.path.abspath(dist_filename) + + if (setup_base.startswith(tmpdir) # something we downloaded + and self.build_directory and spec is not None): + setup_base = self.maybe_move(spec, dist_filename, setup_base) + + # Find the setup.py file + setup_script = os.path.join(setup_base, 'setup.py') + + if not os.path.exists(setup_script): + setups = glob(os.path.join(setup_base, '*', 'setup.py')) + if not setups: + raise DistutilsError( + "Couldn't find a setup script in %s" % + os.path.abspath(dist_filename) + ) + if len(setups) > 1: + raise DistutilsError( + "Multiple setup scripts in %s" % + os.path.abspath(dist_filename) + ) + setup_script = setups[0] + + # Now run it, and return the result + if self.editable: + log.info(self.report_editable(spec, setup_script)) + return [] + else: + return self.build_and_install(setup_script, setup_base) + + def egg_distribution(self, egg_path): + if os.path.isdir(egg_path): + metadata = PathMetadata(egg_path, os.path.join(egg_path, + 'EGG-INFO')) + else: + metadata = EggMetadata(zipimport.zipimporter(egg_path)) + return Distribution.from_filename(egg_path, metadata=metadata) + + def install_egg(self, egg_path, tmpdir): + destination = os.path.join( + self.install_dir, + os.path.basename(egg_path), + ) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + + dist = self.egg_distribution(egg_path) + if not samefile(egg_path, destination): + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + new_dist_is_zipped = False + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f, m = self.unpack_and_compile, "Extracting" + else: + new_dist_is_zipped = True + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copy2, "Copying" + self.execute( + f, + (egg_path, destination), + (m + " %s to %s") % ( + os.path.basename(egg_path), + os.path.dirname(destination) + ), + ) + update_dist_caches( + destination, + fix_zipimporter_caches=new_dist_is_zipped, + ) + except Exception: + update_dist_caches(destination, fix_zipimporter_caches=False) + raise + + self.add_output(destination) + return self.egg_distribution(destination) + + def install_exe(self, dist_filename, tmpdir): + # See if it's valid, get data + cfg = extract_wininst_cfg(dist_filename) + if cfg is None: + raise DistutilsError( + "%s is not a valid distutils Windows .exe" % dist_filename + ) + # Create a dummy distribution object until we build the real distro + dist = Distribution( + None, + project_name=cfg.get('metadata', 'name'), + version=cfg.get('metadata', 'version'), platform=get_platform(), + ) + + # Convert the .exe to an unpacked egg + egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') + dist.location = egg_path + egg_tmp = egg_path + '.tmp' + _egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(_egg_info, 'PKG-INFO') + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX + self.exe_to_egg(dist_filename, egg_tmp) + + # Write EGG-INFO/PKG-INFO + if not os.path.exists(pkg_inf): + f = open(pkg_inf, 'w') + f.write('Metadata-Version: 1.0\n') + for k, v in cfg.items('metadata'): + if k != 'target_version': + f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) + f.close() + script_dir = os.path.join(_egg_info, 'scripts') + # delete entry-point scripts to avoid duping + self.delete_blockers([ + os.path.join(script_dir, args[0]) + for args in ScriptWriter.get_args(dist) + ]) + # Build .egg file from tmpdir + bdist_egg.make_zipfile( + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, + ) + # install the .egg + return self.install_egg(egg_path, tmpdir) + + def exe_to_egg(self, dist_filename, egg_tmp): + """Extract a bdist_wininst to the directories an egg would use""" + # Check for .pth file and set up prefix translations + prefixes = get_exe_prefixes(dist_filename) + to_compile = [] + native_libs = [] + top_level = {} + + def process(src, dst): + s = src.lower() + for old, new in prefixes: + if s.startswith(old): + src = new + src[len(old):] + parts = src.split('/') + dst = os.path.join(egg_tmp, *parts) + dl = dst.lower() + if dl.endswith('.pyd') or dl.endswith('.dll'): + parts[-1] = bdist_egg.strip_module(parts[-1]) + top_level[os.path.splitext(parts[0])[0]] = 1 + native_libs.append(src) + elif dl.endswith('.py') and old != 'SCRIPTS/': + top_level[os.path.splitext(parts[0])[0]] = 1 + to_compile.append(dst) + return dst + if not src.endswith('.pth'): + log.warn("WARNING: can't process %s", src) + return None + + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile + unpack_archive(dist_filename, egg_tmp, process) + stubs = [] + for res in native_libs: + if res.lower().endswith('.pyd'): # create stubs for .pyd's + parts = res.split('/') + resource = parts[-1] + parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' + pyfile = os.path.join(egg_tmp, *parts) + to_compile.append(pyfile) + stubs.append(pyfile) + bdist_egg.write_stub(resource, pyfile) + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag( + os.path.join(egg_tmp, 'EGG-INFO'), + bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag + + for name in 'top_level', 'native_libs': + if locals()[name]: + txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') + if not os.path.exists(txt): + f = open(txt, 'w') + f.write('\n'.join(locals()[name]) + '\n') + f.close() + + __mv_warning = textwrap.dedent(""" + Because this distribution was installed --multi-version, before you can + import modules from this package in an application, you will need to + 'import pkg_resources' and then use a 'require()' call similar to one of + these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher + """).lstrip() + + __id_warning = textwrap.dedent(""" + Note also that the installation directory must be on sys.path at runtime for + this to work. (e.g. by being the application's script directory, by being on + PYTHONPATH, or by being added to sys.path by your code.) + """) + + def installation_report(self, req, dist, what="Installed"): + """Helpful installation message for display to package users""" + msg = "\n%(what)s %(eggloc)s%(extras)s" + if self.multi_version and not self.no_report: + msg += '\n' + self.__mv_warning + if self.install_dir not in map(normalize_path, sys.path): + msg += '\n' + self.__id_warning + + eggloc = dist.location + name = dist.project_name + version = dist.version + extras = '' # TODO: self.report_extras(req, dist) + return msg % locals() + + __editable_msg = textwrap.dedent(""" + Extracted editable version of %(spec)s to %(dirname)s + + If it uses setuptools in its setup script, you can activate it in + "development" mode by going to that directory and running:: + + %(python)s setup.py develop + + See the setuptools documentation for the "develop" command for more info. + """).lstrip() + + def report_editable(self, spec, setup_script): + dirname = os.path.dirname(setup_script) + python = sys.executable + return '\n' + self.__editable_msg % locals() + + def run_setup(self, setup_script, setup_base, args): + sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) + sys.modules.setdefault('distutils.command.egg_info', egg_info) + + args = list(args) + if self.verbose > 2: + v = 'v' * (self.verbose - 1) + args.insert(0, '-' + v) + elif self.verbose < 2: + args.insert(0, '-q') + if self.dry_run: + args.insert(0, '-n') + log.info( + "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) + ) + try: + run_setup(setup_script, args) + except SystemExit as v: + raise DistutilsError("Setup script exited with %s" % (v.args[0],)) + + def build_and_install(self, setup_script, setup_base): + args = ['bdist_egg', '--dist-dir'] + + dist_dir = tempfile.mkdtemp( + prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) + ) + try: + self._set_fetcher_options(os.path.dirname(setup_script)) + args.append(dist_dir) + + self.run_setup(setup_script, setup_base, args) + all_eggs = Environment([dist_dir]) + eggs = [] + for key in all_eggs: + for dist in all_eggs[key]: + eggs.append(self.install_egg(dist.location, setup_base)) + if not eggs and not self.dry_run: + log.warn("No eggs found in %s (setup script problem?)", + dist_dir) + return eggs + finally: + rmtree(dist_dir) + log.set_verbosity(self.verbose) # restore our log verbosity + + def _set_fetcher_options(self, base): + """ + When easy_install is about to run bdist_egg on a source dist, that + source dist might have 'setup_requires' directives, requiring + additional fetching. Ensure the fetcher options given to easy_install + are available to that command as well. + """ + # find the fetch options from easy_install and write them out + # to the setup.cfg file. + ei_opts = self.distribution.get_option_dict('easy_install').copy() + fetch_directives = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts', + ) + fetch_options = {} + for key, val in ei_opts.items(): + if key not in fetch_directives: + continue + fetch_options[key.replace('_', '-')] = val[1] + # create a settings dictionary suitable for `edit_config` + settings = dict(easy_install=fetch_options) + cfg_filename = os.path.join(base, 'setup.cfg') + setopt.edit_config(cfg_filename, settings) + + def update_pth(self, dist): + if self.pth_file is None: + return + + for d in self.pth_file[dist.key]: # drop old entries + if self.multi_version or d.location != dist.location: + log.info("Removing %s from easy-install.pth file", d) + self.pth_file.remove(d) + if d.location in self.shadow_path: + self.shadow_path.remove(d.location) + + if not self.multi_version: + if dist.location in self.pth_file.paths: + log.info( + "%s is already the active version in easy-install.pth", + dist, + ) + else: + log.info("Adding %s to easy-install.pth file", dist) + self.pth_file.add(dist) # add new entry + if dist.location not in self.shadow_path: + self.shadow_path.append(dist.location) + + if not self.dry_run: + + self.pth_file.save() + + if dist.key == 'setuptools': + # Ensure that setuptools itself never becomes unavailable! + # XXX should this check for latest version? + filename = os.path.join(self.install_dir, 'setuptools.pth') + if os.path.islink(filename): + os.unlink(filename) + f = open(filename, 'wt') + f.write(self.pth_file.make_relative(dist.location) + '\n') + f.close() + + def unpack_progress(self, src, dst): + # Progress filter for unpacking + log.debug("Unpacking %s to %s", src, dst) + return dst # only unpack-and-compile skips files for dry run + + def unpack_and_compile(self, egg_path, destination): + to_compile = [] + to_chmod = [] + + def pf(src, dst): + if dst.endswith('.py') and not src.startswith('EGG-INFO/'): + to_compile.append(dst) + elif dst.endswith('.dll') or dst.endswith('.so'): + to_chmod.append(dst) + self.unpack_progress(src, dst) + return not self.dry_run and dst or None + + unpack_archive(egg_path, destination, pf) + self.byte_compile(to_compile) + if not self.dry_run: + for f in to_chmod: + mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 + chmod(f, mode) + + def byte_compile(self, to_compile): + if sys.dont_write_bytecode: + self.warn('byte-compiling is disabled, skipping.') + return + + from distutils.util import byte_compile + + try: + # try to make the byte compile messages quieter + log.set_verbosity(self.verbose - 1) + + byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) + if self.optimize: + byte_compile( + to_compile, optimize=self.optimize, force=1, + dry_run=self.dry_run, + ) + finally: + log.set_verbosity(self.verbose) # restore original verbosity + + __no_default_msg = textwrap.dedent(""" + bad install directory or PYTHONPATH + + You are attempting to install a package to a directory that is not + on PYTHONPATH and which Python does not read ".pth" files from. The + installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + + and your PYTHONPATH environment variable currently contains: + + %r + + Here are some of your options for correcting the problem: + + * You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + + * You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + + * You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations + + + Please make the appropriate changes for your system and try again.""").lstrip() + + def no_default_version_msg(self): + template = self.__no_default_msg + return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) + + def install_site_py(self): + """Make sure there's a site.py in the target dir, if needed""" + + if self.sitepy_installed: + return # already did it, or don't need to + + sitepy = os.path.join(self.install_dir, "site.py") + source = resource_string("setuptools", "site-patch.py") + source = source.decode('utf-8') + current = "" + + if os.path.exists(sitepy): + log.debug("Checking existing site.py in %s", self.install_dir) + with io.open(sitepy) as strm: + current = strm.read() + + if not current.startswith('def __boot():'): + raise DistutilsError( + "%s is not a setuptools-generated site.py; please" + " remove it." % sitepy + ) + + if current != source: + log.info("Creating %s", sitepy) + if not self.dry_run: + ensure_directory(sitepy) + with io.open(sitepy, 'w', encoding='utf-8') as strm: + strm.write(source) + self.byte_compile([sitepy]) + + self.sitepy_installed = True + + def create_home_path(self): + """Create directories under ~.""" + if not self.user: + return + home = convert_path(os.path.expanduser("~")) + for name, path in six.iteritems(self.config_vars): + if path.startswith(home) and not os.path.isdir(path): + self.debug_print("os.makedirs('%s', 0o700)" % path) + os.makedirs(path, 0o700) + + if sys.version[:3] in ('2.3', '2.4', '2.5') or 'real_prefix' in sys.__dict__: + sitedir_name = 'site-packages' + else: + sitedir_name = 'dist-packages' + + INSTALL_SCHEMES = dict( + posix=dict( + install_dir='$base/lib/python$py_version_short/site-packages', + script_dir='$base/bin', + ), + unix_local = dict( + install_dir = '$base/local/lib/python$py_version_short/%s' % sitedir_name, + script_dir = '$base/local/bin', + ), + posix_local = dict( + install_dir = '$base/local/lib/python$py_version_short/%s' % sitedir_name, + script_dir = '$base/local/bin', + ), + deb_system = dict( + install_dir = '$base/lib/python3/%s' % sitedir_name, + script_dir = '$base/bin', + ), + ) + + DEFAULT_SCHEME = dict( + install_dir='$base/Lib/site-packages', + script_dir='$base/Scripts', + ) + + def _expand(self, *attrs): + config_vars = self.get_finalized_command('install').config_vars + + if self.prefix or self.install_layout: + if self.install_layout and self.install_layout in ['deb']: + scheme_name = "deb_system" + self.prefix = '/usr' + elif self.prefix or 'real_prefix' in sys.__dict__: + scheme_name = os.name + else: + scheme_name = "posix_local" + # Set default install_dir/scripts from --prefix + config_vars = config_vars.copy() + config_vars['base'] = self.prefix + scheme = self.INSTALL_SCHEMES.get(scheme_name,self.DEFAULT_SCHEME) + for attr, val in scheme.items(): + if getattr(self, attr, None) is None: + setattr(self, attr, val) + + from distutils.util import subst_vars + + for attr in attrs: + val = getattr(self, attr) + if val is not None: + val = subst_vars(val, config_vars) + if os.name == 'posix': + val = os.path.expanduser(val) + setattr(self, attr, val) + + +def get_site_dirs(): + # return a list of 'site' dirs + sitedirs = [_f for _f in os.environ.get('PYTHONPATH', + '').split(os.pathsep) if _f] + prefixes = [sys.prefix] + if sys.exec_prefix != sys.prefix: + prefixes.append(sys.exec_prefix) + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) + elif os.sep == '/': + sitedirs.extend([ + os.path.join( + prefix, + "local/lib", + "python" + sys.version[:3], + "dist-packages", + ), + os.path.join( + prefix, + "lib", + "python" + sys.version[:3], + "dist-packages", + ), + os.path.join(prefix, "lib", "site-python"), + ]) + else: + sitedirs.extend([ + prefix, + os.path.join(prefix, "lib", "site-packages"), + ]) + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + home_sp = os.path.join( + home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages', + ) + sitedirs.append(home_sp) + lib_paths = get_path('purelib'), get_path('platlib') + for site_lib in lib_paths: + if site_lib not in sitedirs: + sitedirs.append(site_lib) + + if site.ENABLE_USER_SITE: + sitedirs.append(site.USER_SITE) + + try: + sitedirs.extend(site.getsitepackages()) + except AttributeError: + pass + + sitedirs = list(map(normalize_path, sitedirs)) + + return sitedirs + + +def expand_paths(inputs): + """Yield sys.path directories that might contain "old-style" packages""" + + seen = {} + + for dirname in inputs: + dirname = normalize_path(dirname) + if dirname in seen: + continue + + seen[dirname] = 1 + if not os.path.isdir(dirname): + continue + + files = os.listdir(dirname) + yield dirname, files + + for name in files: + if not name.endswith('.pth'): + # We only care about the .pth files + continue + if name in ('easy-install.pth', 'setuptools.pth'): + # Ignore .pth files that we control + continue + + # Read the .pth file + f = open(os.path.join(dirname, name)) + lines = list(yield_lines(f)) + f.close() + + # Yield existing non-dupe, non-import directory lines from it + for line in lines: + if not line.startswith("import"): + line = normalize_path(line.rstrip()) + if line not in seen: + seen[line] = 1 + if not os.path.isdir(line): + continue + yield line, os.listdir(line) + + +def extract_wininst_cfg(dist_filename): + """Extract configuration data from a bdist_wininst .exe + + Returns a configparser.RawConfigParser, or None + """ + f = open(dist_filename, 'rb') + try: + endrec = zipfile._EndRecData(f) + if endrec is None: + return None + + prepended = (endrec[9] - endrec[5]) - endrec[6] + if prepended < 12: # no wininst data here + return None + f.seek(prepended - 12) + + tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended - (12 + cfglen)) + init = {'version': '', 'target_version': ''} + cfg = configparser.RawConfigParser(init) + try: + part = f.read(cfglen) + # Read up to the first null byte. + config = part.split(b'\0', 1)[0] + # Now the config is in bytes, but for RawConfigParser, it should + # be text, so decode it. + config = config.decode(sys.getfilesystemencoding()) + cfg.readfp(six.StringIO(config)) + except configparser.Error: + return None + if not cfg.has_section('metadata') or not cfg.has_section('Setup'): + return None + return cfg + + finally: + f.close() + + +def get_exe_prefixes(exe_filename): + """Get exe->egg path translations for a given .exe file""" + + prefixes = [ + ('PURELIB/', ''), + ('PLATLIB/pywin32_system32', ''), + ('PLATLIB/', ''), + ('SCRIPTS/', 'EGG-INFO/scripts/'), + ('DATA/lib/site-packages', ''), + ] + z = zipfile.ZipFile(exe_filename) + try: + for info in z.infolist(): + name = info.filename + parts = name.split('/') + if len(parts) == 3 and parts[2] == 'PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts) != 2 or not name.endswith('.pth'): + continue + if name.endswith('-nspkg.pth'): + continue + if parts[0].upper() in ('PURELIB', 'PLATLIB'): + contents = z.read(name) + if six.PY3: + contents = contents.decode() + for pth in yield_lines(contents): + pth = pth.strip().replace('\\', '/') + if not pth.startswith('import'): + prefixes.append((('%s/%s/' % (parts[0], pth)), '')) + finally: + z.close() + prefixes = [(x.lower(), y) for x, y in prefixes] + prefixes.sort() + prefixes.reverse() + return prefixes + + +class PthDistributions(Environment): + """A .pth file with Distribution paths in it""" + + dirty = False + + def __init__(self, filename, sitedirs=()): + self.filename = filename + self.sitedirs = list(map(normalize_path, sitedirs)) + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load() + Environment.__init__(self, [], None, None) + for path in yield_lines(self.paths): + list(map(self.add, find_distributions(path, True))) + + def _load(self): + self.paths = [] + saw_import = False + seen = dict.fromkeys(self.sitedirs) + if os.path.isfile(self.filename): + f = open(self.filename, 'rt') + for line in f: + if line.startswith('import'): + saw_import = True + continue + path = line.rstrip() + self.paths.append(path) + if not path.strip() or path.strip().startswith('#'): + continue + # skip non-existent paths, in case somebody deleted a package + # manually, and duplicate paths as well + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir, path) + ) + if not os.path.exists(path) or path in seen: + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) + continue + seen[path] = 1 + f.close() + + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): + """Write changed .pth file back to disk""" + if not self.dirty: + return + + rel_paths = list(map(self.make_relative, self.paths)) + if rel_paths: + log.debug("Saving %s", self.filename) + lines = self._wrap_lines(rel_paths) + data = '\n'.join(lines) + '\n' + + if os.path.islink(self.filename): + os.unlink(self.filename) + with open(self.filename, 'wt') as f: + f.write(data) + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False + + @staticmethod + def _wrap_lines(lines): + return lines + + def add(self, dist): + """Add `dist` to the distribution map""" + new_path = ( + dist.location not in self.paths and ( + dist.location not in self.sitedirs or + # account for '.' being in PYTHONPATH + dist.location == os.getcwd() + ) + ) + if new_path: + self.paths.append(dist.location) + self.dirty = True + Environment.add(self, dist) + + def remove(self, dist): + """Remove `dist` from the distribution map""" + while dist.location in self.paths: + self.paths.remove(dist.location) + self.dirty = True + Environment.remove(self, dist) + + def make_relative(self, path): + npath, last = os.path.split(normalize_path(path)) + baselen = len(self.basedir) + parts = [last] + sep = os.altsep == '/' and '/' or os.sep + while len(npath) >= baselen: + if npath == self.basedir: + parts.append(os.curdir) + parts.reverse() + return sep.join(parts) + npath, last = os.path.split(npath) + parts.append(last) + else: + return path + + +class RewritePthDistributions(PthDistributions): + @classmethod + def _wrap_lines(cls, lines): + yield cls.prelude + for line in lines: + yield line + yield cls.postlude + + prelude = _one_liner(""" + import sys + sys.__plen = len(sys.path) + """) + postlude = _one_liner(""" + import sys + new = sys.path[sys.__plen:] + del sys.path[sys.__plen:] + p = getattr(sys, '__egginsert', 0) + sys.path[p:p] = new + sys.__egginsert = p + len(new) + """) + + +if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': + PthDistributions = RewritePthDistributions + + +def _first_line_re(): + """ + Return a regular expression based on first_line_re suitable for matching + strings. + """ + if isinstance(first_line_re.pattern, str): + return first_line_re + + # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. + return re.compile(first_line_re.pattern.decode()) + + +def auto_chmod(func, arg, exc): + if func is os.remove and os.name == 'nt': + chmod(arg, stat.S_IWRITE) + return func(arg) + et, ev, _ = sys.exc_info() + six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) + + +def update_dist_caches(dist_path, fix_zipimporter_caches): + """ + Fix any globally cached `dist_path` related data + + `dist_path` should be a path of a newly installed egg distribution (zipped + or unzipped). + + sys.path_importer_cache contains finder objects that have been cached when + importing data from the original distribution. Any such finders need to be + cleared since the replacement distribution might be packaged differently, + e.g. a zipped egg distribution might get replaced with an unzipped egg + folder or vice versa. Having the old finders cached may then cause Python + to attempt loading modules from the replacement distribution using an + incorrect loader. + + zipimport.zipimporter objects are Python loaders charged with importing + data packaged inside zip archives. If stale loaders referencing the + original distribution, are left behind, they can fail to load modules from + the replacement distribution. E.g. if an old zipimport.zipimporter instance + is used to load data from a new zipped egg archive, it may cause the + operation to attempt to locate the requested data in the wrong location - + one indicated by the original distribution's zip archive directory + information. Such an operation may then fail outright, e.g. report having + read a 'bad local file header', or even worse, it may fail silently & + return invalid data. + + zipimport._zip_directory_cache contains cached zip archive directory + information for all existing zipimport.zipimporter instances and all such + instances connected to the same archive share the same cached directory + information. + + If asked, and the underlying Python implementation allows it, we can fix + all existing zipimport.zipimporter instances instead of having to track + them down and remove them one by one, by updating their shared cached zip + archive directory information. This, of course, assumes that the + replacement distribution is packaged as a zipped egg. + + If not asked to fix existing zipimport.zipimporter instances, we still do + our best to clear any remaining zipimport.zipimporter related cached data + that might somehow later get used when attempting to load data from the new + distribution and thus cause such load operations to fail. Note that when + tracking down such remaining stale data, we can not catch every conceivable + usage from here, and we clear only those that we know of and have found to + cause problems if left alive. Any remaining caches should be updated by + whomever is in charge of maintaining them, i.e. they should be ready to + handle us replacing their zip archives with new distributions at runtime. + + """ + # There are several other known sources of stale zipimport.zipimporter + # instances that we do not clear here, but might if ever given a reason to + # do so: + # * Global setuptools pkg_resources.working_set (a.k.a. 'master working + # set') may contain distributions which may in turn contain their + # zipimport.zipimporter loaders. + # * Several zipimport.zipimporter loaders held by local variables further + # up the function call stack when running the setuptools installation. + # * Already loaded modules may have their __loader__ attribute set to the + # exact loader instance used when importing them. Python 3.4 docs state + # that this information is intended mostly for introspection and so is + # not expected to cause us problems. + normalized_path = normalize_path(dist_path) + _uncache(normalized_path, sys.path_importer_cache) + if fix_zipimporter_caches: + _replace_zip_directory_cache_data(normalized_path) + else: + # Here, even though we do not want to fix existing and now stale + # zipimporter cache information, we still want to remove it. Related to + # Python's zip archive directory information cache, we clear each of + # its stale entries in two phases: + # 1. Clear the entry so attempting to access zip archive information + # via any existing stale zipimport.zipimporter instances fails. + # 2. Remove the entry from the cache so any newly constructed + # zipimport.zipimporter instances do not end up using old stale + # zip archive directory information. + # This whole stale data removal step does not seem strictly necessary, + # but has been left in because it was done before we started replacing + # the zip archive directory information cache content if possible, and + # there are no relevant unit tests that we can depend on to tell us if + # this is really needed. + _remove_and_clear_zip_directory_cache_data(normalized_path) + + +def _collect_zipimporter_cache_entries(normalized_path, cache): + """ + Return zipimporter cache entry keys related to a given normalized path. + + Alternative path spellings (e.g. those using different character case or + those using alternative path separators) related to the same path are + included. Any sub-path entries are included as well, i.e. those + corresponding to zip archives embedded in other zip archives. + + """ + result = [] + prefix_len = len(normalized_path) + for p in cache: + np = normalize_path(p) + if (np.startswith(normalized_path) and + np[prefix_len:prefix_len + 1] in (os.sep, '')): + result.append(p) + return result + + +def _update_zipimporter_cache(normalized_path, cache, updater=None): + """ + Update zipimporter cache data for a given normalized path. + + Any sub-path entries are processed as well, i.e. those corresponding to zip + archives embedded in other zip archives. + + Given updater is a callable taking a cache entry key and the original entry + (after already removing the entry from the cache), and expected to update + the entry and possibly return a new one to be inserted in its place. + Returning None indicates that the entry should not be replaced with a new + one. If no updater is given, the cache entries are simply removed without + any additional processing, the same as if the updater simply returned None. + + """ + for p in _collect_zipimporter_cache_entries(normalized_path, cache): + # N.B. pypy's custom zipimport._zip_directory_cache implementation does + # not support the complete dict interface: + # * Does not support item assignment, thus not allowing this function + # to be used only for removing existing cache entries. + # * Does not support the dict.pop() method, forcing us to use the + # get/del patterns instead. For more detailed information see the + # following links: + # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 + # https://bitbucket.org/pypy/pypy/src/dd07756a34a41f674c0cacfbc8ae1d4cc9ea2ae4/pypy/module/zipimport/interp_zipimport.py#cl-99 + old_entry = cache[p] + del cache[p] + new_entry = updater and updater(p, old_entry) + if new_entry is not None: + cache[p] = new_entry + + +def _uncache(normalized_path, cache): + _update_zipimporter_cache(normalized_path, cache) + + +def _remove_and_clear_zip_directory_cache_data(normalized_path): + def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): + old_entry.clear() + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=clear_and_remove_cached_zip_archive_directory_data) + + +# PyPy Python implementation does not allow directly writing to the +# zipimport._zip_directory_cache and so prevents us from attempting to correct +# its content. The best we can do there is clear the problematic cache content +# and have PyPy repopulate it as needed. The downside is that if there are any +# stale zipimport.zipimporter instances laying around, attempting to use them +# will fail due to not having its zip archive directory information available +# instead of being automatically corrected to use the new correct zip archive +# directory information. +if '__pypy__' in sys.builtin_module_names: + _replace_zip_directory_cache_data = \ + _remove_and_clear_zip_directory_cache_data +else: + + def _replace_zip_directory_cache_data(normalized_path): + def replace_cached_zip_archive_directory_data(path, old_entry): + # N.B. In theory, we could load the zip directory information just + # once for all updated path spellings, and then copy it locally and + # update its contained path strings to contain the correct + # spelling, but that seems like a way too invasive move (this cache + # structure is not officially documented anywhere and could in + # theory change with new Python releases) for no significant + # benefit. + old_entry.clear() + zipimport.zipimporter(path) + old_entry.update(zipimport._zip_directory_cache[path]) + return old_entry + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=replace_cached_zip_archive_directory_data) + + +def is_python(text, filename='<string>'): + "Is this string a valid Python script?" + try: + compile(text, filename, 'exec') + except (SyntaxError, TypeError): + return False + else: + return True + + +def is_sh(executable): + """Determine if the specified executable is a .sh (contains a #! line)""" + try: + with io.open(executable, encoding='latin-1') as fp: + magic = fp.read(2) + except (OSError, IOError): + return executable + return magic == '#!' + + +def nt_quote_arg(arg): + """Quote a command line argument according to Windows parsing rules""" + return subprocess.list2cmdline([arg]) + + +def is_python_script(script_text, filename): + """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. + """ + if filename.endswith('.py') or filename.endswith('.pyw'): + return True # extension says it's Python + if is_python(script_text, filename): + return True # it's syntactically valid Python + if script_text.startswith('#!'): + # It begins with a '#!' line, so check if 'python' is in it somewhere + return 'python' in script_text.splitlines()[0].lower() + + return False # Not any Python I can recognize + + +try: + from os import chmod as _chmod +except ImportError: + # Jython compatibility + def _chmod(*args): + pass + + +def chmod(path, mode): + log.debug("changing mode of %s to %o", path, mode) + try: + _chmod(path, mode) + except os.error as e: + log.debug("chmod failed: %s", e) + + +class CommandSpec(list): + """ + A command spec for a #! header, specified as a list of arguments akin to + those passed to Popen. + """ + + options = [] + split_args = dict() + + @classmethod + def best(cls): + """ + Choose the best CommandSpec class based on environmental conditions. + """ + return cls + + @classmethod + def _sys_executable(cls): + _default = os.path.normpath(sys.executable) + return os.environ.get('__PYVENV_LAUNCHER__', _default) + + @classmethod + def from_param(cls, param): + """ + Construct a CommandSpec from a parameter to build_scripts, which may + be None. + """ + if isinstance(param, cls): + return param + if isinstance(param, list): + return cls(param) + if param is None: + return cls.from_environment() + # otherwise, assume it's a string. + return cls.from_string(param) + + @classmethod + def from_environment(cls): + return cls([cls._sys_executable()]) + + @classmethod + def from_string(cls, string): + """ + Construct a command spec from a simple string representing a command + line parseable by shlex.split. + """ + items = shlex.split(string, **cls.split_args) + return cls(items) + + def install_options(self, script_text): + self.options = shlex.split(self._extract_options(script_text)) + cmdline = subprocess.list2cmdline(self) + if not isascii(cmdline): + self.options[:0] = ['-x'] + + @staticmethod + def _extract_options(orig_script): + """ + Extract any options from the first line of the script. + """ + first = (orig_script + '\n').splitlines()[0] + match = _first_line_re().match(first) + options = match.group(1) or '' if match else '' + return options.strip() + + def as_header(self): + return self._render(self + list(self.options)) + + @staticmethod + def _strip_quotes(item): + _QUOTES = '"\'' + for q in _QUOTES: + if item.startswith(q) and item.endswith(q): + return item[1:-1] + return item + + @staticmethod + def _render(items): + cmdline = subprocess.list2cmdline( + CommandSpec._strip_quotes(item.strip()) for item in items) + return '#!' + cmdline + '\n' + + +# For pbr compat; will be removed in a future version. +sys_executable = CommandSpec._sys_executable() + + +class WindowsCommandSpec(CommandSpec): + split_args = dict(posix=False) + + +class ScriptWriter(object): + """ + Encapsulates behavior around writing entry point scripts for console and + gui apps. + """ + + template = textwrap.dedent(""" + # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r + __requires__ = %(spec)r + import re + import sys + from pkg_resources import load_entry_point + + if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point(%(spec)r, %(group)r, %(name)r)() + ) + """).lstrip() + + command_spec_class = CommandSpec + + @classmethod + def get_script_args(cls, dist, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_args", DeprecationWarning) + writer = (WindowsScriptWriter if wininst else ScriptWriter).best() + header = cls.get_script_header("", executable, wininst) + return writer.get_args(dist, header) + + @classmethod + def get_script_header(cls, script_text, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_header", DeprecationWarning) + if wininst: + executable = "python.exe" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + @classmethod + def get_args(cls, dist, header=None): + """ + Yield write_script() argument tuples for a distribution's + console_scripts and gui_scripts entry points. + """ + if header is None: + header = cls.get_header() + spec = str(dist.as_requirement()) + for type_ in 'console', 'gui': + group = type_ + '_scripts' + for name, ep in dist.get_entry_map(group).items(): + cls._ensure_safe_name(name) + script_text = cls.template % locals() + args = cls._get_script_args(type_, name, header, script_text) + for res in args: + yield res + + @staticmethod + def _ensure_safe_name(name): + """ + Prevent paths in *_scripts entry point names. + """ + has_path_sep = re.search(r'[\\/]', name) + if has_path_sep: + raise ValueError("Path separators not allowed in script names") + + @classmethod + def get_writer(cls, force_windows): + # for backward compatibility + warnings.warn("Use best", DeprecationWarning) + return WindowsScriptWriter.best() if force_windows else cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter for this environment. + """ + if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): + return WindowsScriptWriter.best() + else: + return cls + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + # Simply write the stub with no extension. + yield (name, header + script_text) + + @classmethod + def get_header(cls, script_text="", executable=None): + """Create a #! line, getting options (if any) from script_text""" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + +class WindowsScriptWriter(ScriptWriter): + command_spec_class = WindowsCommandSpec + + @classmethod + def get_writer(cls): + # for backward compatibility + warnings.warn("Use best", DeprecationWarning) + return cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter suitable for Windows + """ + writer_lookup = dict( + executable=WindowsExecutableLauncherWriter, + natural=cls, + ) + # for compatibility, use the executable launcher by default + launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') + return writer_lookup[launcher] + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + "For Windows, add a .py extension" + ext = dict(console='.pya', gui='.pyw')[type_] + if ext not in os.environ['PATHEXT'].lower().split(';'): + msg = ( + "{ext} not listed in PATHEXT; scripts will not be " + "recognized as executables." + ).format(**locals()) + warnings.warn(msg, UserWarning) + old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] + old.remove(ext) + header = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield name + ext, header + script_text, 't', blockers + + @classmethod + def _adjust_header(cls, type_, orig_header): + """ + Make sure 'pythonw' is used for gui and and 'python' is used for + console (regardless of what sys.executable is). + """ + pattern = 'pythonw.exe' + repl = 'python.exe' + if type_ == 'gui': + pattern, repl = repl, pattern + pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) + new_header = pattern_ob.sub(string=orig_header, repl=repl) + return new_header if cls._use_header(new_header) else orig_header + + @staticmethod + def _use_header(new_header): + """ + Should _adjust_header use the replaced header? + + On non-windows systems, always use. On + Windows systems, only use the replaced header if it resolves + to an executable on the system. + """ + clean_header = new_header[2:-1].strip('"') + return sys.platform != 'win32' or find_executable(clean_header) + + +class WindowsExecutableLauncherWriter(WindowsScriptWriter): + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + """ + For Windows, add a .py extension and an .exe launcher + """ + if type_ == 'gui': + launcher_type = 'gui' + ext = '-script.pyw' + old = ['.pyw'] + else: + launcher_type = 'cli' + ext = '-script.py' + old = ['.py', '.pyc', '.pyo'] + hdr = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield (name + ext, hdr + script_text, 't', blockers) + yield ( + name + '.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode + ) + if not is_64bit(): + # install a manifest for the launcher to prevent Windows + # from detecting it as an installer (which it will for + # launchers like easy_install.exe). Consider only + # adding a manifest for launchers detected as installers. + # See Distribute #143 for details. + m_name = name + '.exe.manifest' + yield (m_name, load_launcher_manifest(name), 't') + + +# for backward-compatibility +get_script_args = ScriptWriter.get_script_args +get_script_header = ScriptWriter.get_script_header + + +def get_win_launcher(type): + """ + Load the Windows launcher (executable) suitable for launching a script. + + `type` should be either 'cli' or 'gui' + + Returns the executable as a byte string. + """ + launcher_fn = '%s.exe' % type + if is_64bit(): + launcher_fn = launcher_fn.replace(".", "-64.") + else: + launcher_fn = launcher_fn.replace(".", "-32.") + return resource_string('setuptools', launcher_fn) + + +def load_launcher_manifest(name): + manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') + if six.PY2: + return manifest % vars() + else: + return manifest.decode('utf-8') % vars() + + +def rmtree(path, ignore_errors=False, onerror=auto_chmod): + return shutil.rmtree(path, ignore_errors, onerror) + + +def current_umask(): + tmp = os.umask(0o022) + os.umask(tmp) + return tmp + + +def bootstrap(): + # This function is called when setuptools*.egg is run using /bin/sh + import setuptools + + argv0 = os.path.dirname(setuptools.__path__[0]) + sys.argv[0] = argv0 + sys.argv.append(argv0) + main() + + +def main(argv=None, **kw): + from setuptools import setup + from setuptools.dist import Distribution + + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self, *args, **kw): + with _patch_usage(): + Distribution._show_help(self, *args, **kw) + + if argv is None: + argv = sys.argv[1:] + + with _patch_usage(): + setup( + script_args=['-q', 'easy_install', '-v'] + argv, + script_name=sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, + **kw + ) + + +@contextlib.contextmanager +def _patch_usage(): + import distutils.core + USAGE = textwrap.dedent(""" + usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help + """).lstrip() + + def gen_usage(script_name): + return USAGE % dict( + script=os.path.basename(script_name), + ) + + saved = distutils.core.gen_usage + distutils.core.gen_usage = gen_usage + try: + yield + finally: + distutils.core.gen_usage = saved diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/egg_info.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/egg_info.py new file mode 100644 index 0000000..bc742e3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,692 @@ +"""setuptools.command.egg_info + +Create a distribution's .egg-info directory and contents""" + +from distutils.filelist import FileList as _FileList +from distutils.errors import DistutilsInternalError +from distutils.util import convert_path +from distutils import log +import distutils.errors +import distutils.filelist +import os +import re +import sys +import io +import warnings +import time +import collections + +from setuptools.extern import six +from setuptools.extern.six.moves import map + +from setuptools import Command +from setuptools.command.sdist import sdist +from setuptools.command.sdist import walk_revctrl +from setuptools.command.setopt import edit_config +from setuptools.command import bdist_egg +from pkg_resources import ( + parse_requirements, safe_name, parse_version, + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) +import setuptools.unicode_utils as unicode_utils +from setuptools.glob import glob + +from pkg_resources.extern import packaging + + +def translate_pattern(glob): + """ + Translate a file path glob like '*.txt' in to a regular expression. + This differs from fnmatch.translate which allows wildcards to match + directory separators. It also knows about '**/' which matches any number of + directories. + """ + pat = '' + + # This will split on '/' within [character classes]. This is deliberate. + chunks = glob.split(os.path.sep) + + sep = re.escape(os.sep) + valid_char = '[^%s]' % (sep,) + + for c, chunk in enumerate(chunks): + last_chunk = c == len(chunks) - 1 + + # Chunks that are a literal ** are globstars. They match anything. + if chunk == '**': + if last_chunk: + # Match anything if this is the last component + pat += '.*' + else: + # Match '(name/)*' + pat += '(?:%s+%s)*' % (valid_char, sep) + continue # Break here as the whole path component has been handled + + # Find any special characters in the remainder + i = 0 + chunk_len = len(chunk) + while i < chunk_len: + char = chunk[i] + if char == '*': + # Match any number of name characters + pat += valid_char + '*' + elif char == '?': + # Match a name character + pat += valid_char + elif char == '[': + # Character class + inner_i = i + 1 + # Skip initial !/] chars + if inner_i < chunk_len and chunk[inner_i] == '!': + inner_i = inner_i + 1 + if inner_i < chunk_len and chunk[inner_i] == ']': + inner_i = inner_i + 1 + + # Loop till the closing ] is found + while inner_i < chunk_len and chunk[inner_i] != ']': + inner_i = inner_i + 1 + + if inner_i >= chunk_len: + # Got to the end of the string without finding a closing ] + # Do not treat this as a matching group, but as a literal [ + pat += re.escape(char) + else: + # Grab the insides of the [brackets] + inner = chunk[i + 1:inner_i] + char_class = '' + + # Class negation + if inner[0] == '!': + char_class = '^' + inner = inner[1:] + + char_class += re.escape(inner) + pat += '[%s]' % (char_class,) + + # Skip to the end ] + i = inner_i + else: + pat += re.escape(char) + i += 1 + + # Join each chunk with the dir separator + if not last_chunk: + pat += sep + + return re.compile(pat + r'\Z(?ms)') + + +class egg_info(Command): + description = "create a distribution's .egg-info directory" + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), + ('tag-build=', 'b', "Specify explicit tag to add to version number"), + ('no-date', 'D', "Don't include date stamp [default]"), + ] + + boolean_options = ['tag-date'] + negative_opt = { + 'no-date': 'tag-date', + } + + def initialize_options(self): + self.egg_name = None + self.egg_version = None + self.egg_base = None + self.egg_info = None + self.tag_build = None + self.tag_date = 0 + self.broken_egg_info = False + self.vtags = None + + #################################### + # allow the 'tag_svn_revision' to be detected and + # set, supporting sdists built on older Setuptools. + @property + def tag_svn_revision(self): + pass + + @tag_svn_revision.setter + def tag_svn_revision(self, value): + pass + #################################### + + def save_version_info(self, filename): + """ + Materialize the value of date into the + build tag. Install build keys in a deterministic order + to avoid arbitrary reordering on subsequent builds. + """ + # python 2.6 compatibility + odict = getattr(collections, 'OrderedDict', dict) + egg_info = odict() + # follow the order these keys would have been added + # when PYTHONHASHSEED=0 + egg_info['tag_build'] = self.tags() + egg_info['tag_date'] = 0 + edit_config(filename, dict(egg_info=egg_info)) + + def finalize_options(self): + self.egg_name = safe_name(self.distribution.get_name()) + self.vtags = self.tags() + self.egg_version = self.tagged_version() + + parsed_version = parse_version(self.egg_version) + + try: + is_version = isinstance(parsed_version, packaging.version.Version) + spec = ( + "%s==%s" if is_version else "%s===%s" + ) + list( + parse_requirements(spec % (self.egg_name, self.egg_version)) + ) + except ValueError: + raise distutils.errors.DistutilsOptionError( + "Invalid distribution name or version syntax: %s-%s" % + (self.egg_name, self.egg_version) + ) + + if self.egg_base is None: + dirs = self.distribution.package_dir + self.egg_base = (dirs or {}).get('', os.curdir) + + self.ensure_dirname('egg_base') + self.egg_info = to_filename(self.egg_name) + '.egg-info' + if self.egg_base != os.curdir: + self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: + self.check_broken_egg_info() + + # Set package version for the benefit of dumber commands + # (e.g. sdist, bdist_wininst, etc.) + # + self.distribution.metadata.version = self.egg_version + + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key == self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + + def write_or_delete_file(self, what, filename, data, force=False): + """Write `data` to `filename` or delete if empty + + If `data` is non-empty, this routine is the same as ``write_file()``. + If `data` is empty but not ``None``, this is the same as calling + ``delete_file(filename)`. If `data` is ``None``, then this is a no-op + unless `filename` exists, in which case a warning is issued about the + orphaned file (if `force` is false), or deleted (if `force` is true). + """ + if data: + self.write_file(what, filename, data) + elif os.path.exists(filename): + if data is None and not force: + log.warn( + "%s not set in setup(), but %s exists", what, filename + ) + return + else: + self.delete_file(filename) + + def write_file(self, what, filename, data): + """Write `data` to `filename` (if not a dry run) after announcing it + + `what` is used in a log message to identify what is being written + to the file. + """ + log.info("writing %s to %s", what, filename) + if six.PY3: + data = data.encode("utf-8") + if not self.dry_run: + f = open(filename, 'wb') + f.write(data) + f.close() + + def delete_file(self, filename): + """Delete `filename` (if not a dry run) after announcing it""" + log.info("deleting %s", filename) + if not self.dry_run: + os.unlink(filename) + + def tagged_version(self): + version = self.distribution.get_version() + # egg_info may be called more than once for a distribution, + # in which case the version string already contains all tags. + if self.vtags and version.endswith(self.vtags): + return safe_version(version) + return safe_version(version + self.vtags) + + def run(self): + self.mkpath(self.egg_info) + installer = self.distribution.fetch_build_egg + for ep in iter_entry_points('egg_info.writers'): + ep.require(installer=installer) + writer = ep.resolve() + writer(self, ep.name, os.path.join(self.egg_info, ep.name)) + + # Get rid of native_libs.txt if it was put there by older bdist_egg + nl = os.path.join(self.egg_info, "native_libs.txt") + if os.path.exists(nl): + self.delete_file(nl) + + self.find_sources() + + def tags(self): + version = '' + if self.tag_build: + version += self.tag_build + if self.tag_date: + version += time.strftime("-%Y%m%d") + return version + + def find_sources(self): + """Generate SOURCES.txt manifest file""" + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") + mm = manifest_maker(self.distribution) + mm.manifest = manifest_filename + mm.run() + self.filelist = mm.filelist + + def check_broken_egg_info(self): + bei = self.egg_name + '.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-" * 78 + '\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n' + '-' * 78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now + + +class FileList(_FileList): + # Implementations of the various MANIFEST.in commands + + def process_template_line(self, line): + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + self.debug_print("include " + ' '.join(patterns)) + for pattern in patterns: + if not self.include(pattern): + log.warn("warning: no files found matching '%s'", pattern) + + elif action == 'exclude': + self.debug_print("exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.exclude(pattern): + log.warn(("warning: no previously-included files " + "found matching '%s'"), pattern) + + elif action == 'global-include': + self.debug_print("global-include " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_include(pattern): + log.warn(("warning: no files found matching '%s' " + "anywhere in distribution"), pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_exclude(pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found anywhere in distribution"), + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_include(dir, pattern): + log.warn(("warning: no files found matching '%s' " + "under directory '%s'"), + pattern, dir) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_exclude(dir, pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found under directory '%s'"), + pattern, dir) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.graft(dir_pattern): + log.warn("warning: no directories found matching '%s'", + dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.prune(dir_pattern): + log.warn(("no previously-included directories found " + "matching '%s'"), dir_pattern) + + else: + raise DistutilsInternalError( + "this cannot happen: invalid action '%s'" % action) + + def _remove_files(self, predicate): + """ + Remove all files from the file list that match the predicate. + Return True if any matching files were removed + """ + found = False + for i in range(len(self.files) - 1, -1, -1): + if predicate(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + found = True + return found + + def include(self, pattern): + """Include files that match 'pattern'.""" + found = [f for f in glob(pattern) if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def exclude(self, pattern): + """Exclude files that match 'pattern'.""" + match = translate_pattern(pattern) + return self._remove_files(match.match) + + def recursive_include(self, dir, pattern): + """ + Include all files anywhere in 'dir/' that match the pattern. + """ + full_pattern = os.path.join(dir, '**', pattern) + found = [f for f in glob(full_pattern, recursive=True) + if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def recursive_exclude(self, dir, pattern): + """ + Exclude any file anywhere in 'dir/' that match the pattern. + """ + match = translate_pattern(os.path.join(dir, '**', pattern)) + return self._remove_files(match.match) + + def graft(self, dir): + """Include all files from 'dir/'.""" + found = distutils.filelist.findall(dir) + self.extend(found) + return bool(found) + + def prune(self, dir): + """Filter out files from 'dir/'.""" + match = translate_pattern(os.path.join(dir, '**')) + return self._remove_files(match.match) + + def global_include(self, pattern): + """ + Include all files anywhere in the current directory that match the + pattern. This is very inefficient on large file trees. + """ + if self.allfiles is None: + self.findall() + match = translate_pattern(os.path.join('**', pattern)) + found = [f for f in self.allfiles if match.match(f)] + self.extend(found) + return bool(found) + + def global_exclude(self, pattern): + """ + Exclude all files anywhere that match the pattern. + """ + match = translate_pattern(os.path.join('**', pattern)) + return self._remove_files(match.match) + + def append(self, item): + if item.endswith('\r'): # Fix older sdists built on Windows + item = item[:-1] + path = convert_path(item) + + if self._safe_path(path): + self.files.append(path) + + def extend(self, paths): + self.files.extend(filter(self._safe_path, paths)) + + def _repair(self): + """ + Replace self.files with only safe paths + + Because some owners of FileList manipulate the underlying + ``files`` attribute directly, this method must be called to + repair those paths. + """ + self.files = list(filter(self._safe_path, self.files)) + + def _safe_path(self, path): + enc_warn = "'%s' not %s encodable -- skipping" + + # To avoid accidental trans-codings errors, first to unicode + u_path = unicode_utils.filesys_decode(path) + if u_path is None: + log.warn("'%s' in unexpected encoding -- skipping" % path) + return False + + # Must ensure utf-8 encodability + utf8_path = unicode_utils.try_encode(u_path, "utf-8") + if utf8_path is None: + log.warn(enc_warn, path, 'utf-8') + return False + + try: + # accept is either way checks out + if os.path.exists(u_path) or os.path.exists(utf8_path): + return True + # this will catch any encode errors decoding u_path + except UnicodeEncodeError: + log.warn(enc_warn, path, sys.getfilesystemencoding()) + + +class manifest_maker(sdist): + template = "MANIFEST.in" + + def initialize_options(self): + self.use_defaults = 1 + self.prune = 1 + self.manifest_only = 1 + self.force_manifest = 1 + + def finalize_options(self): + pass + + def run(self): + self.filelist = FileList() + if not os.path.exists(self.manifest): + self.write_manifest() # it must exist so it'll get in the list + self.add_defaults() + if os.path.exists(self.template): + self.read_template() + self.prune_file_list() + self.filelist.sort() + self.filelist.remove_duplicates() + self.write_manifest() + + def _manifest_normalize(self, path): + path = unicode_utils.filesys_decode(path) + return path.replace(os.sep, '/') + + def write_manifest(self): + """ + Write the file list in 'self.filelist' to the manifest file + named by 'self.manifest'. + """ + self.filelist._repair() + + # Now _repairs should encodability, but not unicode + files = [self._manifest_normalize(f) for f in self.filelist.files] + msg = "writing manifest file '%s'" % self.manifest + self.execute(write_file, (self.manifest, files), msg) + + def warn(self, msg): + if not self._should_suppress_warning(msg): + sdist.warn(self, msg) + + @staticmethod + def _should_suppress_warning(msg): + """ + suppress missing-file warnings from sdist + """ + return re.match(r"standard file .*not found", msg) + + def add_defaults(self): + sdist.add_defaults(self) + self.filelist.append(self.template) + self.filelist.append(self.manifest) + rcfiles = list(walk_revctrl()) + if rcfiles: + self.filelist.extend(rcfiles) + elif os.path.exists(self.manifest): + self.read_manifest() + ei_cmd = self.get_finalized_command('egg_info') + self.filelist.graft(ei_cmd.egg_info) + + def prune_file_list(self): + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + self.filelist.prune(build.build_base) + self.filelist.prune(base_dir) + sep = re.escape(os.sep) + self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, + is_regex=1) + + +def write_file(filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + contents = "\n".join(contents) + + # assuming the contents has been vetted for utf-8 encoding + contents = contents.encode("utf-8") + + with open(filename, "wb") as f: # always write POSIX-style manifest + f.write(contents) + + +def write_pkg_info(cmd, basename, filename): + log.info("writing %s", filename) + if not cmd.dry_run: + metadata = cmd.distribution.metadata + metadata.version, oldver = cmd.egg_version, metadata.version + metadata.name, oldname = cmd.egg_name, metadata.name + try: + # write unescaped data to PKG-INFO, so older pkg_resources + # can still parse it + metadata.write_pkg_info(cmd.egg_info) + finally: + metadata.name, metadata.version = oldname, oldver + + safe = getattr(cmd.distribution, 'zip_safe', None) + + bdist_egg.write_safety_flag(cmd.egg_info, safe) + + +def warn_depends_obsolete(cmd, basename, filename): + if os.path.exists(filename): + log.warn( + "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + +def _write_requirements(stream, reqs): + lines = yield_lines(reqs or ()) + append_cr = lambda line: line + '\n' + lines = map(append_cr, sorted(lines)) + stream.writelines(lines) + + +def write_requirements(cmd, basename, filename): + dist = cmd.distribution + data = six.StringIO() + _write_requirements(data, dist.install_requires) + extras_require = dist.extras_require or {} + for extra in sorted(extras_require): + data.write('\n[{extra}]\n'.format(**vars())) + _write_requirements(data, extras_require[extra]) + cmd.write_or_delete_file("requirements", filename, data.getvalue()) + + +def write_setup_requirements(cmd, basename, filename): + data = StringIO() + _write_requirements(data, cmd.distribution.setup_requires) + cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) + + +def write_toplevel_names(cmd, basename, filename): + pkgs = dict.fromkeys( + [ + k.split('.', 1)[0] + for k in cmd.distribution.iter_distribution_names() + ] + ) + cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') + + +def overwrite_arg(cmd, basename, filename): + write_arg(cmd, basename, filename, True) + + +def write_arg(cmd, basename, filename, force=False): + argname = os.path.splitext(basename)[0] + value = getattr(cmd.distribution, argname, None) + if value is not None: + value = '\n'.join(value) + '\n' + cmd.write_or_delete_file(argname, filename, value, force) + + +def write_entries(cmd, basename, filename): + ep = cmd.distribution.entry_points + + if isinstance(ep, six.string_types) or ep is None: + data = ep + elif ep is not None: + data = [] + for section, contents in sorted(ep.items()): + if not isinstance(contents, six.string_types): + contents = EntryPoint.parse_group(section, contents) + contents = '\n'.join(sorted(map(str, contents.values()))) + data.append('[%s]\n%s\n\n' % (section, contents)) + data = ''.join(data) + + cmd.write_or_delete_file('entry points', filename, data, True) + + +def get_pkg_info_revision(): + """ + Get a -r### off of PKG-INFO Version in case this is an sdist of + a subversion revision. + """ + warnings.warn("get_pkg_info_revision is deprecated.", DeprecationWarning) + if os.path.exists('PKG-INFO'): + with io.open('PKG-INFO') as f: + for line in f: + match = re.match(r"Version:.*-r(\d+)\s*$", line) + if match: + return int(match.group(1)) + return 0 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install.py new file mode 100644 index 0000000..31a5ddb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install.py @@ -0,0 +1,125 @@ +from distutils.errors import DistutilsArgError +import inspect +import glob +import warnings +import platform +import distutils.command.install as orig + +import setuptools + +# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for +# now. See https://github.com/pypa/setuptools/issues/199/ +_install = orig.install + + +class install(orig.install): + """Use easy_install to install the package, w/dependencies""" + + user_options = orig.install.user_options + [ + ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), + ] + boolean_options = orig.install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + new_commands = [ + ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), + ] + _nc = dict(new_commands) + + def initialize_options(self): + orig.install.initialize_options(self) + self.old_and_unmanageable = None + self.single_version_externally_managed = None + + def finalize_options(self): + orig.install.finalize_options(self) + if self.root: + self.single_version_externally_managed = True + elif self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + + def handle_extra_path(self): + if self.root or self.single_version_externally_managed: + # explicit backward-compatibility mode, allow extra_path to work + return orig.install.handle_extra_path(self) + + # Ignore extra_path when installing an egg (or being run by another + # command without --root or --single-version-externally-managed + self.path_file = None + self.extra_dirs = '' + + def run(self): + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: + return orig.install.run(self) + + if not self._called_from_setup(inspect.currentframe()): + # Run in backward-compatibility mode to support bdist_* commands. + orig.install.run(self) + else: + self.do_egg_install() + + @staticmethod + def _called_from_setup(run_frame): + """ + Attempt to detect whether run() was called from setup() or by another + command. If called by setup(), the parent caller will be the + 'run_command' method in 'distutils.dist', and *its* caller will be + the 'run_commands' method. If called any other way, the + immediate caller *might* be 'run_command', but it won't have been + called by 'run_commands'. Return True in that case or if a call stack + is unavailable. Return False otherwise. + """ + if run_frame is None: + msg = "Call stack not available. bdist_* commands may fail." + warnings.warn(msg) + if platform.python_implementation() == 'IronPython': + msg = "For best results, pass -X:Frames to enable call stack." + warnings.warn(msg) + return True + res = inspect.getouterframes(run_frame)[2] + caller, = res[:1] + info = inspect.getframeinfo(caller) + caller_module = caller.f_globals.get('__name__', '') + return ( + caller_module == 'distutils.dist' + and info.function == 'run_commands' + ) + + def do_egg_install(self): + + easy_install = self.distribution.get_command_class('easy_install') + + cmd = easy_install( + self.distribution, args="x", root=self.root, record=self.record, + ) + cmd.ensure_finalized() # finalize before bdist_egg munges install cmd + cmd.always_copy_from = '.' # make sure local-dir eggs get installed + + # pick up setup-dir .egg files only: no .egg-info + cmd.package_index.scan(glob.glob('*.egg')) + + self.run_command('bdist_egg') + args = [self.distribution.get_command_obj('bdist_egg').egg_output] + + if setuptools.bootstrap_install_from: + # Bootstrap self-installation of setuptools + args.insert(0, setuptools.bootstrap_install_from) + + cmd.args = args + cmd.run() + setuptools.bootstrap_install_from = None + + +# XXX Python 3.1 doesn't see _nc if this is inside the class +install.sub_commands = ( + [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + + install.new_commands +) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_egg_info.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 0000000..5f405bc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,82 @@ +from distutils import log, dir_util +import os, sys + +from setuptools import Command +from setuptools import namespaces +from setuptools.archive_util import unpack_archive +import pkg_resources + + +class install_egg_info(namespaces.Installer, Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + self.install_layout = None + self.prefix_option = None + + def finalize_options(self): + self.set_undefined_options('install_lib', + ('install_dir', 'install_dir')) + self.set_undefined_options('install',('install_layout','install_layout')) + if sys.hexversion > 0x2060000: + self.set_undefined_options('install',('prefix_option','prefix_option')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name() + '.egg-info' + + if self.install_layout: + if not self.install_layout.lower() in ['deb']: + raise DistutilsOptionError("unknown value for --install-layout") + self.install_layout = self.install_layout.lower() + basename = basename.replace('-py%s' % pkg_resources.PY_MAJOR, '') + elif self.prefix_option or 'real_prefix' in sys.__dict__: + # don't modify for virtualenv + pass + else: + basename = basename.replace('-py%s' % pkg_resources.PY_MAJOR, '') + + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + self.outputs = [] + + def run(self): + self.run_command('egg_info') + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink, (self.target,), "Removing " + self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute( + self.copytree, (), "Copying %s to %s" % (self.source, self.target) + ) + self.install_namespaces() + + def get_outputs(self): + return self.outputs + + def copytree(self): + # Copy the .egg-info tree to site-packages + def skimmer(src, dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/', 'CVS/': + if src.startswith(skip) or '/' + skip in src: + return None + if self.install_layout and self.install_layout in ['deb'] and src.startswith('SOURCES.txt'): + log.info("Skipping SOURCES.txt") + return None + self.outputs.append(dst) + log.debug("Copying %s to %s", src, dst) + return dst + + unpack_archive(self.source, self.target, skimmer) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_lib.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_lib.py new file mode 100644 index 0000000..578e002 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,148 @@ +import os +import sys +import imp +from itertools import product, starmap +import distutils.command.install_lib as orig + + +class install_lib(orig.install_lib): + """Don't add compiled flags to filenames of non-Python files""" + + def initialize_options(self): + orig.install_lib.initialize_options(self) + self.multiarch = None + self.install_layout = None + + def finalize_options(self): + orig.install_lib.finalize_options(self) + self.set_undefined_options('install',('install_layout','install_layout')) + if self.install_layout == 'deb' and sys.version_info[:2] >= (3, 3): + import sysconfig + self.multiarch = sysconfig.get_config_var('MULTIARCH') + + def run(self): + self.build() + outfiles = self.install() + if outfiles is not None: + # always compile, in case we have any extension stubs to deal with + self.byte_compile(outfiles) + + def get_exclusions(self): + """ + Return a collections.Sized collections.Container of paths to be + excluded for single_version_externally_managed installations. + """ + all_packages = ( + pkg + for ns_pkg in self._get_SVEM_NSPs() + for pkg in self._all_packages(ns_pkg) + ) + + excl_specs = product(all_packages, self._gen_exclusion_paths()) + return set(starmap(self._exclude_pkg_path, excl_specs)) + + def _exclude_pkg_path(self, pkg, exclusion_path): + """ + Given a package name and exclusion path within that package, + compute the full exclusion path. + """ + parts = pkg.split('.') + [exclusion_path] + return os.path.join(self.install_dir, *parts) + + @staticmethod + def _all_packages(pkg_name): + """ + >>> list(install_lib._all_packages('foo.bar.baz')) + ['foo.bar.baz', 'foo.bar', 'foo'] + """ + while pkg_name: + yield pkg_name + pkg_name, sep, child = pkg_name.rpartition('.') + + def _get_SVEM_NSPs(self): + """ + Get namespace packages (list) but only for + single_version_externally_managed installations and empty otherwise. + """ + # TODO: is it necessary to short-circuit here? i.e. what's the cost + # if get_finalized_command is called even when namespace_packages is + # False? + if not self.distribution.namespace_packages: + return [] + + install_cmd = self.get_finalized_command('install') + svem = install_cmd.single_version_externally_managed + + return self.distribution.namespace_packages if svem else [] + + @staticmethod + def _gen_exclusion_paths(): + """ + Generate file paths to be excluded for namespace packages (bytecode + cache files). + """ + # always exclude the package module itself + yield '__init__.py' + + yield '__init__.pyc' + yield '__init__.pyo' + + if not hasattr(imp, 'get_tag'): + return + + base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) + yield base + '.pyc' + yield base + '.pyo' + yield base + '.opt-1.pyc' + yield base + '.opt-2.pyc' + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + import distutils.dir_util + distutils.dir_util._multiarch = self.multiarch + return orig.install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + if self.multiarch: + import sysconfig + ext_suffix = sysconfig.get_config_var ('EXT_SUFFIX') + if ext_suffix.endswith(self.multiarch + ext_suffix[-3:]): + new_suffix = None + else: + new_suffix = "%s-%s%s" % (ext_suffix[:-3], self.multiarch, ext_suffix[-3:]) + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)", + dst) + return False + + if self.multiarch and new_suffix and dst.endswith(ext_suffix) and not dst.endswith(new_suffix): + dst = dst.replace(ext_suffix, new_suffix) + log.info("renaming extension to %s", os.path.basename(dst)) + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = orig.install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_scripts.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 0000000..1623427 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,65 @@ +from distutils import log +import distutils.command.install_scripts as orig +import os +import sys + +from pkg_resources import Distribution, PathMetadata, ensure_directory + + +class install_scripts(orig.install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def initialize_options(self): + orig.install_scripts.initialize_options(self) + self.no_ep = False + + def run(self): + import setuptools.command.easy_install as ei + + self.run_command("egg_info") + if self.distribution.scripts: + orig.install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] + if self.no_ep: + # don't install entry point scripts into .egg file! + return + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + bs_cmd = self.get_finalized_command('build_scripts') + exec_param = getattr(bs_cmd, 'executable', None) + bw_cmd = self.get_finalized_command("bdist_wininst") + is_wininst = getattr(bw_cmd, '_is_running', False) + writer = ei.ScriptWriter + if is_wininst: + exec_param = "python.exe" + writer = ei.WindowsScriptWriter + if exec_param == sys.executable: + # In case the path to the Python executable contains a space, wrap + # it so it's not split up. + exec_param = [exec_param] + # resolve the writer to the environment + writer = writer.best() + cmd = writer.command_spec_class.best().from_param(exec_param) + for args in writer.get_args(dist, cmd.as_header()): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + from setuptools.command.easy_install import chmod, current_umask + + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target, "w" + mode) + f.write(contents) + f.close() + chmod(target, 0o777 - mask) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/launcher manifest.xml b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 0000000..5972a96 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/py36compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/py36compat.py new file mode 100644 index 0000000..61063e7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +import os +from glob import glob +from distutils.util import convert_path +from distutils.command import sdist + +from setuptools.extern.six.moves import filter + + +class sdist_add_defaults: + """ + Mix-in providing forward-compatibility for functionality as found in + distutils on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. Instead, override in the subclass. + """ + + def add_defaults(self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all files pointed by package_data (build_py) + - all files defined in data_files. + - all files defined as scripts. + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + self._add_defaults_standards() + self._add_defaults_optional() + self._add_defaults_python() + self._add_defaults_data_files() + self._add_defaults_ext() + self._add_defaults_c_libs() + self._add_defaults_scripts() + + @staticmethod + def _cs_path_exists(fspath): + """ + Case-sensitive path existence check + + >>> sdist_add_defaults._cs_path_exists(__file__) + True + >>> sdist_add_defaults._cs_path_exists(__file__.upper()) + False + """ + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) + + def _add_defaults_standards(self): + standards = [self.READMES, self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = False + for fn in alts: + if self._cs_path_exists(fn): + got_it = True + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if self._cs_path_exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + def _add_defaults_optional(self): + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + self.filelist.extend(files) + + def _add_defaults_python(self): + # build_py is used to get: + # - python modules + # - files defined in package_data + build_py = self.get_finalized_command('build_py') + + # getting python files + if self.distribution.has_pure_modules(): + self.filelist.extend(build_py.get_source_files()) + + # getting package_data files + # (computed in build_py.data_files by build_py.finalize_options) + for pkg, src_dir, build_dir, filenames in build_py.data_files: + for filename in filenames: + self.filelist.append(os.path.join(src_dir, filename)) + + def _add_defaults_data_files(self): + # getting distribution.data_files + if self.distribution.has_data_files(): + for item in self.distribution.data_files: + if isinstance(item, str): + # plain file + item = convert_path(item) + if os.path.isfile(item): + self.filelist.append(item) + else: + # a (dirname, filenames) tuple + dirname, filenames = item + for f in filenames: + f = convert_path(f) + if os.path.isfile(f): + self.filelist.append(f) + + def _add_defaults_ext(self): + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + def _add_defaults_c_libs(self): + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + def _add_defaults_scripts(self): + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + +if hasattr(sdist.sdist, '_add_defaults_standards'): + # disable the functionality already available upstream + class sdist_add_defaults: + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/register.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/register.py new file mode 100644 index 0000000..8d6336a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/register.py @@ -0,0 +1,10 @@ +import distutils.command.register as orig + + +class register(orig.register): + __doc__ = orig.register.__doc__ + + def run(self): + # Make sure that we are using valid current name/version info + self.run_command('egg_info') + orig.register.run(self) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/rotate.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/rotate.py new file mode 100644 index 0000000..b89353f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/rotate.py @@ -0,0 +1,66 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import shutil + +from setuptools.extern import six + +from setuptools import Command + + +class rotate(Command): + """Delete older distributions""" + + description = "delete older distributions, keeping N newest files" + user_options = [ + ('match=', 'm', "patterns to match (required)"), + ('dist-dir=', 'd', "directory where the distributions are"), + ('keep=', 'k', "number of matching distributions to keep"), + ] + + boolean_options = [] + + def initialize_options(self): + self.match = None + self.dist_dir = None + self.keep = None + + def finalize_options(self): + if self.match is None: + raise DistutilsOptionError( + "Must specify one or more (comma-separated) match patterns " + "(e.g. '.zip' or '.egg')" + ) + if self.keep is None: + raise DistutilsOptionError("Must specify number of files to keep") + try: + self.keep = int(self.keep) + except ValueError: + raise DistutilsOptionError("--keep must be an integer") + if isinstance(self.match, six.string_types): + self.match = [ + convert_path(p.strip()) for p in self.match.split(',') + ] + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + def run(self): + self.run_command("egg_info") + from glob import glob + + for pattern in self.match: + pattern = self.distribution.get_name() + '*' + pattern + files = glob(os.path.join(self.dist_dir, pattern)) + files = [(os.path.getmtime(f), f) for f in files] + files.sort() + files.reverse() + + log.info("%d file(s) matching %s", len(files), pattern) + files = files[self.keep:] + for (t, f) in files: + log.info("Deleting %s", f) + if not self.dry_run: + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.unlink(f) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/saveopts.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/saveopts.py new file mode 100644 index 0000000..611cec5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,22 @@ +from setuptools.command.setopt import edit_config, option_base + + +class saveopts(option_base): + """Save command-line options to a file""" + + description = "save supplied options to setup.cfg or other config file" + + def run(self): + dist = self.distribution + settings = {} + + for cmd in dist.command_options: + + if cmd == 'saveopts': + continue # don't save our own options! + + for opt, (src, val) in dist.get_option_dict(cmd).items(): + if src == "command line": + settings.setdefault(cmd, {})[opt] = val + + edit_config(self.filename, settings, self.dry_run) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/sdist.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/sdist.py new file mode 100644 index 0000000..84e29a1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/sdist.py @@ -0,0 +1,206 @@ +from distutils import log +import distutils.command.sdist as orig +import os +import sys +import io +import contextlib + +from setuptools.extern import six + +from .py36compat import sdist_add_defaults + +import pkg_resources + +_default_revctrl = list + + +def walk_revctrl(dirname=''): + """Find all files under revision control""" + for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): + for item in ep.load()(dirname): + yield item + + +class sdist(sdist_add_defaults, orig.sdist): + """Smart sdist that finds anything supported by revision control""" + + user_options = [ + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + negative_opt = {} + + READMES = 'README', 'README.rst', 'README.txt' + + def run(self): + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + self.filelist = ei_cmd.filelist + self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) + self.check_readme() + + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + # Call check_metadata only if no 'check' command + # (distutils <= 2.6) + import distutils.command + + if 'check' not in distutils.command.__all__: + self.check_metadata() + + self.make_distribution() + + dist_files = getattr(self.distribution, 'dist_files', []) + for file in self.archive_files: + data = ('sdist', '', file) + if data not in dist_files: + dist_files.append(data) + + def initialize_options(self): + orig.sdist.initialize_options(self) + + self._default_to_gztar() + + def _default_to_gztar(self): + # only needed on Python prior to 3.6. + if sys.version_info >= (3, 6, 0, 'beta', 1): + return + self.formats = ['gztar'] + + def make_distribution(self): + """ + Workaround for #516 + """ + with self._remove_os_link(): + orig.sdist.make_distribution(self) + + @staticmethod + @contextlib.contextmanager + def _remove_os_link(): + """ + In a context, remove and restore os.link if it exists + """ + + class NoValue: + pass + + orig_val = getattr(os, 'link', NoValue) + try: + del os.link + except Exception: + pass + try: + yield + finally: + if orig_val is not NoValue: + setattr(os, 'link', orig_val) + + def __read_template_hack(self): + # This grody hack closes the template file (MANIFEST.in) if an + # exception occurs during read_template. + # Doing so prevents an error when easy_install attempts to delete the + # file. + try: + orig.sdist.read_template(self) + except Exception: + _, _, tb = sys.exc_info() + tb.tb_next.tb_frame.f_locals['template'].close() + raise + + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle + # has been fixed, so only override the method if we're using an earlier + # Python. + has_leaky_handle = ( + sys.version_info < (2, 7, 2) + or (3, 0) <= sys.version_info < (3, 1, 4) + or (3, 2) <= sys.version_info < (3, 2, 1) + ) + if has_leaky_handle: + read_template = __read_template_hack + + def _add_defaults_python(self): + """getting python files""" + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + # This functionality is incompatible with include_package_data, and + # will in fact create an infinite recursion if include_package_data + # is True. Use of include_package_data will imply that + # distutils-style automatic handling of package_data is disabled + if not self.distribution.include_package_data: + for _, src_dir, _, filenames in build_py.data_files: + self.filelist.extend([os.path.join(src_dir, filename) + for filename in filenames]) + + def _add_defaults_data_files(self): + try: + if six.PY2: + sdist_add_defaults._add_defaults_data_files(self) + else: + super()._add_defaults_data_files() + except TypeError: + log.warn("data_files contains unexpected objects") + + def check_readme(self): + for f in self.READMES: + if os.path.exists(f): + return + else: + self.warn( + "standard file not found: should have one of " + + ', '.join(self.READMES) + ) + + def make_release_tree(self, base_dir, files): + orig.sdist.make_release_tree(self, base_dir, files) + + # Save any egg_info command line options used to create this sdist + dest = os.path.join(base_dir, 'setup.cfg') + if hasattr(os, 'link') and os.path.exists(dest): + # unlink and re-copy, since it might be hard-linked, and + # we don't want to change the source version + os.unlink(dest) + self.copy_file('setup.cfg', dest) + + self.get_finalized_command('egg_info').save_version_info(dest) + + def _manifest_is_not_generated(self): + # check for special comment used in 2.7.1 and higher + if not os.path.isfile(self.manifest): + return False + + with io.open(self.manifest, 'rb') as fp: + first_line = fp.readline() + return (first_line != + '# file GENERATED by distutils, do NOT edit\n'.encode()) + + def read_manifest(self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + log.info("reading manifest file '%s'", self.manifest) + manifest = open(self.manifest, 'rb') + for line in manifest: + # The manifest must contain UTF-8. See #303. + if six.PY3: + try: + line = line.decode('UTF-8') + except UnicodeDecodeError: + log.warn("%r not UTF-8 decodable -- skipping" % line) + continue + # ignore comments and blank lines + line = line.strip() + if line.startswith('#') or not line: + continue + self.filelist.append(line) + manifest.close() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/setopt.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/setopt.py new file mode 100644 index 0000000..7e57cc0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/setopt.py @@ -0,0 +1,149 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import distutils +import os + +from setuptools.extern.six.moves import configparser + +from setuptools import Command + +__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] + + +def config_file(kind="local"): + """Get the filename of the distutils, local, global, or per-user config + + `kind` must be one of "local", "global", or "user" + """ + if kind == 'local': + return 'setup.cfg' + if kind == 'global': + return os.path.join( + os.path.dirname(distutils.__file__), 'distutils.cfg' + ) + if kind == 'user': + dot = os.name == 'posix' and '.' or '' + return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) + raise ValueError( + "config_file() type must be 'local', 'global', or 'user'", kind + ) + + +def edit_config(filename, settings, dry_run=False): + """Edit a configuration file to include `settings` + + `settings` is a dictionary of dictionaries or ``None`` values, keyed by + command/section name. A ``None`` value means to delete the entire section, + while a dictionary lists settings to be changed or deleted in that section. + A setting of ``None`` means to delete that setting. + """ + log.debug("Reading configuration from %s", filename) + opts = configparser.RawConfigParser() + opts.read([filename]) + for section, options in settings.items(): + if options is None: + log.info("Deleting section [%s] from %s", section, filename) + opts.remove_section(section) + else: + if not opts.has_section(section): + log.debug("Adding new section [%s] to %s", section, filename) + opts.add_section(section) + for option, value in options.items(): + if value is None: + log.debug( + "Deleting %s.%s from %s", + section, option, filename + ) + opts.remove_option(section, option) + if not opts.options(section): + log.info("Deleting empty [%s] section from %s", + section, filename) + opts.remove_section(section) + else: + log.debug( + "Setting %s.%s to %r in %s", + section, option, value, filename + ) + opts.set(section, option, value) + + log.info("Writing %s", filename) + if not dry_run: + with open(filename, 'w') as f: + opts.write(f) + + +class option_base(Command): + """Abstract base class for commands that mess with config files""" + + user_options = [ + ('global-config', 'g', + "save options to the site-wide distutils.cfg file"), + ('user-config', 'u', + "save options to the current user's pydistutils.cfg file"), + ('filename=', 'f', + "configuration file to use (default=setup.cfg)"), + ] + + boolean_options = [ + 'global-config', 'user-config', + ] + + def initialize_options(self): + self.global_config = None + self.user_config = None + self.filename = None + + def finalize_options(self): + filenames = [] + if self.global_config: + filenames.append(config_file('global')) + if self.user_config: + filenames.append(config_file('user')) + if self.filename is not None: + filenames.append(self.filename) + if not filenames: + filenames.append(config_file('local')) + if len(filenames) > 1: + raise DistutilsOptionError( + "Must specify only one configuration file option", + filenames + ) + self.filename, = filenames + + +class setopt(option_base): + """Save command-line options to a file""" + + description = "set an option in setup.cfg or another config file" + + user_options = [ + ('command=', 'c', 'command to set an option for'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.command = None + self.option = None + self.set_value = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.command is None or self.option is None: + raise DistutilsOptionError("Must specify --command *and* --option") + if self.set_value is None and not self.remove: + raise DistutilsOptionError("Must specify --set-value or --remove") + + def run(self): + edit_config( + self.filename, { + self.command: {self.option.replace('-', '_'): self.set_value} + }, + self.dry_run + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/test.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/test.py new file mode 100644 index 0000000..ef0af12 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/test.py @@ -0,0 +1,254 @@ +import os +import operator +import sys +import contextlib +import itertools +from distutils.errors import DistutilsError, DistutilsOptionError +from distutils import log +from unittest import TestLoader + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter + +from pkg_resources import (resource_listdir, resource_exists, normalize_path, + working_set, _namespace_packages, + add_activation_listener, require, EntryPoint) +from setuptools import Command +from setuptools.py31compat import unittest_main + + +class ScanningLoader(TestLoader): + def loadTestsFromModule(self, module, pattern=None): + """Return a suite of all tests cases contained in the given module + + If the module is a package, load tests from all the modules in it. + If the module has an ``additional_tests`` function, call it and add + the return value to the tests. + """ + tests = [] + tests.append(TestLoader.loadTestsFromModule(self, module)) + + if hasattr(module, "additional_tests"): + tests.append(module.additional_tests()) + + if hasattr(module, '__path__'): + for file in resource_listdir(module.__name__, ''): + if file.endswith('.py') and file != '__init__.py': + submodule = module.__name__ + '.' + file[:-3] + else: + if resource_exists(module.__name__, file + '/__init__.py'): + submodule = module.__name__ + '.' + file + else: + continue + tests.append(self.loadTestsFromName(submodule)) + + if len(tests) != 1: + return self.suiteClass(tests) + else: + return tests[0] # don't create a nested suite for only one return + + +# adapted from jaraco.classes.properties:NonDataProperty +class NonDataProperty(object): + def __init__(self, fget): + self.fget = fget + + def __get__(self, obj, objtype=None): + if obj is None: + return self + return self.fget(obj) + + +class test(Command): + """Command to run unit tests after in-place build""" + + description = "run unit tests after in-place build" + + user_options = [ + ('test-module=', 'm', "Run 'test_suite' in specified module"), + ('test-suite=', 's', + "Test suite to run (e.g. 'some_module.test_suite')"), + ('test-runner=', 'r', "Test runner to use"), + ] + + def initialize_options(self): + self.test_suite = None + self.test_module = None + self.test_loader = None + self.test_runner = None + + def finalize_options(self): + + if self.test_suite and self.test_module: + msg = "You may specify a module or a suite, but not both" + raise DistutilsOptionError(msg) + + if self.test_suite is None: + if self.test_module is None: + self.test_suite = self.distribution.test_suite + else: + self.test_suite = self.test_module + ".test_suite" + + if self.test_loader is None: + self.test_loader = getattr(self.distribution, 'test_loader', None) + if self.test_loader is None: + self.test_loader = "setuptools.command.test:ScanningLoader" + if self.test_runner is None: + self.test_runner = getattr(self.distribution, 'test_runner', None) + + @NonDataProperty + def test_args(self): + return list(self._test_args()) + + def _test_args(self): + if self.verbose: + yield '--verbose' + if self.test_suite: + yield self.test_suite + + def with_project_on_sys_path(self, func): + """ + Backward compatibility for project_on_sys_path context. + """ + with self.project_on_sys_path(): + func() + + @contextlib.contextmanager + def project_on_sys_path(self, include_dists=[]): + with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) + + if with_2to3: + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + ei_cmd = self.get_finalized_command("egg_info") + + old_path = sys.path[:] + old_modules = sys.modules.copy() + + try: + project_path = normalize_path(ei_cmd.egg_base) + sys.path.insert(0, project_path) + working_set.__init__() + add_activation_listener(lambda dist: dist.activate()) + require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) + with self.paths_on_pythonpath([project_path]): + yield + finally: + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + working_set.__init__() + + @staticmethod + @contextlib.contextmanager + def paths_on_pythonpath(paths): + """ + Add the indicated paths to the head of the PYTHONPATH environment + variable so that subprocesses will also see the packages at + these paths. + + Do this in a context that restores the value on exit. + """ + nothing = object() + orig_pythonpath = os.environ.get('PYTHONPATH', nothing) + current_pythonpath = os.environ.get('PYTHONPATH', '') + try: + prefix = os.pathsep.join(paths) + to_join = filter(None, [prefix, current_pythonpath]) + new_path = os.pathsep.join(to_join) + if new_path: + os.environ['PYTHONPATH'] = new_path + yield + finally: + if orig_pythonpath is nothing: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = orig_pythonpath + + @staticmethod + def install_dists(dist): + """ + Install the requirements indicated by self.distribution and + return an iterable of the dists that were built. + """ + ir_d = dist.fetch_build_eggs(dist.install_requires or []) + tr_d = dist.fetch_build_eggs(dist.tests_require or []) + return itertools.chain(ir_d, tr_d) + + def run(self): + installed_dists = self.install_dists(self.distribution) + + cmd = ' '.join(self._argv) + if self.dry_run: + self.announce('skipping "%s" (dry run)' % cmd) + return + + self.announce('running "%s"' % cmd) + + paths = map(operator.attrgetter('location'), installed_dists) + with self.paths_on_pythonpath(paths): + with self.project_on_sys_path(): + self.run_tests() + + def run_tests(self): + # Purge modules under test from sys.modules. The test loader will + # re-import them from the build location. Required when 2to3 is used + # with namespace packages. + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + module = self.test_suite.split('.')[0] + if module in _namespace_packages: + del_modules = [] + if module in sys.modules: + del_modules.append(module) + module += '.' + for name in sys.modules: + if name.startswith(module): + del_modules.append(name) + list(map(sys.modules.__delitem__, del_modules)) + + exit_kwarg = {} if sys.version_info < (2, 7) else {"exit": False} + test = unittest_main( + None, None, self._argv, + testLoader=self._resolve_as_ep(self.test_loader), + testRunner=self._resolve_as_ep(self.test_runner), + **exit_kwarg + ) + if not test.result.wasSuccessful(): + msg = 'Test failed: %s' % test.result + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + @property + def _argv(self): + return ['unittest'] + self.test_args + + @staticmethod + def _resolve_as_ep(val): + """ + Load the indicated attribute value, called, as a as if it were + specified as an entry point. + """ + if val is None: + return + parsed = EntryPoint.parse("x=" + val) + return parsed.resolve()() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload.py new file mode 100644 index 0000000..484baa5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload.py @@ -0,0 +1,38 @@ +import getpass +from distutils.command import upload as orig + + +class upload(orig.upload): + """ + Override default upload behavior to obtain password + in a variety of different ways. + """ + + def finalize_options(self): + orig.upload.finalize_options(self) + # Attempt to obtain password. Short circuit evaluation at the first + # sign of success. + self.password = ( + self.password or + self._load_password_from_keyring() or + self._prompt_for_password() + ) + + def _load_password_from_keyring(self): + """ + Attempt to load password from keyring. Suppress Exceptions. + """ + try: + keyring = __import__('keyring') + return keyring.get_password(self.repository, self.username) + except Exception: + pass + + def _prompt_for_password(self): + """ + Prompt for a password on the tty. Suppress Exceptions. + """ + try: + return getpass.getpass() + except (Exception, KeyboardInterrupt): + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload_docs.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 0000000..269dc2d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""upload_docs + +Implements a Distutils 'upload_docs' subcommand (upload documentation to +PyPI's pythonhosted.org). +""" + +from base64 import standard_b64encode +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import socket +import zipfile +import tempfile +import shutil +import itertools +import functools + +from setuptools.extern import six +from setuptools.extern.six.moves import http_client, urllib + +from pkg_resources import iter_entry_points +from .upload import upload + + +def _encode(s): + errors = 'surrogateescape' if six.PY3 else 'strict' + return s.encode('utf-8', errors) + + +class upload_docs(upload): + # override the default repository as upload_docs isn't + # supported by Warehouse (and won't be). + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' + + description = 'Upload documentation to PyPI' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('upload-dir=', None, 'directory to upload'), + ] + boolean_options = upload.boolean_options + + def has_sphinx(self): + if self.upload_dir is None: + for ep in iter_entry_points('distutils.commands', 'build_sphinx'): + return True + + sub_commands = [('build_sphinx', has_sphinx)] + + def initialize_options(self): + upload.initialize_options(self) + self.upload_dir = None + self.target_dir = None + + def finalize_options(self): + log.warn("Upload_docs command is deprecated. Use RTD instead.") + upload.finalize_options(self) + if self.upload_dir is None: + if self.has_sphinx(): + build_sphinx = self.get_finalized_command('build_sphinx') + self.target_dir = build_sphinx.builder_target_dir + else: + build = self.get_finalized_command('build') + self.target_dir = os.path.join(build.build_base, 'docs') + else: + self.ensure_dirname('upload_dir') + self.target_dir = self.upload_dir + self.announce('Using upload directory %s' % self.target_dir) + + def create_zipfile(self, filename): + zip_file = zipfile.ZipFile(filename, "w") + try: + self.mkpath(self.target_dir) # just in case + for root, dirs, files in os.walk(self.target_dir): + if root == self.target_dir and not files: + raise DistutilsOptionError( + "no files found in upload directory '%s'" + % self.target_dir) + for name in files: + full = os.path.join(root, name) + relative = root[len(self.target_dir):].lstrip(os.path.sep) + dest = os.path.join(relative, name) + zip_file.write(full, dest) + finally: + zip_file.close() + + def run(self): + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + tmp_dir = tempfile.mkdtemp() + name = self.distribution.metadata.get_name() + zip_file = os.path.join(tmp_dir, "%s.zip" % name) + try: + self.create_zipfile(zip_file) + self.upload_file(zip_file) + finally: + shutil.rmtree(tmp_dir) + + @staticmethod + def _build_part(item, sep_boundary): + key, values = item + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(values, list): + values = [values] + for value in values: + if isinstance(value, tuple): + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = _encode(value) + yield sep_boundary + yield _encode(title) + yield b"\n\n" + yield value + if value and value[-1:] == b'\r': + yield b'\n' # write an extra newline (lurve Macs) + + @classmethod + def _build_multipart(cls, data): + """ + Build up the MIME payload for the POST data + """ + boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\n--' + boundary + end_boundary = sep_boundary + b'--' + end_items = end_boundary, b"\n", + builder = functools.partial( + cls._build_part, + sep_boundary=sep_boundary, + ) + part_groups = map(builder, data.items()) + parts = itertools.chain.from_iterable(part_groups) + body_items = itertools.chain(parts, end_items) + content_type = 'multipart/form-data; boundary=%s' % boundary + return b''.join(body_items), content_type + + def upload_file(self, filename): + with open(filename, 'rb') as f: + content = f.read() + meta = self.distribution.metadata + data = { + ':action': 'doc_upload', + 'name': meta.get_name(), + 'content': (os.path.basename(filename), content), + } + # set up the authentication + credentials = _encode(self.username + ':' + self.password) + credentials = standard_b64encode(credentials) + if six.PY3: + credentials = credentials.decode('ascii') + auth = "Basic " + credentials + + body, ct = self._build_multipart(data) + + self.announce("Submitting documentation to %s" % (self.repository), + log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urllib.parse.urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + conn = http_client.HTTPConnection(netloc) + elif schema == 'https': + conn = http_client.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema " + schema) + + data = '' + try: + conn.connect() + conn.putrequest("POST", url) + content_type = ct + conn.putheader('Content-type', content_type) + conn.putheader('Content-length', str(len(body))) + conn.putheader('Authorization', auth) + conn.endheaders() + conn.send(body) + except socket.error as e: + self.announce(str(e), log.ERROR) + return + + r = conn.getresponse() + if r.status == 200: + self.announce('Server response (%s): %s' % (r.status, r.reason), + log.INFO) + elif r.status == 301: + location = r.getheader('Location') + if location is None: + location = 'https://pythonhosted.org/%s/' % meta.get_name() + self.announce('Upload successful. Visit %s' % location, + log.INFO) + else: + self.announce('Upload failed (%s): %s' % (r.status, r.reason), + log.ERROR) + if self.show_response: + print('-' * 75, r.read(), '-' * 75) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/config.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/config.py new file mode 100644 index 0000000..d71ff02 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/config.py @@ -0,0 +1,558 @@ +from __future__ import absolute_import, unicode_literals +import io +import os +import sys +from collections import defaultdict +from functools import partial + +from distutils.errors import DistutilsOptionError, DistutilsFileError +from setuptools.py26compat import import_module +from setuptools.extern.six import string_types + + +def read_configuration( + filepath, find_others=False, ignore_option_errors=False): + """Read given configuration file and returns options from it as a dict. + + :param str|unicode filepath: Path to configuration file + to get options from. + + :param bool find_others: Whether to search for other configuration files + which could be on in various places. + + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + + :rtype: dict + """ + from setuptools.dist import Distribution, _Distribution + + filepath = os.path.abspath(filepath) + + if not os.path.isfile(filepath): + raise DistutilsFileError( + 'Configuration file %s does not exist.' % filepath) + + current_directory = os.getcwd() + os.chdir(os.path.dirname(filepath)) + + try: + dist = Distribution() + + filenames = dist.find_config_files() if find_others else [] + if filepath not in filenames: + filenames.append(filepath) + + _Distribution.parse_config_files(dist, filenames=filenames) + + handlers = parse_configuration( + dist, dist.command_options, + ignore_option_errors=ignore_option_errors) + + finally: + os.chdir(current_directory) + + return configuration_to_dict(handlers) + + +def configuration_to_dict(handlers): + """Returns configuration data gathered by given handlers as a dict. + + :param list[ConfigHandler] handlers: Handlers list, + usually from parse_configuration() + + :rtype: dict + """ + config_dict = defaultdict(dict) + + for handler in handlers: + + obj_alias = handler.section_prefix + target_obj = handler.target_obj + + for option in handler.set_options: + getter = getattr(target_obj, 'get_%s' % option, None) + + if getter is None: + value = getattr(target_obj, option) + + else: + value = getter() + + config_dict[obj_alias][option] = value + + return config_dict + + +def parse_configuration( + distribution, command_options, ignore_option_errors=False): + """Performs additional parsing of configuration options + for a distribution. + + Returns a list of used option handlers. + + :param Distribution distribution: + :param dict command_options: + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + :rtype: list + """ + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors) + meta.parse() + + options = ConfigOptionsHandler( + distribution, command_options, ignore_option_errors) + options.parse() + + return [meta, options] + + +class ConfigHandler(object): + """Handles metadata supplied in configuration files.""" + + section_prefix = None + """Prefix for config sections handled by this handler. + Must be provided by class heirs. + + """ + + aliases = {} + """Options aliases. + For compatibility with various packages. E.g.: d2to1 and pbr. + Note: `-` in keys is replaced with `_` by config parser. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False): + sections = {} + + section_prefix = self.section_prefix + for section_name, section_options in options.items(): + if not section_name.startswith(section_prefix): + continue + + section_name = section_name.replace(section_prefix, '').strip('.') + sections[section_name] = section_options + + self.ignore_option_errors = ignore_option_errors + self.target_obj = target_obj + self.sections = sections + self.set_options = [] + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + raise NotImplementedError( + '%s must provide .parsers property' % self.__class__.__name__) + + def __setitem__(self, option_name, value): + unknown = tuple() + target_obj = self.target_obj + + # Translate alias into real name. + option_name = self.aliases.get(option_name, option_name) + + current_value = getattr(target_obj, option_name, unknown) + + if current_value is unknown: + raise KeyError(option_name) + + if current_value: + # Already inhabited. Skipping. + return + + skip_option = False + parser = self.parsers.get(option_name) + if parser: + try: + value = parser(value) + + except Exception: + skip_option = True + if not self.ignore_option_errors: + raise + + if skip_option: + return + + setter = getattr(target_obj, 'set_%s' % option_name, None) + if setter is None: + setattr(target_obj, option_name, value) + else: + setter(value) + + self.set_options.append(option_name) + + @classmethod + def _parse_list(cls, value, separator=','): + """Represents value as a list. + + Value is split either by separator (defaults to comma) or by lines. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + if isinstance(value, list): # _get_parser_compound case + return value + + if '\n' in value: + value = value.splitlines() + else: + value = value.split(separator) + + return [chunk.strip() for chunk in value if chunk.strip()] + + @classmethod + def _parse_dict(cls, value): + """Represents value as a dict. + + :param value: + :rtype: dict + """ + separator = '=' + result = {} + for line in cls._parse_list(value): + key, sep, val = line.partition(separator) + if sep != separator: + raise DistutilsOptionError( + 'Unable to parse option value to dict: %s' % value) + result[key.strip()] = val.strip() + + return result + + @classmethod + def _parse_bool(cls, value): + """Represents value as boolean. + + :param value: + :rtype: bool + """ + value = value.lower() + return value in ('1', 'true', 'yes') + + @classmethod + def _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + include: LICENSE + include: src/file.txt + + :param str value: + :rtype: str + """ + if not isinstance(value, string_types): + return value + + include_directive = 'file:' + if not value.startswith(include_directive): + return value + + current_directory = os.getcwd() + + filepath = value.replace(include_directive, '').strip() + filepath = os.path.abspath(filepath) + + if not filepath.startswith(current_directory): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + if os.path.isfile(filepath): + with io.open(filepath, encoding='utf-8') as f: + value = f.read() + + return value + + @classmethod + def _parse_attr(cls, value): + """Represents value as a module attribute. + + Examples: + attr: package.attr + attr: package.module.attr + + :param str value: + :rtype: str + """ + attr_directive = 'attr:' + if not value.startswith(attr_directive): + return value + + attrs_path = value.replace(attr_directive, '').strip().split('.') + attr_name = attrs_path.pop() + + module_name = '.'.join(attrs_path) + module_name = module_name or '__init__' + + sys.path.insert(0, os.getcwd()) + try: + module = import_module(module_name) + value = getattr(module, attr_name) + + finally: + sys.path = sys.path[1:] + + return value + + @classmethod + def _get_parser_compound(cls, *parse_methods): + """Returns parser function to represents value as a list. + + Parses a value applying given methods one after another. + + :param parse_methods: + :rtype: callable + """ + def parse(value): + parsed = value + + for method in parse_methods: + parsed = method(parsed) + + return parsed + + return parse + + @classmethod + def _parse_section_to_dict(cls, section_options, values_parser=None): + """Parses section options into a dictionary. + + Optionally applies a given parser to values. + + :param dict section_options: + :param callable values_parser: + :rtype: dict + """ + value = {} + values_parser = values_parser or (lambda val: val) + for key, (_, val) in section_options.items(): + value[key] = values_parser(val) + return value + + def parse_section(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + for (name, (_, value)) in section_options.items(): + try: + self[name] = value + + except KeyError: + pass # Keep silent for a new option may appear anytime. + + def parse(self): + """Parses configuration file items from one + or more related sections. + + """ + for section_name, section_options in self.sections.items(): + + method_postfix = '' + if section_name: # [section.option] variant + method_postfix = '_%s' % section_name + + section_parser_method = getattr( + self, + # Dots in section names are tranlsated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + +class ConfigMetadataHandler(ConfigHandler): + + section_prefix = 'metadata' + + aliases = { + 'home_page': 'url', + 'summary': 'description', + 'classifier': 'classifiers', + 'platform': 'platforms', + } + + strict_mode = False + """We need to keep it loose, to be partially compatible with + `pbr` and `d2to1` packages which also uses `metadata` section. + + """ + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_file = self._parse_file + + return { + 'platforms': parse_list, + 'keywords': parse_list, + 'provides': parse_list, + 'requires': parse_list, + 'obsoletes': parse_list, + 'classifiers': self._get_parser_compound(parse_file, parse_list), + 'license': parse_file, + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + } + + def parse_section_classifiers(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + classifiers = [] + for begin, (_, rest) in section_options.items(): + classifiers.append('%s :%s' % (begin.title(), rest)) + + self['classifiers'] = classifiers + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_attr(value) + + if callable(version): + version = version() + + if not isinstance(version, string_types): + if hasattr(version, '__iter__'): + version = '.'.join(map(str, version)) + else: + version = '%s' % version + + return version + + +class ConfigOptionsHandler(ConfigHandler): + + section_prefix = 'options' + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_list_semicolon = partial(self._parse_list, separator=';') + parse_bool = self._parse_bool + parse_dict = self._parse_dict + + return { + 'zip_safe': parse_bool, + 'use_2to3': parse_bool, + 'include_package_data': parse_bool, + 'package_dir': parse_dict, + 'use_2to3_fixers': parse_list, + 'use_2to3_exclude_fixers': parse_list, + 'convert_2to3_doctests': parse_list, + 'scripts': parse_list, + 'eager_resources': parse_list, + 'dependency_links': parse_list, + 'namespace_packages': parse_list, + 'install_requires': parse_list_semicolon, + 'setup_requires': parse_list_semicolon, + 'tests_require': parse_list_semicolon, + 'packages': self._parse_packages, + 'entry_points': self._parse_file, + } + + def _parse_packages(self, value): + """Parses `packages` option value. + + :param value: + :rtype: list + """ + find_directive = 'find:' + + if not value.startswith(find_directive): + return self._parse_list(value) + + # Read function arguments from a dedicated section. + find_kwargs = self.parse_section_packages__find( + self.sections.get('packages.find', {})) + + from setuptools import find_packages + + return find_packages(**find_kwargs) + + def parse_section_packages__find(self, section_options): + """Parses `packages.find` configuration file section. + + To be used in conjunction with _parse_packages(). + + :param dict section_options: + """ + section_data = self._parse_section_to_dict( + section_options, self._parse_list) + + valid_keys = ['where', 'include', 'exclude'] + + find_kwargs = dict( + [(k, v) for k, v in section_data.items() if k in valid_keys and v]) + + where = find_kwargs.get('where') + if where is not None: + find_kwargs['where'] = where[0] # cast list to single val + + return find_kwargs + + def parse_section_entry_points(self, section_options): + """Parses `entry_points` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['entry_points'] = parsed + + def _parse_package_data(self, section_options): + parsed = self._parse_section_to_dict(section_options, self._parse_list) + + root = parsed.get('*') + if root: + parsed[''] = root + del parsed['*'] + + return parsed + + def parse_section_package_data(self, section_options): + """Parses `package_data` configuration file section. + + :param dict section_options: + """ + self['package_data'] = self._parse_package_data(section_options) + + def parse_section_exclude_package_data(self, section_options): + """Parses `exclude_package_data` configuration file section. + + :param dict section_options: + """ + self['exclude_package_data'] = self._parse_package_data( + section_options) + + def parse_section_extras_require(self, section_options): + """Parses `extras_require` configuration file section. + + :param dict section_options: + """ + parse_list = partial(self._parse_list, separator=';') + self['extras_require'] = self._parse_section_to_dict( + section_options, parse_list) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/depends.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/depends.py new file mode 100644 index 0000000..45e7052 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/depends.py @@ -0,0 +1,186 @@ +import sys +import imp +import marshal +from distutils.version import StrictVersion +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN + +from .py33compat import Bytecode + + +__all__ = [ + 'Require', 'find_module', 'get_module_constant', 'extract_constant' +] + + +class Require: + """A prerequisite to building or installing a distribution""" + + def __init__(self, name, requested_version, module, homepage='', + attribute=None, format=None): + + if format is None and requested_version is not None: + format = StrictVersion + + if format is not None: + requested_version = format(requested_version) + if attribute is None: + attribute = '__version__' + + self.__dict__.update(locals()) + del self.self + + def full_name(self): + """Return full package/distribution name, w/version""" + if self.requested_version is not None: + return '%s-%s' % (self.name, self.requested_version) + return self.name + + def version_ok(self, version): + """Is 'version' sufficiently up-to-date?""" + return self.attribute is None or self.format is None or \ + str(version) != "unknown" and version >= self.requested_version + + def get_version(self, paths=None, default="unknown"): + """Get version number of installed module, 'None', or 'default' + + Search 'paths' for module. If not found, return 'None'. If found, + return the extracted version attribute, or 'default' if no version + attribute was specified, or the value cannot be determined without + importing the module. The version is formatted according to the + requirement's version format (if any), unless it is 'None' or the + supplied 'default'. + """ + + if self.attribute is None: + try: + f, p, i = find_module(self.module, paths) + if f: + f.close() + return default + except ImportError: + return None + + v = get_module_constant(self.module, self.attribute, default, paths) + + if v is not None and v is not default and self.format is not None: + return self.format(v) + + return v + + def is_present(self, paths=None): + """Return true if dependency is present on 'paths'""" + return self.get_version(paths) is not None + + def is_current(self, paths=None): + """Return true if dependency is present and up-to-date on 'paths'""" + version = self.get_version(paths) + if version is None: + return False + return self.version_ok(version) + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + + parts = module.split('.') + + while parts: + part = parts.pop(0) + f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) + + if kind == PKG_DIRECTORY: + parts = parts or ['__init__'] + paths = [path] + + elif parts: + raise ImportError("Can't find %r in %s" % (parts, module)) + + return info + + +def get_module_constant(module, symbol, default=-1, paths=None): + """Find 'module' by searching 'paths', and extract 'symbol' + + Return 'None' if 'module' does not exist on 'paths', or it does not define + 'symbol'. If the module defines 'symbol' as a constant, return the + constant. Otherwise, return 'default'.""" + + try: + f, path, (suffix, mode, kind) = find_module(module, paths) + except ImportError: + # Module doesn't exist + return None + + try: + if kind == PY_COMPILED: + f.read(8) # skip magic & date + code = marshal.load(f) + elif kind == PY_FROZEN: + code = imp.get_frozen_object(module) + elif kind == PY_SOURCE: + code = compile(f.read(), path, 'exec') + else: + # Not something we can parse; we'll have to import it. :( + if module not in sys.modules: + imp.load_module(module, f, path, (suffix, mode, kind)) + return getattr(sys.modules[module], symbol, None) + + finally: + if f: + f.close() + + return extract_constant(code, symbol, default) + + +def extract_constant(code, symbol, default=-1): + """Extract the constant value of 'symbol' from 'code' + + If the name 'symbol' is bound to a constant value by the Python code + object 'code', return that value. If 'symbol' is bound to an expression, + return 'default'. Otherwise, return 'None'. + + Return value is based on the first assignment to 'symbol'. 'symbol' must + be a global, or at least a non-"fast" local in the code block. That is, + only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' + must be present in 'code.co_names'. + """ + if symbol not in code.co_names: + # name's not there, can't possibly be an assignment + return None + + name_idx = list(code.co_names).index(symbol) + + STORE_NAME = 90 + STORE_GLOBAL = 97 + LOAD_CONST = 100 + + const = default + + for byte_code in Bytecode(code): + op = byte_code.opcode + arg = byte_code.arg + + if op == LOAD_CONST: + const = code.co_consts[arg] + elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): + return const + else: + const = default + + +def _update_globals(): + """ + Patch the globals to remove the objects not available on some platforms. + + XXX it'd be better to test assertions about bytecode instead. + """ + + if not sys.platform.startswith('java') and sys.platform != 'cli': + return + incompatible = 'extract_constant', 'get_module_constant' + for name in incompatible: + del globals()[name] + __all__.remove(name) + + +_update_globals() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/dist.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/dist.py new file mode 100644 index 0000000..159464b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/dist.py @@ -0,0 +1,925 @@ +__all__ = ['Distribution'] + +import re +import os +import warnings +import numbers +import distutils.log +import distutils.core +import distutils.cmd +import distutils.dist +from distutils.errors import (DistutilsOptionError, DistutilsPlatformError, + DistutilsSetupError) +from distutils.util import rfc822_escape + +from setuptools.extern import six +from setuptools.extern.six.moves import map +from pkg_resources.extern import packaging + +from setuptools.depends import Require +from setuptools import windows_support +from setuptools.monkey import get_unpatched +from setuptools.config import parse_configuration +import pkg_resources +from .py36compat import Distribution_parse_config_files + + +def _get_unpatched(cls): + warnings.warn("Do not call this function", DeprecationWarning) + return get_unpatched(cls) + + +# Based on Python 3.5 version +def write_pkg_file(self, file): + """Write the PKG-INFO format data to a file object. + """ + version = '1.0' + if (self.provides or self.requires or self.obsoletes or + self.classifiers or self.download_url): + version = '1.1' + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + version = '1.2' + + file.write('Metadata-Version: %s\n' % version) + file.write('Name: %s\n' % self.get_name()) + file.write('Version: %s\n' % self.get_version()) + file.write('Summary: %s\n' % self.get_description()) + file.write('Home-page: %s\n' % self.get_url()) + file.write('Author: %s\n' % self.get_contact()) + file.write('Author-email: %s\n' % self.get_contact_email()) + file.write('License: %s\n' % self.get_license()) + if self.download_url: + file.write('Download-URL: %s\n' % self.download_url) + + long_desc = rfc822_escape(self.get_long_description()) + file.write('Description: %s\n' % long_desc) + + keywords = ','.join(self.get_keywords()) + if keywords: + file.write('Keywords: %s\n' % keywords) + + self._write_list(file, 'Platform', self.get_platforms()) + self._write_list(file, 'Classifier', self.get_classifiers()) + + # PEP 314 + self._write_list(file, 'Requires', self.get_requires()) + self._write_list(file, 'Provides', self.get_provides()) + self._write_list(file, 'Obsoletes', self.get_obsoletes()) + + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + file.write('Requires-Python: %s\n' % self.python_requires) + + +# from Python 3.4 +def write_pkg_info(self, base_dir): + """Write the PKG-INFO file into the release tree. + """ + with open(os.path.join(base_dir, 'PKG-INFO'), 'w', + encoding='UTF-8') as pkg_info: + self.write_pkg_file(pkg_info) + + +sequence = tuple, list + + +def check_importable(dist, attr, value): + try: + ep = pkg_resources.EntryPoint.parse('x=' + value) + assert not ep.extras + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be importable 'module:attrs' string (got %r)" + % (attr, value) + ) + + +def assert_string_list(dist, attr, value): + """Verify that value is a string list or None""" + try: + assert ''.join(value) != value + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be a list of strings (got %r)" % (attr, value) + ) + + +def check_nsp(dist, attr, value): + """Verify that namespace packages are valid""" + ns_packages = value + assert_string_list(dist, attr, ns_packages) + for nsp in ns_packages: + if not dist.has_contents_for(nsp): + raise DistutilsSetupError( + "Distribution contains no modules or packages for " + + "namespace package %r" % nsp + ) + parent, sep, child = nsp.rpartition('.') + if parent and parent not in ns_packages: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + + +def check_extras(dist, attr, value): + """Verify that extras_require mapping is valid""" + try: + for k, v in value.items(): + if ':' in k: + k, m = k.split(':', 1) + if pkg_resources.invalid_marker(m): + raise DistutilsSetupError("Invalid environment marker: " + m) + list(pkg_resources.parse_requirements(v)) + except (TypeError, ValueError, AttributeError): + raise DistutilsSetupError( + "'extras_require' must be a dictionary whose values are " + "strings or lists of strings containing valid project/version " + "requirement specifiers." + ) + + +def assert_bool(dist, attr, value): + """Verify that value is True, False, 0, or 1""" + if bool(value) != value: + tmpl = "{attr!r} must be a boolean value (got {value!r})" + raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) + + +def check_requirements(dist, attr, value): + """Verify that install_requires is a valid requirements list""" + try: + list(pkg_resources.parse_requirements(value)) + except (TypeError, ValueError) as error: + tmpl = ( + "{attr!r} must be a string or list of strings " + "containing valid project/version requirement specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_specifier(dist, attr, value): + """Verify that value is a valid version specifier""" + try: + packaging.specifiers.SpecifierSet(value) + except packaging.specifiers.InvalidSpecifier as error: + tmpl = ( + "{attr!r} must be a string or list of strings " + "containing valid version specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_entry_points(dist, attr, value): + """Verify that entry_points map is parseable""" + try: + pkg_resources.EntryPoint.parse_map(value) + except ValueError as e: + raise DistutilsSetupError(e) + + +def check_test_suite(dist, attr, value): + if not isinstance(value, six.string_types): + raise DistutilsSetupError("test_suite must be a string") + + +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value, dict): + for k, v in value.items(): + if not isinstance(k, str): + break + try: + iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr + " must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) + + +def check_packages(dist, attr, value): + for pkgname in value: + if not re.match(r'\w+(\.\w+)*', pkgname): + distutils.log.warn( + "WARNING: %r not a valid package name; please use only " + ".-separated package names in setup.py", pkgname + ) + + +_Distribution = get_unpatched(distutils.core.Distribution) + + +class Distribution(Distribution_parse_config_files, _Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' **deprecated** -- a dictionary mapping option names to + 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist + + def __init__(self, attrs=None): + have_package_data = hasattr(self, "package_data") + if not have_package_data: + self.package_data = {} + _attrs_dict = attrs or {} + if 'features' in _attrs_dict or 'require_features' in _attrs_dict: + Feature.warn_deprecated() + self.require_features = [] + self.features = {} + self.dist_files = [] + self.src_root = attrs and attrs.pop("src_root", None) + self.patch_missing_pkg_info(attrs) + # Make sure we have any eggs needed to interpret 'attrs' + if attrs is not None: + self.dependency_links = attrs.pop('dependency_links', []) + assert_string_list(self, 'dependency_links', self.dependency_links) + if attrs and 'setup_requires' in attrs: + self.fetch_build_eggs(attrs['setup_requires']) + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + vars(self).setdefault(ep.name, None) + _Distribution.__init__(self, attrs) + if isinstance(self.metadata.version, numbers.Number): + # Some people apparently take "version number" too literally :) + self.metadata.version = str(self.metadata.version) + + if self.metadata.version is not None: + try: + ver = packaging.version.Version(self.metadata.version) + normalized_version = str(ver) + if self.metadata.version != normalized_version: + warnings.warn( + "Normalizing '%s' to '%s'" % ( + self.metadata.version, + normalized_version, + ) + ) + self.metadata.version = normalized_version + except (packaging.version.InvalidVersion, TypeError): + warnings.warn( + "The version specified (%r) is an invalid version, this " + "may not work as expected with newer versions of " + "setuptools, pip, and PyPI. Please see PEP 440 for more " + "details." % self.metadata.version + ) + if getattr(self, 'python_requires', None): + self.metadata.python_requires = self.python_requires + + def parse_config_files(self, filenames=None): + """Parses configuration files from various levels + and loads configuration. + + """ + _Distribution.parse_config_files(self, filenames=filenames) + + parse_configuration(self, self.command_options) + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self, name): + """Convert feature name to corresponding option attribute name""" + return 'with_' + name.replace('-', '_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) + return resolved_dists + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self, ep.name, None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [os.path.abspath(p) for p in self.convert_2to3_doctests] + else: + self.convert_2to3_doctests = [] + + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + + try: + cmd = self._egg_fetcher + cmd.package_index.to_scan = [] + except AttributeError: + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + dist.parse_config_files() + opts = dist.get_option_dict('easy_install') + keep = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts' + ) + for key in list(opts): + if key not in keep: + del opts[key] # don't use any other settings + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1].split() + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + self._egg_fetcher = cmd + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name, feature in self.features.items(): + self._set_feature(name, None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef = '' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + go.append(('with-' + name, None, 'include ' + descr + incdef)) + go.append(('without-' + name, None, 'exclude ' + descr + excdef)) + no['without-' + name] = 'with-' + name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name, feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name, 1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name, feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name, 0) + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + for ep in pkg_resources.iter_entry_points('distutils.commands', command): + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + def get_command_list(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.get_command_list(self) + + def _set_feature(self, name, status): + """Set feature's inclusion status""" + setattr(self, self._feature_attrname(name), status) + + def feature_is_included(self, name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self, self._feature_attrname(name)) + + def include_feature(self, name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name) == 0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name, 1) + + def include(self, **attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) + if include: + include(v) + else: + self._include_misc(k, v) + + def exclude_package(self, package): + """Remove packages, modules, and extensions in named package""" + + pfx = package + '.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + def has_contents_for(self, package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package + '.' + + for p in self.iter_distribution_names(): + if p == package or p.startswith(pfx): + return True + + def _exclude_misc(self, name, value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self, name, [item for item in old if item not in value]) + + def _include_misc(self, name, value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self, name, value) + elif not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + else: + setattr(self, name, old + [item for item in value if item not in old]) + + def exclude(self, **attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k, v) + + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias, True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class, 'command_consumes_arguments', None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd, opts in self.command_options.items(): + + for opt, (src, val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_', '-') + + if val == 0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val == 1: + val = None + + d.setdefault(cmd, {})[opt] = val + + return d + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext, tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if six.PY2 or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + import io + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +class Feature: + """ + **deprecated** -- The `Feature` facility was never completely implemented + or supported, `has reported issues + <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in + a future version. + + A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + + @staticmethod + def warn_deprecated(): + warnings.warn( + "Features are deprecated and will be removed in a future " + "version. See https://github.com/pypa/setuptools/issues/65.", + DeprecationWarning, + stacklevel=3, + ) + + def __init__(self, description, standard=False, available=True, + optional=True, require_features=(), remove=(), **extras): + self.warn_deprecated() + + self.description = description + self.standard = standard + self.available = available + self.optional = optional + if isinstance(require_features, (str, Require)): + require_features = require_features, + + self.require_features = [ + r for r in require_features if isinstance(r, str) + ] + er = [r for r in require_features if not isinstance(r, str)] + if er: + extras['require_features'] = er + + if isinstance(remove, str): + remove = remove, + self.remove = remove + self.extras = extras + + if not remove and not require_features and not extras: + raise DistutilsSetupError( + "Feature %s: must define 'require_features', 'remove', or at least one" + " of 'packages', 'py_modules', etc." + ) + + def include_by_default(self): + """Should this feature be included by default?""" + return self.available and self.standard + + def include_in(self, dist): + """Ensure feature and its requirements are included in distribution + + You may override this in a subclass to perform additional operations on + the distribution. Note that this method may be called more than once + per feature, and so should be idempotent. + + """ + + if not self.available: + raise DistutilsPlatformError( + self.description + " is required, " + "but is not available on this platform" + ) + + dist.include(**self.extras) + + for f in self.require_features: + dist.include_feature(f) + + def exclude_from(self, dist): + """Ensure feature is excluded from distribution + + You may override this in a subclass to perform additional operations on + the distribution. This method will be called at most once per + feature, and only after all included features have been asked to + include themselves. + """ + + dist.exclude(**self.extras) + + if self.remove: + for item in self.remove: + dist.exclude_package(item) + + def validate(self, dist): + """Verify that feature makes sense in context of distribution + + This method is called by the distribution just before it parses its + command line. It checks to ensure that the 'remove' attribute, if any, + contains only valid package/module names that are present in the base + distribution when 'setup()' is called. You may override it in a + subclass to perform any other required validation of the feature + against a target distribution. + """ + + for item in self.remove: + if not dist.has_contents_for(item): + raise DistutilsSetupError( + "%s wants to be able to remove %s, but the distribution" + " doesn't contain any packages or modules under %s" + % (self.description, item, item) + ) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extension.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extension.py new file mode 100644 index 0000000..2946889 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extension.py @@ -0,0 +1,57 @@ +import re +import functools +import distutils.core +import distutils.errors +import distutils.extension + +from setuptools.extern.six.moves import map + +from .monkey import get_unpatched + + +def _have_cython(): + """ + Return True if Cython can be imported. + """ + cython_impl = 'Cython.Distutils.build_ext' + try: + # from (cython_impl) import build_ext + __import__(cython_impl, fromlist=['build_ext']).build_ext + return True + except Exception: + pass + return False + + +# for compatibility +have_pyrex = _have_cython + +_Extension = get_unpatched(distutils.core.Extension) + + +class Extension(_Extension): + """Extension that uses '.c' files in place of '.pyx' files""" + + def __init__(self, name, sources, *args, **kw): + # The *args is needed for compatibility as calls may use positional + # arguments. py_limited_api may be set only via keyword. + self.py_limited_api = kw.pop("py_limited_api", False) + _Extension.__init__(self, name, sources, *args, **kw) + + def _convert_pyx_sources_to_lang(self): + """ + Replace sources with .pyx extensions to sources with the target + language extension. This mechanism allows language authors to supply + pre-converted sources but to prefer the .pyx sources. + """ + if _have_cython(): + # the build has Cython, so allow it to compile the .pyx files + return + lang = self.language or '' + target_ext = '.cpp' if lang.lower() == 'c++' else '.c' + sub = functools.partial(re.sub, '.pyx$', target_ext) + self.sources = list(map(sub, self.sources)) + + +class Library(Extension): + """Just like a regular Extension, but built as a library instead""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__init__.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__init__.py new file mode 100644 index 0000000..2cd08b7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__init__.py @@ -0,0 +1,4 @@ +from pkg_resources.extern import VendorImporter + +names = 'six', +VendorImporter(__name__, names, 'pkg_resources._vendor').install() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__pycache__/__init__.cpython-35.pyc b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/extern/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5be6fe0c86b06a3b3cd8256bef5e0d06a6f81df GIT binary patch literal 305 zcmY*VyGjH>5bWOBJs08R0>y9G;BE~B4MfDu#6&Q-WH_8gM(4%MtemFzEe8J5q(=UN zk-evgHr+)*S5-qFPN%!GSE3C7yz~54&Fq3F9Wf|w1Os3ZmI$aCSXMv?B!DVV0yY93 zYTy)9HQaQQ4|YL^W$%`p^6|<BA2Y=wl3u?YgvWasDfuDZQCi5St>(JJC`MOP_WuiL z%~lsHUY5qKETz&)IT9($j&>=pjCq6DvS16JmwmRO4?4_$w(}D@K2@1~pC}I@dvDTT e`hB98QahccT!iP+o>{L3L+8k`Y5d2mn&1~Ji&O~! literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/glob.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/glob.py new file mode 100644 index 0000000..6c781de --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/glob.py @@ -0,0 +1,176 @@ +""" +Filename globbing utility. Mostly a copy of `glob` from Python 3.5. + +Changes include: + * `yield from` and PEP3102 `*` removed. + * `bytes` changed to `six.binary_type`. + * Hidden files are not ignored. +""" + +import os +import re +import fnmatch +from setuptools.extern.six import binary_type + +__all__ = ["glob", "iglob", "escape"] + + +def glob(pathname, recursive=False): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + return list(iglob(pathname, recursive=recursive)) + + +def iglob(pathname, recursive=False): + """Return an iterator which yields the paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + it = _iglob(pathname, recursive) + if recursive and _isrecursive(pathname): + s = next(it) # skip empty string + assert not s + return it + + +def _iglob(pathname, recursive): + dirname, basename = os.path.split(pathname) + if not has_magic(pathname): + if basename: + if os.path.lexists(pathname): + yield pathname + else: + # Patterns ending with a slash should match only directories + if os.path.isdir(dirname): + yield pathname + return + if not dirname: + if recursive and _isrecursive(basename): + for x in glob2(dirname, basename): + yield x + else: + for x in glob1(dirname, basename): + yield x + return + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): + dirs = _iglob(dirname, recursive) + else: + dirs = [dirname] + if has_magic(basename): + if recursive and _isrecursive(basename): + glob_in_dir = glob2 + else: + glob_in_dir = glob1 + else: + glob_in_dir = glob0 + for dirname in dirs: + for name in glob_in_dir(dirname, basename): + yield os.path.join(dirname, name) + + +# These 2 helper functions non-recursively glob inside a literal directory. +# They return a list of basenames. `glob1` accepts a pattern while `glob0` +# takes a literal basename (so it only has to check for its existence). + + +def glob1(dirname, pattern): + if not dirname: + if isinstance(pattern, binary_type): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except OSError: + return [] + return fnmatch.filter(names, pattern) + + +def glob0(dirname, basename): + if not basename: + # `os.path.split()` returns an empty basename for paths ending with a + # directory separator. 'q*x/' should match only directories. + if os.path.isdir(dirname): + return [basename] + else: + if os.path.lexists(os.path.join(dirname, basename)): + return [basename] + return [] + + +# This helper function recursively yields relative pathnames inside a literal +# directory. + + +def glob2(dirname, pattern): + assert _isrecursive(pattern) + yield pattern[:0] + for x in _rlistdir(dirname): + yield x + + +# Recursively yields relative pathnames inside a literal directory. +def _rlistdir(dirname): + if not dirname: + if isinstance(dirname, binary_type): + dirname = binary_type(os.curdir, 'ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return + for x in names: + yield x + path = os.path.join(dirname, x) if dirname else x + for y in _rlistdir(path): + yield os.path.join(x, y) + + +magic_check = re.compile('([*?[])') +magic_check_bytes = re.compile(b'([*?[])') + + +def has_magic(s): + if isinstance(s, binary_type): + match = magic_check_bytes.search(s) + else: + match = magic_check.search(s) + return match is not None + + +def _isrecursive(pattern): + if isinstance(pattern, binary_type): + return pattern == b'**' + else: + return pattern == '**' + + +def escape(pathname): + """Escape all special characters. + """ + # Escaping is done by wrapping any of "*?[" between square brackets. + # Metacharacters do not work in the drive part and shouldn't be escaped. + drive, pathname = os.path.splitdrive(pathname) + if isinstance(pathname, binary_type): + pathname = magic_check_bytes.sub(br'[\1]', pathname) + else: + pathname = magic_check.sub(r'[\1]', pathname) + return drive + pathname diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui-32.exe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui-64.exe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui.exe b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/gui.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/launch.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/launch.py new file mode 100644 index 0000000..308283e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/launch.py @@ -0,0 +1,35 @@ +""" +Launch the Python script on the command line after +setuptools is bootstrapped via import. +""" + +# Note that setuptools gets imported implicitly by the +# invocation of this script using python -m setuptools.launch + +import tokenize +import sys + + +def run(): + """ + Run the script in sys.argv[1] as if it had + been invoked naturally. + """ + __builtins__ + script_name = sys.argv[1] + namespace = dict( + __file__=script_name, + __name__='__main__', + __doc__=None, + ) + sys.argv[:] = sys.argv[1:] + + open_ = getattr(tokenize, 'open', open) + script = open_(script_name).read() + norm_script = script.replace('\\r\\n', '\\n') + code = compile(norm_script, script_name, 'exec') + exec(code, namespace) + + +if __name__ == '__main__': + run() diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/lib2to3_ex.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/lib2to3_ex.py new file mode 100644 index 0000000..4b1a73f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/lib2to3_ex.py @@ -0,0 +1,62 @@ +""" +Customized Mixin2to3 support: + + - adds support for converting doctests + + +This module raises an ImportError on Python 2. +""" + +from distutils.util import Mixin2to3 as _Mixin2to3 +from distutils import log +from lib2to3.refactor import RefactoringTool, get_fixers_from_package + +import setuptools + + +class DistutilsRefactoringTool(RefactoringTool): + def log_error(self, msg, *args, **kw): + log.error(msg, *args) + + def log_message(self, msg, *args): + log.info(msg, *args) + + def log_debug(self, msg, *args): + log.debug(msg, *args) + + +class Mixin2to3(_Mixin2to3): + def run_2to3(self, files, doctests=False): + # See of the distribution option has been set, otherwise check the + # setuptools default. + if self.distribution.use_2to3 is not True: + return + if not files: + return + log.info("Fixing " + " ".join(files)) + self.__build_fixer_names() + self.__exclude_fixers() + if doctests: + if setuptools.run_2to3_on_doctests: + r = DistutilsRefactoringTool(self.fixer_names) + r.refactor(files, write=True, doctests_only=True) + else: + _Mixin2to3.run_2to3(self, files) + + def __build_fixer_names(self): + if self.fixer_names: + return + self.fixer_names = [] + for p in setuptools.lib2to3_fixer_packages: + self.fixer_names.extend(get_fixers_from_package(p)) + if self.distribution.use_2to3_fixers is not None: + for p in self.distribution.use_2to3_fixers: + self.fixer_names.extend(get_fixers_from_package(p)) + + def __exclude_fixers(self): + excluded_fixers = getattr(self, 'exclude_fixers', []) + if self.distribution.use_2to3_exclude_fixers is not None: + excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) + for fixer_name in excluded_fixers: + if fixer_name in self.fixer_names: + self.fixer_names.remove(fixer_name) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/monkey.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/monkey.py new file mode 100644 index 0000000..dbe9a61 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/monkey.py @@ -0,0 +1,191 @@ +""" +Monkey patching of distutils. +""" + +import sys +import distutils.filelist +import platform +import types +import functools +import inspect + +from .py26compat import import_module +from setuptools.extern import six + +import setuptools + +__all__ = [] +""" +Everything is private. Contact the project team +if you think you need this functionality. +""" + + +def get_unpatched(item): + lookup = ( + get_unpatched_class if isinstance(item, six.class_types) else + get_unpatched_function if isinstance(item, types.FunctionType) else + lambda item: None + ) + return lookup(item) + + +def get_unpatched_class(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + external_bases = ( + cls + for cls in inspect.getmro(cls) + if not cls.__module__.startswith('setuptools') + ) + base = next(external_bases) + if not base.__module__.startswith('distutils'): + msg = "distutils has already been patched by %r" % cls + raise AssertionError(msg) + return base + + +def patch_all(): + # we can't patch distutils.cmd, alas + distutils.core.Command = setuptools.Command + + has_issue_12885 = ( + sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + or + (3, 6) < sys.version_info + ) + + if has_issue_12885: + # fix findall bug in distutils (http://bugs.python.org/issue12885) + distutils.filelist.findall = setuptools.findall + + needs_warehouse = ( + sys.version_info < (2, 7, 13) + or + (3, 0) < sys.version_info < (3, 3, 7) + or + (3, 4) < sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + or + (3, 6) < sys.version_info + ) + + if needs_warehouse: + warehouse = 'https://upload.pypi.org/legacy/' + distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse + + _patch_distribution_metadata_write_pkg_file() + _patch_distribution_metadata_write_pkg_info() + + # Install Distribution throughout the distutils + for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = setuptools.dist.Distribution + + # Install the patched Extension + distutils.core.Extension = setuptools.extension.Extension + distutils.extension.Extension = setuptools.extension.Extension + if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = ( + setuptools.extension.Extension + ) + + patch_for_msvc_specialized_compiler() + + +def _patch_distribution_metadata_write_pkg_file(): + """Patch write_pkg_file to also write Requires-Python/Requires-External""" + distutils.dist.DistributionMetadata.write_pkg_file = ( + setuptools.dist.write_pkg_file + ) + + +def _patch_distribution_metadata_write_pkg_info(): + """ + Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local + encoding to save the pkg_info. Monkey-patch its write_pkg_info method to + correct this undesirable behavior. + """ + environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2) + if not environment_local: + return + + distutils.dist.DistributionMetadata.write_pkg_info = ( + setuptools.dist.write_pkg_info + ) + + +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to + # point to the original. + vars(replacement).setdefault('unpatched', original) + + # replace the function in the original module + setattr(target_mod, func_name, replacement) + + +def get_unpatched_function(candidate): + return getattr(candidate, 'unpatched') + + +def patch_for_msvc_specialized_compiler(): + """ + Patch functions in distutils to use standalone Microsoft Visual C++ + compilers. + """ + # import late to avoid circular imports on Python < 3.5 + msvc = import_module('setuptools.msvc') + + if platform.system() != 'Windows': + # Compilers only availables on Microsoft Windows + return + + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + + try: + # Patch distutils.msvc9compiler + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler._get_vc_env + patch_func(*msvc14('_get_vc_env')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler.gen_lib_options for Numpy + patch_func(*msvc14('gen_lib_options')) + except ImportError: + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/msvc.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/msvc.py new file mode 100644 index 0000000..447ddb3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/msvc.py @@ -0,0 +1,1193 @@ +""" +Improved support for Microsoft Visual C++ compilers. + +Known supported compilers: +-------------------------- +Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64); + Microsoft Windows SDK 7.0 (x86, x64, ia64); + Microsoft Windows SDK 6.1 (x86, x64, ia64) + +Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + +Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) +""" + +import os +import sys +import platform +import itertools +import distutils.errors +from pkg_resources.extern.packaging.version import LegacyVersion + +from setuptools.extern.six.moves import filterfalse + +from .monkey import get_unpatched + +if platform.system() == 'Windows': + from setuptools.extern.six.moves import winreg + safe_env = os.environ +else: + """ + Mock winreg and environ so the module can be imported + on this platform. + """ + + class winreg: + HKEY_USERS = None + HKEY_CURRENT_USER = None + HKEY_LOCAL_MACHINE = None + HKEY_CLASSES_ROOT = None + + safe_env = dict() + +try: + from distutils.msvc9compiler import Reg +except ImportError: + pass + + +def msvc9_find_vcvarsall(version): + """ + Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone + compiler build for Python (VCForPython). Fall back to original behavior + when the standalone compiler is not available. + + Redirect the path of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + + Parameters + ---------- + version: float + Required Microsoft Visual C++ version. + + Return + ------ + vcvarsall.bat path: str + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return get_unpatched(msvc9_find_vcvarsall)(version) + + +def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): + """ + Patched "distutils.msvc9compiler.query_vcvarsall" for support standalones + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64); + Microsoft Windows SDK 7.0 (x86, x64, ia64); + Microsoft Windows SDK 6.1 (x86, x64, ia64) + + Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + + Parameters + ---------- + ver: float + Required Microsoft Visual C++ version. + arch: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environement from vcvarsall.bat (Classical way) + try: + orig = get_unpatched(msvc9_query_vcvarsall) + return orig(ver, arch, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + # Pass error if Vcvarsall.bat is missing + pass + except ValueError: + # Pass error if environment not set after executing vcvarsall.bat + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(arch, ver).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, ver, arch) + raise + + +def msvc14_get_vc_env(plat_spec): + """ + Patched "distutils._msvccompiler._get_vc_env" for support standalones + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + + Parameters + ---------- + plat_spec: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environment from vcvarsall.bat (Classical way) + try: + return get_unpatched(msvc14_get_vc_env)(plat_spec) + except distutils.errors.DistutilsPlatformError: + # Pass error Vcvarsall.bat is missing + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, 14.0) + raise + + +def msvc14_gen_lib_options(*args, **kwargs): + """ + Patched "distutils._msvccompiler.gen_lib_options" for fix + compatibility between "numpy.distutils" and "distutils._msvccompiler" + (for Numpy < 1.11.2) + """ + if "numpy.distutils" in sys.modules: + import numpy as np + if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): + return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) + return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) + + +def _augment_exception(exc, version, arch=''): + """ + Add details to the exception message to help guide the user + as to what action will resolve it. + """ + # Error if MSVC++ directory not found or environment not set + message = exc.args[0] + + if "vcvarsall" in message.lower() or "visual c" in message.lower(): + # Special error message if MSVC++ not installed + tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' + message = tmpl.format(**locals()) + msdownload = 'www.microsoft.com/download/details.aspx?id=%d' + if version == 9.0: + if arch.lower().find('ia64') > -1: + # For VC++ 9.0, if IA64 support is needed, redirect user + # to Windows SDK 7.0 + message += ' Get it with "Microsoft Windows SDK 7.0": ' + message += msdownload % 3138 + else: + # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + message += ' Get it from http://aka.ms/vcpython27' + elif version == 10.0: + # For VC++ 10.0 Redirect user to Windows SDK 7.1 + message += ' Get it with "Microsoft Windows SDK 7.1": ' + message += msdownload % 8279 + elif version >= 14.0: + # For VC++ 14.0 Redirect user to Visual C++ Build Tools + message += (' Get it with "Microsoft Visual C++ Build Tools": ' + r'http://landinghub.visualstudio.com/' + 'visual-cpp-build-tools') + + exc.args = (message, ) + + +class PlatformInfo: + """ + Current and Target Architectures informations. + + Parameters + ---------- + arch: str + Target architecture. + """ + current_cpu = safe_env.get('processor_architecture', '').lower() + + def __init__(self, arch): + self.arch = arch.lower().replace('x64', 'amd64') + + @property + def target_cpu(self): + return self.arch[self.arch.find('_') + 1:] + + def target_is_x86(self): + return self.target_cpu == 'x86' + + def current_is_x86(self): + return self.current_cpu == 'x86' + + def current_dir(self, hidex86=False, x64=False): + """ + Current platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\target', or '' (see hidex86 parameter) + """ + return ( + '' if (self.current_cpu == 'x86' and hidex86) else + r'\x64' if (self.current_cpu == 'amd64' and x64) else + r'\%s' % self.current_cpu + ) + + def target_dir(self, hidex86=False, x64=False): + """ + Target platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\current', or '' (see hidex86 parameter) + """ + return ( + '' if (self.target_cpu == 'x86' and hidex86) else + r'\x64' if (self.target_cpu == 'amd64' and x64) else + r'\%s' % self.target_cpu + ) + + def cross_dir(self, forcex86=False): + """ + Cross platform specific subfolder. + + Parameters + ---------- + forcex86: bool + Use 'x86' as current architecture even if current acritecture is + not x86. + + Return + ------ + subfolder: str + '' if target architecture is current architecture, + '\current_target' if not. + """ + current = 'x86' if forcex86 else self.current_cpu + return ( + '' if self.target_cpu == current else + self.target_dir().replace('\\', '\\%s_' % current) + ) + + +class RegistryInfo: + """ + Microsoft Visual Studio related registry informations. + + Parameters + ---------- + platform_info: PlatformInfo + "PlatformInfo" instance. + """ + HKEYS = (winreg.HKEY_USERS, + winreg.HKEY_CURRENT_USER, + winreg.HKEY_LOCAL_MACHINE, + winreg.HKEY_CLASSES_ROOT) + + def __init__(self, platform_info): + self.pi = platform_info + + @property + def visualstudio(self): + """ + Microsoft Visual Studio root registry key. + """ + return 'VisualStudio' + + @property + def sxs(self): + """ + Microsoft Visual Studio SxS registry key. + """ + return os.path.join(self.visualstudio, 'SxS') + + @property + def vc(self): + """ + Microsoft Visual C++ VC7 registry key. + """ + return os.path.join(self.sxs, 'VC7') + + @property + def vs(self): + """ + Microsoft Visual Studio VS7 registry key. + """ + return os.path.join(self.sxs, 'VS7') + + @property + def vc_for_python(self): + """ + Microsoft Visual C++ for Python registry key. + """ + return r'DevDiv\VCForPython' + + @property + def microsoft_sdk(self): + """ + Microsoft SDK registry key. + """ + return 'Microsoft SDKs' + + @property + def windows_sdk(self): + """ + Microsoft Windows/Platform SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'Windows') + + @property + def netfx_sdk(self): + """ + Microsoft .NET Framework SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'NETFXSDK') + + @property + def windows_kits_roots(self): + """ + Microsoft Windows Kits Roots registry key. + """ + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else r'\Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) + + def lookup(self, key, name): + """ + Look for values in registry in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + name: str + Value name to find. + + Return + ------ + str: value + """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft + for hkey in self.HKEYS: + try: + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue + try: + return winreg.QueryValueEx(bkey, name)[0] + except (OSError, IOError): + pass + + +class SystemInfo: + """ + Microsoft Windows and Visual Studio related system inormations. + + Parameters + ---------- + registry_info: RegistryInfo + "RegistryInfo" instance. + vc_ver: float + Required Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + WinDir = safe_env.get('WinDir', '') + ProgramFiles = safe_env.get('ProgramFiles', '') + ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + + def __init__(self, registry_info, vc_ver=None): + self.ri = registry_info + self.pi = self.ri.pi + if vc_ver: + self.vc_ver = vc_ver + else: + try: + self.vc_ver = self.find_available_vc_vers()[-1] + except IndexError: + err = 'No Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + def find_available_vc_vers(self): + """ + Find all available Microsoft Visual C++ versions. + """ + vckeys = (self.ri.vc, self.ri.vc_for_python) + vc_vers = [] + for hkey in self.ri.HKEYS: + for key in vckeys: + try: + bkey = winreg.OpenKey(hkey, key, 0, winreg.KEY_READ) + except (OSError, IOError): + continue + subkeys, values, _ = winreg.QueryInfoKey(bkey) + for i in range(values): + try: + ver = float(winreg.EnumValue(bkey, i)[0]) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + for i in range(subkeys): + try: + ver = float(winreg.EnumKey(bkey, i)) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + return sorted(vc_vers) + + @property + def VSInstallDir(self): + """ + Microsoft Visual Studio directory. + """ + # Default path + name = 'Microsoft Visual Studio %0.1f' % self.vc_ver + default = os.path.join(self.ProgramFilesx86, name) + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + + @property + def VCInstallDir(self): + """ + Microsoft Visual C++ directory. + """ + # Default path + default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver + guess_vc = os.path.join(self.ProgramFilesx86, default) + + # Try to get "VC++ for Python" path from registry as default path + reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc + + # Try to get path from registry, if fail use default path + path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + + if not os.path.isdir(path): + msg = 'Microsoft Visual C++ directory not found' + raise distutils.errors.DistutilsPlatformError(msg) + + return path + + @property + def WindowsSdkVersion(self): + """ + Microsoft Windows SDK versions. + """ + # Set Windows SDK versions for specified MSVC++ version + if self.vc_ver <= 9.0: + return ('7.0', '6.1', '6.0a') + elif self.vc_ver == 10.0: + return ('7.1', '7.0a') + elif self.vc_ver == 11.0: + return ('8.0', '8.0a') + elif self.vc_ver == 12.0: + return ('8.1', '8.1a') + elif self.vc_ver >= 14.0: + return ('10.0', '8.1') + + @property + def WindowsSdkDir(self): + """ + Microsoft Windows SDK directory. + """ + sdkdir = '' + for ver in self.WindowsSdkVersion: + # Try to get it from registry + loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + sdkdir = self.ri.lookup(loc, 'installationfolder') + if sdkdir: + break + if not sdkdir or not os.path.isdir(sdkdir): + # Try to get "VC++ for Python" version from registry + path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + install_base = self.ri.lookup(path, 'installdir') + if install_base: + sdkdir = os.path.join(install_base, 'WinSDK') + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default new path + for ver in self.WindowsSdkVersion: + intver = ver[:ver.rfind('.')] + path = r'Microsoft SDKs\Windows Kits\%s' % (intver) + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default old path + for ver in self.WindowsSdkVersion: + path = r'Microsoft SDKs\Windows\v%s' % ver + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir: + # If fail, use Platform SDK + sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + return sdkdir + + @property + def WindowsSDKExecutablePath(self): + """ + Microsoft Windows SDK executable directory. + """ + # Find WinSDK NetFx Tools registry dir name + if self.vc_ver <= 11.0: + netfxver = 35 + arch = '' + else: + netfxver = 40 + hidex86 = True if self.vc_ver <= 12.0 else False + arch = self.pi.current_dir(x64=True, hidex86=hidex86) + fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) + + # liste all possibles registry paths + regpaths = [] + if self.vc_ver >= 14.0: + for ver in self.NetFxSdkVersion: + regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + + for ver in self.WindowsSdkVersion: + regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + + # Return installation folder from the more recent path + for path in regpaths: + execpath = self.ri.lookup(path, 'installationfolder') + if execpath: + break + return execpath + + @property + def FSharpInstallDir(self): + """ + Microsoft Visual F# directory. + """ + path = r'%0.1f\Setup\F#' % self.vc_ver + path = os.path.join(self.ri.visualstudio, path) + return self.ri.lookup(path, 'productdir') or '' + + @property + def UniversalCRTSdkDir(self): + """ + Microsoft Universal CRT SDK directory. + """ + # Set Kit Roots versions for specified MSVC++ version + if self.vc_ver >= 14.0: + vers = ('10', '81') + else: + vers = () + + # Find path of the more recent Kit + for ver in vers: + sdkdir = self.ri.lookup(self.ri.windows_kits_roots, + 'kitsroot%s' % ver) + if sdkdir: + break + return sdkdir or '' + + @property + def NetFxSdkVersion(self): + """ + Microsoft .NET Framework SDK versions. + """ + # Set FxSdk versions for specified MSVC++ version + if self.vc_ver >= 14.0: + return ('4.6.1', '4.6') + else: + return () + + @property + def NetFxSdkDir(self): + """ + Microsoft .NET Framework SDK directory. + """ + for ver in self.NetFxSdkVersion: + loc = os.path.join(self.ri.netfx_sdk, ver) + sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') + if sdkdir: + break + return sdkdir or '' + + @property + def FrameworkDir32(self): + """ + Microsoft .NET Framework 32bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw + + @property + def FrameworkDir64(self): + """ + Microsoft .NET Framework 64bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw + + @property + def FrameworkVersion32(self): + """ + Microsoft .NET Framework 32bit versions. + """ + return self._find_dot_net_versions(32) + + @property + def FrameworkVersion64(self): + """ + Microsoft .NET Framework 64bit versions. + """ + return self._find_dot_net_versions(64) + + def _find_dot_net_versions(self, bits=32): + """ + Find Microsoft .NET Framework versions. + + Parameters + ---------- + bits: int + Platform number of bits: 32 or 64. + """ + # Find actual .NET version + ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) or '' + + # Set .NET versions for specified MSVC++ version + if self.vc_ver >= 12.0: + frameworkver = (ver, 'v4.0') + elif self.vc_ver >= 10.0: + frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, + 'v3.5') + elif self.vc_ver == 9.0: + frameworkver = ('v3.5', 'v2.0.50727') + if self.vc_ver == 8.0: + frameworkver = ('v3.0', 'v2.0.50727') + return frameworkver + + +class EnvironmentInfo: + """ + Return environment variables for specified Microsoft Visual C++ version + and platform : Lib, Include, Path and libpath. + + This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + + Script created by analysing Microsoft environment configuration files like + "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... + + Parameters + ---------- + arch: str + Target architecture. + vc_ver: float + Required Microsoft Visual C++ version. If not set, autodetect the last + version. + vc_min_ver: float + Minimum Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + + def __init__(self, arch, vc_ver=None, vc_min_ver=None): + self.pi = PlatformInfo(arch) + self.ri = RegistryInfo(self.pi) + self.si = SystemInfo(self.ri, vc_ver) + + if vc_min_ver: + if self.vc_ver < vc_min_ver: + err = 'No suitable Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + @property + def vc_ver(self): + """ + Microsoft Visual C++ version. + """ + return self.si.vc_ver + + @property + def VSTools(self): + """ + Microsoft Visual Studio Tools + """ + paths = [r'Common7\IDE', r'Common7\Tools'] + + if self.vc_ver >= 14.0: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] + paths += [r'Team Tools\Performance Tools'] + paths += [r'Team Tools\Performance Tools%s' % arch_subdir] + + return [os.path.join(self.si.VSInstallDir, path) for path in paths] + + @property + def VCIncludes(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Includes + """ + return [os.path.join(self.si.VCInstallDir, 'Include'), + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + + @property + def VCLibraries(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Libraries + """ + arch_subdir = self.pi.target_dir(hidex86=True) + paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] + + if self.vc_ver >= 14.0: + paths += [r'Lib\store%s' % arch_subdir] + + return [os.path.join(self.si.VCInstallDir, path) for path in paths] + + @property + def VCStoreRefs(self): + """ + Microsoft Visual C++ store references Libraries + """ + if self.vc_ver < 14.0: + return [] + return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + + @property + def VCTools(self): + """ + Microsoft Visual C++ Tools + """ + si = self.si + tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + + forcex86 = True if self.vc_ver <= 10.0 else False + arch_subdir = self.pi.cross_dir(forcex86) + if arch_subdir: + tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + + if self.vc_ver >= 14.0: + path = 'Bin%s' % self.pi.current_dir(hidex86=True) + tools += [os.path.join(si.VCInstallDir, path)] + + else: + tools += [os.path.join(si.VCInstallDir, 'Bin')] + + return tools + + @property + def OSLibraries(self): + """ + Microsoft Windows SDK Libraries + """ + if self.vc_ver <= 10.0: + arch_subdir = self.pi.target_dir(hidex86=True, x64=True) + return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + + else: + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.WindowsSdkDir, 'lib') + libver = self._get_content_dirname(lib) + return [os.path.join(lib, '%sum%s' % (libver, arch_subdir))] + + @property + def OSIncludes(self): + """ + Microsoft Windows SDK Include + """ + include = os.path.join(self.si.WindowsSdkDir, 'include') + + if self.vc_ver <= 10.0: + return [include, os.path.join(include, 'gl')] + + else: + if self.vc_ver >= 14.0: + sdkver = self._get_content_dirname(include) + else: + sdkver = '' + return [os.path.join(include, '%sshared' % sdkver), + os.path.join(include, '%sum' % sdkver), + os.path.join(include, '%swinrt' % sdkver)] + + @property + def OSLibpath(self): + """ + Microsoft Windows SDK Libraries Paths + """ + ref = os.path.join(self.si.WindowsSdkDir, 'References') + libpath = [] + + if self.vc_ver <= 9.0: + libpath += self.OSLibraries + + if self.vc_ver >= 11.0: + libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + + if self.vc_ver >= 14.0: + libpath += [ + ref, + os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), + os.path.join( + ref, + 'Windows.Foundation.UniversalApiContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Foundation.FoundationContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0', + ), + os.path.join( + self.si.WindowsSdkDir, + 'ExtensionSDKs', + 'Microsoft.VCLibs', + '%0.1f' % self.vc_ver, + 'References', + 'CommonConfiguration', + 'neutral', + ), + ] + return libpath + + @property + def SdkTools(self): + """ + Microsoft Windows SDK Tools + """ + bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' + tools = [os.path.join(self.si.WindowsSdkDir, bin_dir)] + + if not self.pi.current_is_x86(): + arch_subdir = self.pi.current_dir(x64=True) + path = 'Bin%s' % arch_subdir + tools += [os.path.join(self.si.WindowsSdkDir, path)] + + if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.pi.target_is_x86(): + arch_subdir = '' + else: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir + tools += [os.path.join(self.si.WindowsSdkDir, path)] + + if self.si.WindowsSDKExecutablePath: + tools += [self.si.WindowsSDKExecutablePath] + + return tools + + @property + def SdkSetup(self): + """ + Microsoft Windows SDK Setup + """ + if self.vc_ver > 9.0: + return [] + + return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + + @property + def FxTools(self): + """ + Microsoft .NET Framework Tools + """ + pi = self.pi + si = self.si + + if self.vc_ver <= 10.0: + include32 = True + include64 = not pi.target_is_x86() and not pi.current_is_x86() + else: + include32 = pi.target_is_x86() or pi.current_is_x86() + include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' + + tools = [] + if include32: + tools += [os.path.join(si.FrameworkDir32, ver) + for ver in si.FrameworkVersion32] + if include64: + tools += [os.path.join(si.FrameworkDir64, ver) + for ver in si.FrameworkVersion64] + return tools + + @property + def NetFxSDKLibraries(self): + """ + Microsoft .Net Framework SDK Libraries + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + + @property + def NetFxSDKIncludes(self): + """ + Microsoft .Net Framework SDK Includes + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + + @property + def VsTDb(self): + """ + Microsoft Visual Studio Team System Database + """ + return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + + @property + def MSBuild(self): + """ + Microsoft Build Engine + """ + if self.vc_ver < 12.0: + return [] + + arch_subdir = self.pi.current_dir(hidex86=True) + path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) + return [os.path.join(self.si.ProgramFilesx86, path)] + + @property + def HTMLHelpWorkshop(self): + """ + Microsoft HTML Help Workshop + """ + if self.vc_ver < 11.0: + return [] + + return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + + @property + def UCRTLibraries(self): + """ + Microsoft Universal CRT Libraries + """ + if self.vc_ver < 14.0: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + ucrtver = self._get_content_dirname(lib) + return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + + @property + def UCRTIncludes(self): + """ + Microsoft Universal CRT Include + """ + if self.vc_ver < 14.0: + return [] + + include = os.path.join(self.si.UniversalCRTSdkDir, 'include') + ucrtver = self._get_content_dirname(include) + return [os.path.join(include, '%sucrt' % ucrtver)] + + @property + def FSharp(self): + """ + Microsoft Visual F# + """ + if self.vc_ver < 11.0 and self.vc_ver > 12.0: + return [] + + return self.si.FSharpInstallDir + + @property + def VCRuntimeRedist(self): + """ + Microsoft Visual C++ runtime redistribuable dll + """ + arch_subdir = self.pi.target_dir(x64=True) + vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + vcruntime = vcruntime % (arch_subdir, self.vc_ver, self.vc_ver) + return os.path.join(self.si.VCInstallDir, vcruntime) + + def return_env(self, exists=True): + """ + Return environment dict. + + Parameters + ---------- + exists: bool + It True, only return existing paths. + """ + env = dict( + include=self._build_paths('include', + [self.VCIncludes, + self.OSIncludes, + self.UCRTIncludes, + self.NetFxSDKIncludes], + exists), + lib=self._build_paths('lib', + [self.VCLibraries, + self.OSLibraries, + self.FxTools, + self.UCRTLibraries, + self.NetFxSDKLibraries], + exists), + libpath=self._build_paths('libpath', + [self.VCLibraries, + self.FxTools, + self.VCStoreRefs, + self.OSLibpath], + exists), + path=self._build_paths('path', + [self.VCTools, + self.VSTools, + self.VsTDb, + self.SdkTools, + self.SdkSetup, + self.FxTools, + self.MSBuild, + self.HTMLHelpWorkshop, + self.FSharp], + exists), + ) + if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + env['py_vcruntime_redist'] = self.VCRuntimeRedist + return env + + def _build_paths(self, name, spec_path_lists, exists): + """ + Given an environment variable name and specified paths, + return a pathsep-separated string of paths containing + unique, extant, directories from those paths and from + the environment variable. Raise an error if no paths + are resolved. + """ + # flatten spec_path_lists + spec_paths = itertools.chain.from_iterable(spec_path_lists) + env_paths = safe_env.get(name, '').split(os.pathsep) + paths = itertools.chain(spec_paths, env_paths) + extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + if not extant_paths: + msg = "%s environment variable is empty" % name.upper() + raise distutils.errors.DistutilsPlatformError(msg) + unique_paths = self._unique_everseen(extant_paths) + return os.pathsep.join(unique_paths) + + # from Python docs + def _unique_everseen(self, iterable, key=None): + """ + List unique elements, preserving order. + Remember all elements ever seen. + + _unique_everseen('AAAABBBCCDAABBB') --> A B C D + + _unique_everseen('ABBCcAD', str.lower) --> A B C D + """ + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + def _get_content_dirname(self, path): + """ + Return name of the first dir in path or '' if no dir found. + + Parameters + ---------- + path: str + Path where search dir. + + Return + ------ + foldername: str + "name\" or "" + """ + try: + name = os.listdir(path) + if name: + return '%s\\' % name[0] + return '' + except (OSError, IOError): + return '' diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/namespaces.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/namespaces.py new file mode 100644 index 0000000..bd17d9e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +import os +from distutils import log +import itertools + +from setuptools.extern.six.moves import map + + +flatten = itertools.chain.from_iterable + + +class Installer: + + nspkg_ext = '-nspkg.pth' + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: + return + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + + def _get_target(self): + return self.target + + _nspkg_tmpl = ( + "import sys, types, os", + "has_mfs = sys.version_info > (3, 5)", + "p = os.path.join(%(root)s, *%(pth)r)", + "importlib = has_mfs and __import__('importlib.util')", + "has_mfs and __import__('importlib.machinery')", + "m = has_mfs and " + "sys.modules.setdefault(%(pkg)r, " + "importlib.util.module_from_spec(" + "importlib.machinery.PathFinder.find_spec(%(pkg)r, " + "[os.path.dirname(p)])))", + "m = m or not has_mfs and " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + def _get_root(self): + return "sys._getframe(1).f_locals['sitedir']" + + def _gen_nspkg_line(self, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + root = self._get_root() + tmpl_lines = self._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += self._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' + + def _get_all_ns_packages(self): + """Return sorted list of all package namespaces""" + pkgs = self.distribution.namespace_packages or [] + return sorted(flatten(map(self._pkg_names, pkgs))) + + @staticmethod + def _pkg_names(pkg): + """ + Given a namespace package, yield the components of that + package. + + >>> names = Installer._pkg_names('a.b.c') + >>> set(names) == set(['a', 'a.b', 'a.b.c']) + True + """ + parts = pkg.split('.') + while parts: + yield '.'.join(parts) + parts.pop() + + +class DevelopInstaller(Installer): + def _get_root(self): + return repr(str(self.egg_path)) + + def _get_target(self): + return self.egg_link diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/package_index.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/package_index.py new file mode 100644 index 0000000..45fac01 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/package_index.py @@ -0,0 +1,1115 @@ +"""PyPI and direct package downloading""" +import sys +import os +import re +import shutil +import socket +import base64 +import hashlib +import itertools +from functools import wraps + +try: + from urllib.parse import splituser +except ImportError: + from urllib2 import splituser + +from setuptools.extern import six +from setuptools.extern.six.moves import urllib, http_client, configparser, map + +import setuptools +from pkg_resources import ( + CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, + Environment, find_distributions, safe_name, safe_version, + to_filename, Requirement, DEVELOP_DIST, +) +from setuptools import ssl_support +from distutils import log +from distutils.errors import DistutilsError +from fnmatch import translate +from setuptools.py26compat import strip_fragment +from setuptools.py27compat import get_all_headers + +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') +HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I) +# this is here to fix emacs' cruddy broken syntax highlighting +PYPI_MD5 = re.compile( + '<a href="([^"#]+)">([^<]+)</a>\n\s+\\(<a (?:title="MD5 hash"\n\s+)' + 'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\\)' +) +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match +EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() + +__all__ = [ + 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', + 'interpret_distro_name', +] + +_SOCKET_TIMEOUT = 15 + +_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" +user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + + +def parse_bdist_wininst(name): + """Return (base,pyversion) or (None,None) for possible .exe name""" + + lower = name.lower() + base, py_ver, plat = None, None, None + + if lower.endswith('.exe'): + if lower.endswith('.win32.exe'): + base = name[:-10] + plat = 'win32' + elif lower.startswith('.win32-py', -16): + py_ver = name[-7:-4] + base = name[:-16] + plat = 'win32' + elif lower.endswith('.win-amd64.exe'): + base = name[:-14] + plat = 'win-amd64' + elif lower.startswith('.win-amd64-py', -20): + py_ver = name[-7:-4] + base = name[:-20] + plat = 'win-amd64' + return base, py_ver, plat + + +def egg_info_for_url(url): + parts = urllib.parse.urlparse(url) + scheme, server, path, parameters, query, fragment = parts + base = urllib.parse.unquote(path.split('/')[-1]) + if server == 'sourceforge.net' and base == 'download': # XXX Yuck + base = urllib.parse.unquote(path.split('/')[-2]) + if '#' in base: + base, fragment = base.split('#', 1) + return base, fragment + + +def distros_for_url(url, metadata=None): + """Yield egg or source distribution objects that might be found at a URL""" + base, fragment = egg_info_for_url(url) + for dist in distros_for_location(url, base, metadata): + yield dist + if fragment: + match = EGG_FRAGMENT.match(fragment) + if match: + for dist in interpret_distro_name( + url, match.group(1), metadata, precedence=CHECKOUT_DIST + ): + yield dist + + +def distros_for_location(location, basename, metadata=None): + """Yield egg or source distribution objects based on basename""" + if basename.endswith('.egg.zip'): + basename = basename[:-4] # strip the .zip + if basename.endswith('.egg') and '-' in basename: + # only one, unambiguous interpretation + return [Distribution.from_location(location, basename, metadata)] + if basename.endswith('.exe'): + win_base, py_ver, platform = parse_bdist_wininst(basename) + if win_base is not None: + return interpret_distro_name( + location, win_base, metadata, py_ver, BINARY_DIST, platform + ) + # Try source distro extensions (.zip, .tgz, etc.) + # + for ext in EXTENSIONS: + if basename.endswith(ext): + basename = basename[:-len(ext)] + return interpret_distro_name(location, basename, metadata) + return [] # no extension matched + + +def distros_for_filename(filename, metadata=None): + """Yield possible egg or source distribution objects based on a filename""" + return distros_for_location( + normalize_path(filename), os.path.basename(filename), metadata + ) + + +def interpret_distro_name( + location, basename, metadata, py_version=None, precedence=SOURCE_DIST, + platform=None + ): + """Generate alternative interpretations of a source distro name + + Note: if `location` is a filesystem filename, you should call + ``pkg_resources.normalize_path()`` on it before passing it to this + routine! + """ + # Generate alternative interpretations of a source distro name + # Because some packages are ambiguous as to name/versions split + # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. + # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" + # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, + # the spurious interpretations should be ignored, because in the event + # there's also an "adns" package, the spurious "python-1.1.0" version will + # compare lower than any numeric version number, and is therefore unlikely + # to match a request for it. It's still a potential problem, though, and + # in the long run PyPI and the distutils should go for "safe" names and + # versions in distribution archive names (sdist and bdist). + + parts = basename.split('-') + if not py_version and any(re.match('py\d\.\d$', p) for p in parts[2:]): + # it is a bdist_dumb, not an sdist -- bail out + return + + for p in range(1, len(parts) + 1): + yield Distribution( + location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), + py_version=py_version, precedence=precedence, + platform=platform + ) + + +# From Python 2.7 docs +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in six.moves.filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def unique_values(func): + """ + Wrap a function returning an iterable such that the resulting iterable + only ever yields unique items. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + return unique_everseen(func(*args, **kwargs)) + + return wrapper + + +REL = re.compile("""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) +# this line is here to fix emacs' cruddy broken syntax highlighting + + +@unique_values +def find_external_links(url, page): + """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" + + for match in REL.finditer(page): + tag, rel = match.groups() + rels = set(map(str.strip, rel.lower().split(','))) + if 'homepage' in rels or 'download' in rels: + for match in HREF.finditer(tag): + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + for tag in ("<th>Home Page", "<th>Download URL"): + pos = page.find(tag) + if pos != -1: + match = HREF.search(page, pos) + if match: + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + +class ContentChecker(object): + """ + A null content checker that defines the interface for checking content + """ + + def feed(self, block): + """ + Feed a block of data to the hash. + """ + return + + def is_valid(self): + """ + Check the hash. Return False if validation fails. + """ + return True + + def report(self, reporter, template): + """ + Call reporter with information about the checker (hash name) + substituted into the template. + """ + return + + +class HashChecker(ContentChecker): + pattern = re.compile( + r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' + r'(?P<expected>[a-f0-9]+)' + ) + + def __init__(self, hash_name, expected): + self.hash_name = hash_name + self.hash = hashlib.new(hash_name) + self.expected = expected + + @classmethod + def from_url(cls, url): + "Construct a (possibly null) ContentChecker from a URL" + fragment = urllib.parse.urlparse(url)[-1] + if not fragment: + return ContentChecker() + match = cls.pattern.search(fragment) + if not match: + return ContentChecker() + return cls(**match.groupdict()) + + def feed(self, block): + self.hash.update(block) + + def is_valid(self): + return self.hash.hexdigest() == self.expected + + def report(self, reporter, template): + msg = template % self.hash_name + return reporter(msg) + + +class PackageIndex(Environment): + """A distribution index that scans web pages for download URLs""" + + def __init__( + self, index_url="https://pypi.python.org/simple", hosts=('*',), + ca_bundle=None, verify_ssl=True, *args, **kw + ): + Environment.__init__(self, *args, **kw) + self.index_url = index_url + "/" [:not index_url.endswith('/')] + self.scanned_urls = {} + self.fetched_urls = {} + self.package_pages = {} + self.allows = re.compile('|'.join(map(translate, hosts))).match + self.to_scan = [] + use_ssl = ( + verify_ssl + and ssl_support.is_available + and (ca_bundle or ssl_support.find_ca_bundle()) + ) + if use_ssl: + self.opener = ssl_support.opener_for(ca_bundle) + else: + self.opener = urllib.request.urlopen + + def process_url(self, url, retrieve=False): + """Evaluate a URL as a possible download, and maybe retrieve it""" + if url in self.scanned_urls and not retrieve: + return + self.scanned_urls[url] = True + if not URL_SCHEME(url): + self.process_filename(url) + return + else: + dists = list(distros_for_url(url)) + if dists: + if not self.url_ok(url): + return + self.debug("Found link: %s", url) + + if dists or not retrieve or url in self.fetched_urls: + list(map(self.add, dists)) + return # don't need the actual page + + if not self.url_ok(url): + self.fetched_urls[url] = True + return + + self.info("Reading %s", url) + self.fetched_urls[url] = True # prevent multiple fetch attempts + tmpl = "Download error on %s: %%s -- Some packages may not be found!" + f = self.open_url(url, tmpl % url) + if f is None: + return + self.fetched_urls[f.url] = True + if 'html' not in f.headers.get('content-type', '').lower(): + f.close() # not html, we can't process it + return + + base = f.url # handle redirects + page = f.read() + if not isinstance(page, str): # We are in Python 3 and got bytes. We want str. + if isinstance(f, urllib.error.HTTPError): + # Errors have no charset, assume latin1: + charset = 'latin-1' + else: + charset = f.headers.get_param('charset') or 'latin-1' + page = page.decode(charset, "ignore") + f.close() + for match in HREF.finditer(page): + link = urllib.parse.urljoin(base, htmldecode(match.group(1))) + self.process_url(link) + if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: + page = self.process_index(url, page) + + def process_filename(self, fn, nested=False): + # process filenames or directories + if not os.path.exists(fn): + self.warn("Not found: %s", fn) + return + + if os.path.isdir(fn) and not nested: + path = os.path.realpath(fn) + for item in os.listdir(path): + self.process_filename(os.path.join(path, item), True) + + dists = distros_for_filename(fn) + if dists: + self.debug("Found: %s", fn) + list(map(self.add, dists)) + + def url_ok(self, url, fatal=False): + s = URL_SCHEME(url) + is_file = s and s.group(1).lower() == 'file' + if is_file or self.allows(urllib.parse.urlparse(url)[1]): + return True + msg = ("\nNote: Bypassing %s (disallowed host; see " + "http://bit.ly/1dg9ijs for details).\n") + if fatal: + raise DistutilsError(msg % url) + else: + self.warn(msg, url) + + def scan_egg_links(self, search_path): + dirs = filter(os.path.isdir, search_path) + egg_links = ( + (path, entry) + for path in dirs + for entry in os.listdir(path) + if entry.endswith('.egg-link') + ) + list(itertools.starmap(self.scan_egg_link, egg_links)) + + def scan_egg_link(self, path, entry): + with open(os.path.join(path, entry)) as raw_lines: + # filter non-empty lines + lines = list(filter(None, map(str.strip, raw_lines))) + + if len(lines) != 2: + # format is not recognized; punt + return + + egg_path, setup_path = lines + + for dist in find_distributions(os.path.join(path, egg_path)): + dist.location = os.path.join(path, *lines) + dist.precedence = SOURCE_DIST + self.add(dist) + + def process_index(self, url, page): + """Process the contents of a PyPI page""" + + def scan(link): + # Process a URL to see if it's for a package page + if link.startswith(self.index_url): + parts = list(map( + urllib.parse.unquote, link[len(self.index_url):].split('/') + )) + if len(parts) == 2 and '#' not in parts[1]: + # it's a package page, sanitize and index it + pkg = safe_name(parts[0]) + ver = safe_version(parts[1]) + self.package_pages.setdefault(pkg.lower(), {})[link] = True + return to_filename(pkg), to_filename(ver) + return None, None + + # process an index page into the package-page index + for match in HREF.finditer(page): + try: + scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) + except ValueError: + pass + + pkg, ver = scan(url) # ensure this page is in the page index + if pkg: + # process individual package page + for new_url in find_external_links(url, page): + # Process the found URL + base, frag = egg_info_for_url(new_url) + if base.endswith('.py') and not frag: + if ver: + new_url += '#egg=%s-%s' % (pkg, ver) + else: + self.need_version_info(url) + self.scan_url(new_url) + + return PYPI_MD5.sub( + lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page + ) + else: + return "" # no sense double-scanning non-package pages + + def need_version_info(self, url): + self.scan_all( + "Page at %s links to .py file(s) without version info; an index " + "scan is required.", url + ) + + def scan_all(self, msg=None, *args): + if self.index_url not in self.fetched_urls: + if msg: + self.warn(msg, *args) + self.info( + "Scanning index of all packages (this may take a while)" + ) + self.scan_url(self.index_url) + + def find_packages(self, requirement): + self.scan_url(self.index_url + requirement.unsafe_name + '/') + + if not self.package_pages.get(requirement.key): + # Fall back to safe version of the name + self.scan_url(self.index_url + requirement.project_name + '/') + + if not self.package_pages.get(requirement.key): + # We couldn't find the target package, so search the index page too + self.not_found_in_index(requirement) + + for url in list(self.package_pages.get(requirement.key, ())): + # scan each page that might be related to the desired package + self.scan_url(url) + + def obtain(self, requirement, installer=None): + self.prescan() + self.find_packages(requirement) + for dist in self[requirement.key]: + if dist in requirement: + return dist + self.debug("%s does not match %s", requirement, dist) + return super(PackageIndex, self).obtain(requirement, installer) + + def check_hash(self, checker, filename, tfp): + """ + checker is a ContentChecker + """ + checker.report(self.debug, + "Validating %%s checksum for %s" % filename) + if not checker.is_valid(): + tfp.close() + os.unlink(filename) + raise DistutilsError( + "%s validation failed for %s; " + "possible download problem?" % ( + checker.hash.name, os.path.basename(filename)) + ) + + def add_find_links(self, urls): + """Add `urls` to the list that will be prescanned for searches""" + for url in urls: + if ( + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory + or url.startswith('file:') + or list(distros_for_url(url)) # or a direct package link + ): + # then go ahead and process it now + self.scan_url(url) + else: + # otherwise, defer retrieval till later + self.to_scan.append(url) + + def prescan(self): + """Scan urls scheduled for prescanning (e.g. --find-links)""" + if self.to_scan: + list(map(self.scan_url, self.to_scan)) + self.to_scan = None # from now on, go ahead and process immediately + + def not_found_in_index(self, requirement): + if self[requirement.key]: # we've seen at least one distro + meth, msg = self.info, "Couldn't retrieve index page for %r" + else: # no distros seen for this name, might be misspelled + meth, msg = (self.warn, + "Couldn't find index page for %r (maybe misspelled?)") + meth(msg, requirement.unsafe_name) + self.scan_all() + + def download(self, spec, tmpdir): + """Locate and/or download `spec` to `tmpdir`, returning a local path + + `spec` may be a ``Requirement`` object, or a string containing a URL, + an existing local filename, or a project/version requirement spec + (i.e. the string form of a ``Requirement`` object). If it is the URL + of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one + that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is + automatically created alongside the downloaded file. + + If `spec` is a ``Requirement`` object or a string containing a + project/version requirement spec, this method returns the location of + a matching distribution (possibly after downloading it to `tmpdir`). + If `spec` is a locally existing file or directory name, it is simply + returned unchanged. If `spec` is a URL, it is downloaded to a subpath + of `tmpdir`, and the local filename is returned. Various errors may be + raised if a problem occurs during downloading. + """ + if not isinstance(spec, Requirement): + scheme = URL_SCHEME(spec) + if scheme: + # It's a url, download it to tmpdir + found = self._download_url(scheme.group(1), spec, tmpdir) + base, fragment = egg_info_for_url(spec) + if base.endswith('.py'): + found = self.gen_setup(found, fragment, tmpdir) + return found + elif os.path.exists(spec): + # Existing file or directory, just return it + return spec + else: + spec = parse_requirement_arg(spec) + return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) + + def fetch_distribution( + self, requirement, tmpdir, force_scan=False, source=False, + develop_ok=False, local_index=None + ): + """Obtain a distribution suitable for fulfilling `requirement` + + `requirement` must be a ``pkg_resources.Requirement`` instance. + If necessary, or if the `force_scan` flag is set, the requirement is + searched for in the (online) package index as well as the locally + installed packages. If a distribution matching `requirement` is found, + the returned distribution's ``location`` is the value you would have + gotten from calling the ``download()`` method with the matching + distribution's URL or filename. If no matching distribution is found, + ``None`` is returned. + + If the `source` flag is set, only source distributions and source + checkout links will be considered. Unless the `develop_ok` flag is + set, development and system eggs (i.e., those using the ``.egg-info`` + format) will be ignored. + """ + # process a Requirement + self.info("Searching for %s", requirement) + skipped = {} + dist = None + + def find(req, env=None): + if env is None: + env = self + # Find a matching distribution; may be called more than once + + for dist in env[req.key]: + + if dist.precedence == DEVELOP_DIST and not develop_ok: + if dist not in skipped: + self.warn("Skipping development or system egg: %s", dist) + skipped[dist] = 1 + continue + + if dist in req and (dist.precedence <= SOURCE_DIST or not source): + dist.download_location = self.download(dist.location, tmpdir) + if os.path.exists(dist.download_location): + return dist + + if force_scan: + self.prescan() + self.find_packages(requirement) + dist = find(requirement) + + if not dist and local_index is not None: + dist = find(requirement, local_index) + + if dist is None: + if self.to_scan is not None: + self.prescan() + dist = find(requirement) + + if dist is None and not force_scan: + self.find_packages(requirement) + dist = find(requirement) + + if dist is None: + self.warn( + "No local packages or working download links found for %s%s", + (source and "a source distribution of " or ""), + requirement, + ) + else: + self.info("Best match: %s", dist) + return dist.clone(location=dist.download_location) + + def fetch(self, requirement, tmpdir, force_scan=False, source=False): + """Obtain a file suitable for fulfilling `requirement` + + DEPRECATED; use the ``fetch_distribution()`` method now instead. For + backward compatibility, this routine is identical but returns the + ``location`` of the downloaded distribution instead of a distribution + object. + """ + dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) + if dist is not None: + return dist.location + return None + + def gen_setup(self, filename, fragment, tmpdir): + match = EGG_FRAGMENT.match(fragment) + dists = match and [ + d for d in + interpret_distro_name(filename, match.group(1), None) if d.version + ] or [] + + if len(dists) == 1: # unambiguous ``#egg`` fragment + basename = os.path.basename(filename) + + # Make sure the file has been downloaded to the temp dir. + if os.path.dirname(filename) != tmpdir: + dst = os.path.join(tmpdir, basename) + from setuptools.command.easy_install import samefile + if not samefile(filename, dst): + shutil.copy2(filename, dst) + filename = dst + + with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) + ) + return filename + + elif match: + raise DistutilsError( + "Can't unambiguously interpret project/version identifier %r; " + "any dashes in the name or version should be escaped using " + "underscores. %r" % (fragment, dists) + ) + else: + raise DistutilsError( + "Can't process plain .py files without an '#egg=name-version'" + " suffix to enable automatic setup script generation." + ) + + dl_blocksize = 8192 + + def _download_to(self, url, filename): + self.info("Downloading %s", url) + # Download the file + fp, info = None, None + try: + checker = HashChecker.from_url(url) + fp = self.open_url(strip_fragment(url)) + if isinstance(fp, urllib.error.HTTPError): + raise DistutilsError( + "Can't download %s: %s %s" % (url, fp.code, fp.msg) + ) + headers = fp.info() + blocknum = 0 + bs = self.dl_blocksize + size = -1 + if "content-length" in headers: + # Some servers return multiple Content-Length headers :( + sizes = get_all_headers(headers, 'Content-Length') + size = max(map(int, sizes)) + self.reporthook(url, filename, blocknum, bs, size) + with open(filename, 'wb') as tfp: + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) + return headers + finally: + if fp: + fp.close() + + def reporthook(self, url, filename, blocknum, blksize, size): + pass # no-op + + def open_url(self, url, warning=None): + if url.startswith('file:'): + return local_open(url) + try: + return open_with_auth(url, self.opener) + except (ValueError, http_client.InvalidURL) as v: + msg = ' '.join([str(arg) for arg in v.args]) + if warning: + self.warn(warning, msg) + else: + raise DistutilsError('%s %s' % (url, msg)) + except urllib.error.HTTPError as v: + return v + except urllib.error.URLError as v: + if warning: + self.warn(warning, v.reason) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v.reason)) + except http_client.BadStatusLine as v: + if warning: + self.warn(warning, v.line) + else: + raise DistutilsError( + '%s returned a bad status line. The server might be ' + 'down, %s' % + (url, v.line) + ) + except (http_client.HTTPException, socket.error) as v: + if warning: + self.warn(warning, v) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v)) + + def _download_url(self, scheme, url, tmpdir): + # Determine download filename + # + name, fragment = egg_info_for_url(url) + if name: + while '..' in name: + name = name.replace('..', '.').replace('\\', '_') + else: + name = "__downloaded__" # default if URL has no path contents + + if name.endswith('.egg.zip'): + name = name[:-4] # strip the extra .zip before download + + filename = os.path.join(tmpdir, name) + + # Download the file + # + if scheme == 'svn' or scheme.startswith('svn+'): + return self._download_svn(url, filename) + elif scheme == 'git' or scheme.startswith('git+'): + return self._download_git(url, filename) + elif scheme.startswith('hg+'): + return self._download_hg(url, filename) + elif scheme == 'file': + return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) + else: + self.url_ok(url, True) # raises error if not allowed + return self._attempt_download(url, filename) + + def scan_url(self, url): + self.process_url(url, True) + + def _attempt_download(self, url, filename): + headers = self._download_to(url, filename) + if 'html' in headers.get('content-type', '').lower(): + return self._download_html(url, headers, filename) + else: + return filename + + def _download_html(self, url, headers, filename): + file = open(filename) + for line in file: + if line.strip(): + # Check for a subversion index page + if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): + # it's a subversion index page: + file.close() + os.unlink(filename) + return self._download_svn(url, filename) + break # not an index page + file.close() + os.unlink(filename) + raise DistutilsError("Unexpected HTML page found at " + url) + + def _download_svn(self, url, filename): + url = url.split('#', 1)[0] # remove any fragment for svn's sake + creds = '' + if url.lower().startswith('svn:') and '@' in url: + scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) + if not netloc and path.startswith('//') and '/' in path[2:]: + netloc, path = path[2:].split('/', 1) + auth, host = splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':', 1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username=" + auth + netloc = host + parts = scheme, netloc, url, p, q, f + url = urllib.parse.urlunparse(parts) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#', 1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("(cd %s && git checkout --quiet %s)" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("(cd %s && hg up -C -r %s >&-)" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + + +def uchr(c): + if not isinstance(c, int): + return c + if c > 255: + return six.unichr(c) + return chr(c) + + +def decode_entity(match): + what = match.group(1) + if what.startswith('#x'): + what = int(what[2:], 16) + elif what.startswith('#'): + what = int(what[1:]) + else: + what = six.moves.html_entities.name2codepoint.get(what, match.group(0)) + return uchr(what) + + +def htmldecode(text): + """Decode HTML entities in the given text.""" + return entity_sub(decode_entity, text) + + +def socket_timeout(timeout=15): + def _socket_timeout(func): + def _socket_timeout(*args, **kwargs): + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + return func(*args, **kwargs) + finally: + socket.setdefaulttimeout(old_timeout) + + return _socket_timeout + + return _socket_timeout + + +def _encode_auth(auth): + """ + A function compatible with Python 2.3-3.3 that will encode + auth from a URL suitable for an HTTP header. + >>> str(_encode_auth('username%3Apassword')) + 'dXNlcm5hbWU6cGFzc3dvcmQ=' + + Long auth strings should not cause a newline to be inserted. + >>> long_auth = 'username:' + 'password'*10 + >>> chr(10) in str(_encode_auth(long_auth)) + False + """ + auth_s = urllib.parse.unquote(auth) + # convert to bytes + auth_bytes = auth_s.encode() + # use the legacy interface for Python 2.3 support + encoded_bytes = base64.encodestring(auth_bytes) + # convert back to a string + encoded = encoded_bytes.decode() + # strip the trailing carriage return + return encoded.replace('\n', '') + + +class Credential(object): + """ + A username/password pair. Use like a namedtuple. + """ + + def __init__(self, username, password): + self.username = username + self.password = password + + def __iter__(self): + yield self.username + yield self.password + + def __str__(self): + return '%(username)s:%(password)s' % vars(self) + + +class PyPIConfig(configparser.RawConfigParser): + def __init__(self): + """ + Load from ~/.pypirc + """ + defaults = dict.fromkeys(['username', 'password', 'repository'], '') + configparser.RawConfigParser.__init__(self, defaults) + + rc = os.path.join(os.path.expanduser('~'), '.pypirc') + if os.path.exists(rc): + self.read(rc) + + @property + def creds_by_repository(self): + sections_with_repositories = [ + section for section in self.sections() + if self.get(section, 'repository').strip() + ] + + return dict(map(self._get_repo_cred, sections_with_repositories)) + + def _get_repo_cred(self, section): + repo = self.get(section, 'repository').strip() + return repo, Credential( + self.get(section, 'username').strip(), + self.get(section, 'password').strip(), + ) + + def find_credential(self, url): + """ + If the URL indicated appears to be a repository defined in this + config, return the credential for that repository. + """ + for repository, cred in self.creds_by_repository.items(): + if url.startswith(repository): + return cred + + +def open_with_auth(url, opener=urllib.request.urlopen): + """Open a urllib2 request, handling HTTP authentication""" + + scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url) + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise http_client.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, host = splituser(netloc) + else: + auth = None + + if not auth: + cred = PyPIConfig().find_credential(url) + if cred: + auth = str(cred) + info = cred.username, url + log.info('Authenticating as %s for %s (from .pypirc)', *info) + + if auth: + auth = "Basic " + _encode_auth(auth) + parts = scheme, host, path, params, query, frag + new_url = urllib.parse.urlunparse(parts) + request = urllib.request.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib.request.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) + if s2 == scheme and h2 == host: + parts = s2, netloc, path2, param2, query2, frag2 + fp.url = urllib.parse.urlunparse(parts) + + return fp + + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urllib.parse.urlparse(url) + filename = urllib.request.url2pathname(path) + if os.path.isfile(filename): + return urllib.request.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + filepath = os.path.join(filename, f) + if f == 'index.html': + with open(filepath, 'r') as fp: + body = fp.read() + break + elif os.path.isdir(filepath): + f += '/' + files.append('<a href="{name}">{name}</a>'.format(name=f)) + else: + tmpl = ("<html><head><title>{url}" + "{files}") + body = tmpl.format(url=url, files='\n'.join(files)) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + headers = {'content-type': 'text/html'} + body_stream = six.StringIO(body) + return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py26compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py26compat.py new file mode 100644 index 0000000..4d3add8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py26compat.py @@ -0,0 +1,31 @@ +""" +Compatibility Support for Python 2.6 and earlier +""" + +import sys + +try: + from urllib.parse import splittag +except ImportError: + from urllib import splittag + + +def strip_fragment(url): + """ + In `Python 8280 `_, Python 2.7 and + later was patched to disregard the fragment when making URL requests. + Do the same for Python 2.6 and earlier. + """ + url, fragment = splittag(url) + return url + + +if sys.version_info >= (2, 7): + strip_fragment = lambda x: x + +try: + from importlib import import_module +except ImportError: + + def import_module(module_name): + return __import__(module_name, fromlist=['__name__']) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py27compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py27compat.py new file mode 100644 index 0000000..a71a936 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py27compat.py @@ -0,0 +1,29 @@ +""" +Compatibility Support for Python 2.7 and earlier +""" + +import sys +import platform + + +def get_all_headers(message, key): + """ + Given an HTTPMessage, return all headers matching a given key. + """ + return message.get_all(key) + + +if sys.version_info < (3,): + + def get_all_headers(message, key): + return message.getheaders(key) + + +linux_py2_ascii = ( + platform.system() == 'Linux' and + sys.getfilesystemencoding() == 'ascii' and + sys.version_info < (3,) +) + +rmtree_safe = str if linux_py2_ascii else lambda x: x +"""Workaround for http://bugs.python.org/issue24672""" diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py31compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py31compat.py new file mode 100644 index 0000000..44b025d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py31compat.py @@ -0,0 +1,56 @@ +import sys +import unittest + +__all__ = ['get_config_vars', 'get_path'] + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_config_vars, get_path +except ImportError: + from distutils.sysconfig import get_config_vars, get_python_lib + + def get_path(name): + if name not in ('platlib', 'purelib'): + raise ValueError("Name must be purelib or platlib") + return get_python_lib(name == 'platlib') + + +try: + # Python >=3.2 + from tempfile import TemporaryDirectory +except ImportError: + import shutil + import tempfile + + class TemporaryDirectory(object): + """ + Very simple temporary directory context manager. + Will try to delete afterward, but will also ignore OS and similar + errors on deletion. + """ + + def __init__(self): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp() + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: # removal errors are not the only possible + pass + self.name = None + + +unittest_main = unittest.main + +_PY31 = (3, 1) <= sys.version_info[:2] < (3, 2) +if _PY31: + # on Python 3.1, translate testRunner==None to TextTestRunner + # for compatibility with Python 2.6, 2.7, and 3.2+ + def unittest_main(*args, **kwargs): + if 'testRunner' in kwargs and kwargs['testRunner'] is None: + kwargs['testRunner'] = unittest.TextTestRunner + return unittest.main(*args, **kwargs) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py33compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py33compat.py new file mode 100644 index 0000000..af64d5d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py33compat.py @@ -0,0 +1,45 @@ +import dis +import array +import collections + +from setuptools.extern import six + + +OpArg = collections.namedtuple('OpArg', 'opcode arg') + + +class Bytecode_compat(object): + def __init__(self, code): + self.code = code + + def __iter__(self): + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + bytes = array.array('b', self.code.co_code) + eof = len(self.code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr < eof: + + op = bytes[ptr] + + if op >= dis.HAVE_ARGUMENT: + + arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg + ptr += 3 + + if op == dis.EXTENDED_ARG: + long_type = six.integer_types[-1] + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield OpArg(op, arg) + + +Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py36compat.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py36compat.py new file mode 100644 index 0000000..f527969 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/py36compat.py @@ -0,0 +1,82 @@ +import sys +from distutils.errors import DistutilsOptionError +from distutils.util import strtobool +from distutils.debug import DEBUG + + +class Distribution_parse_config_files: + """ + Mix-in providing forward-compatibility for functionality to be + included by default on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. + """ + def parse_config_files(self, filenames=None): + from configparser import ConfigParser + + # Ignore install directory options if we have a venv + if sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser(interpolation=None) + for filename in filenames: + if DEBUG: + self.announce(" reading %s" % filename) + parser.read(filename) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = parser.get(section,opt) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + +if sys.version_info < (3,): + # Python 2 behavior is sufficient + class Distribution_parse_config_files: + pass + + +if False: + # When updated behavior is available upstream, + # disable override here. + class Distribution_parse_config_files: + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/sandbox.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/sandbox.py new file mode 100644 index 0000000..817a3af --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/sandbox.py @@ -0,0 +1,491 @@ +import os +import sys +import tempfile +import operator +import functools +import itertools +import re +import contextlib +import pickle + +from setuptools.extern import six +from setuptools.extern.six.moves import builtins, map + +import pkg_resources + +if sys.platform.startswith('java'): + import org.python.modules.posix.PosixModule as _os +else: + _os = sys.modules[os.name] +try: + _file = file +except NameError: + _file = None +_open = open +from distutils.errors import DistutilsError +from pkg_resources import working_set + +__all__ = [ + "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", +] + + +def _execfile(filename, globals, locals=None): + """ + Python 3 implementation of execfile. + """ + mode = 'rb' + with open(filename, mode) as stream: + script = stream.read() + # compile() function in Python 2.6 and 3.1 requires LF line endings. + if sys.version_info[:2] < (2, 7) or sys.version_info[:2] >= (3, 0) and sys.version_info[:2] < (3, 2): + script = script.replace(b'\r\n', b'\n') + script = script.replace(b'\r', b'\n') + if locals is None: + locals = globals + code = compile(script, filename, 'exec') + exec(code, globals, locals) + + +@contextlib.contextmanager +def save_argv(repl=None): + saved = sys.argv[:] + if repl is not None: + sys.argv[:] = repl + try: + yield saved + finally: + sys.argv[:] = saved + + +@contextlib.contextmanager +def save_path(): + saved = sys.path[:] + try: + yield saved + finally: + sys.path[:] = saved + + +@contextlib.contextmanager +def override_temp(replacement): + """ + Monkey-patch tempfile.tempdir with replacement, ensuring it exists + """ + if not os.path.isdir(replacement): + os.makedirs(replacement) + + saved = tempfile.tempdir + + tempfile.tempdir = replacement + + try: + yield + finally: + tempfile.tempdir = saved + + +@contextlib.contextmanager +def pushd(target): + saved = os.getcwd() + os.chdir(target) + try: + yield saved + finally: + os.chdir(saved) + + +class UnpickleableException(Exception): + """ + An exception representing another Exception that could not be pickled. + """ + + @staticmethod + def dump(type, exc): + """ + Always return a dumped (pickled) type and exc. If exc can't be pickled, + wrap it in UnpickleableException first. + """ + try: + return pickle.dumps(type), pickle.dumps(exc) + except Exception: + # get UnpickleableException inside the sandbox + from setuptools.sandbox import UnpickleableException as cls + return cls.dump(cls, cls(repr(exc))) + + +class ExceptionSaver: + """ + A Context Manager that will save an exception, serialized, and restore it + later. + """ + + def __enter__(self): + return self + + def __exit__(self, type, exc, tb): + if not exc: + return + + # dump the exception + self._saved = UnpickleableException.dump(type, exc) + self._tb = tb + + # suppress the exception + return True + + def resume(self): + "restore and re-raise any exception" + + if '_saved' not in vars(self): + return + + type, exc = map(pickle.loads, self._saved) + six.reraise(type, exc, self._tb) + + +@contextlib.contextmanager +def save_modules(): + """ + Context in which imported modules are saved. + + Translates exceptions internal to the context into the equivalent exception + outside the context. + """ + saved = sys.modules.copy() + with ExceptionSaver() as saved_exc: + yield saved + + sys.modules.update(saved) + # remove any modules imported since + del_modules = ( + mod_name for mod_name in sys.modules + if mod_name not in saved + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ) + _clear_modules(del_modules) + + saved_exc.resume() + + +def _clear_modules(module_names): + for mod_name in list(module_names): + del sys.modules[mod_name] + + +@contextlib.contextmanager +def save_pkg_resources_state(): + saved = pkg_resources.__getstate__() + try: + yield saved + finally: + pkg_resources.__setstate__(saved) + + +@contextlib.contextmanager +def setup_context(setup_dir): + temp_dir = os.path.join(setup_dir, 'temp') + with save_pkg_resources_state(): + with save_modules(): + hide_setuptools() + with save_path(): + with save_argv(): + with override_temp(temp_dir): + with pushd(setup_dir): + # ensure setuptools commands are available + __import__('setuptools') + yield + + +def _needs_hiding(mod_name): + """ + >>> _needs_hiding('setuptools') + True + >>> _needs_hiding('pkg_resources') + True + >>> _needs_hiding('setuptools_plugin') + False + >>> _needs_hiding('setuptools.__init__') + True + >>> _needs_hiding('distutils') + True + >>> _needs_hiding('os') + False + >>> _needs_hiding('Cython') + True + """ + pattern = re.compile('(setuptools|pkg_resources|distutils|Cython)(\.|$)') + return bool(pattern.match(mod_name)) + + +def hide_setuptools(): + """ + Remove references to setuptools' modules from sys.modules to allow the + invocation to import the most appropriate setuptools. This technique is + necessary to avoid issues such as #315 where setuptools upgrading itself + would fail to find a function declared in the metadata. + """ + modules = filter(_needs_hiding, sys.modules) + _clear_modules(modules) + + +def run_setup(setup_script, args): + """Run a distutils setup script, sandboxed in its directory""" + setup_dir = os.path.abspath(os.path.dirname(setup_script)) + with setup_context(setup_dir): + try: + sys.argv[:] = [setup_script] + list(args) + sys.path.insert(0, setup_dir) + # reset to include setup dir, w/clean callback list + working_set.__init__() + working_set.callbacks.append(lambda dist: dist.activate()) + + # __file__ should be a byte string on Python 2 (#712) + dunder_file = ( + setup_script + if isinstance(setup_script, str) else + setup_script.encode(sys.getfilesystemencoding()) + ) + + def runner(): + ns = dict(__file__=dunder_file, __name__='__main__') + _execfile(setup_script, ns) + + DirectorySandbox(setup_dir).run(runner) + except SystemExit as v: + if v.args and v.args[0]: + raise + # Normal exit, just return + + +class AbstractSandbox: + """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" + + _active = False + + def __init__(self): + self._attrs = [ + name for name in dir(_os) + if not name.startswith('_') and hasattr(self, name) + ] + + def _copy(self, source): + for name in self._attrs: + setattr(os, name, getattr(source, name)) + + def run(self, func): + """Run 'func' under os sandboxing""" + try: + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + return func() + finally: + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) + + def _mk_dual_path_wrapper(name): + original = getattr(_os, name) + + def wrap(self, src, dst, *args, **kw): + if self._active: + src, dst = self._remap_pair(name, src, dst, *args, **kw) + return original(src, dst, *args, **kw) + + return wrap + + for name in ["rename", "link", "symlink"]: + if hasattr(_os, name): + locals()[name] = _mk_dual_path_wrapper(name) + + def _mk_single_path_wrapper(name, original=None): + original = original or getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return original(path, *args, **kw) + + return wrap + + if _file: + _file = _mk_single_path_wrapper('file', _file) + _open = _mk_single_path_wrapper('open', _open) + for name in [ + "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", + "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", + "startfile", "mkfifo", "mknod", "pathconf", "access" + ]: + if hasattr(_os, name): + locals()[name] = _mk_single_path_wrapper(name) + + def _mk_single_with_return(name): + original = getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return self._remap_output(name, original(path, *args, **kw)) + return original(path, *args, **kw) + + return wrap + + for name in ['readlink', 'tempnam']: + if hasattr(_os, name): + locals()[name] = _mk_single_with_return(name) + + def _mk_query(name): + original = getattr(_os, name) + + def wrap(self, *args, **kw): + retval = original(*args, **kw) + if self._active: + return self._remap_output(name, retval) + return retval + + return wrap + + for name in ['getcwd', 'tmpnam']: + if hasattr(_os, name): + locals()[name] = _mk_query(name) + + def _validate_path(self, path): + """Called to remap or validate any path, whether input or output""" + return path + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + return self._validate_path(path) + + def _remap_output(self, operation, path): + """Called for path outputs""" + return self._validate_path(path) + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + return ( + self._remap_input(operation + '-from', src, *args, **kw), + self._remap_input(operation + '-to', dst, *args, **kw) + ) + + +if hasattr(os, 'devnull'): + _EXCEPTIONS = [os.devnull,] +else: + _EXCEPTIONS = [] + + +class DirectorySandbox(AbstractSandbox): + """Restrict operations to a single subdirectory - pseudo-chroot""" + + write_ops = dict.fromkeys([ + "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", + "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", + ]) + + _exception_patterns = [ + # Allow lib2to3 to attempt to save a pickled grammar object (#121) + '.*lib2to3.*\.pickle$', + ] + "exempt writing to paths that match the pattern" + + def __init__(self, sandbox, exceptions=_EXCEPTIONS): + self._sandbox = os.path.normcase(os.path.realpath(sandbox)) + self._prefix = os.path.join(self._sandbox, '') + self._exceptions = [ + os.path.normcase(os.path.realpath(path)) + for path in exceptions + ] + AbstractSandbox.__init__(self) + + def _violation(self, operation, *args, **kw): + from setuptools.sandbox import SandboxViolation + raise SandboxViolation(operation, args, kw) + + if _file: + + def _file(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("file", path, mode, *args, **kw) + return _file(path, mode, *args, **kw) + + def _open(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("open", path, mode, *args, **kw) + return _open(path, mode, *args, **kw) + + def tmpnam(self): + self._violation("tmpnam") + + def _ok(self, path): + active = self._active + try: + self._active = False + realpath = os.path.normcase(os.path.realpath(path)) + return ( + self._exempted(realpath) + or realpath == self._sandbox + or realpath.startswith(self._prefix) + ) + finally: + self._active = active + + def _exempted(self, filepath): + start_matches = ( + filepath.startswith(exception) + for exception in self._exceptions + ) + pattern_matches = ( + re.match(pattern, filepath) + for pattern in self._exception_patterns + ) + candidates = itertools.chain(start_matches, pattern_matches) + return any(candidates) + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + if operation in self.write_ops and not self._ok(path): + self._violation(operation, os.path.realpath(path), *args, **kw) + return path + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + if not self._ok(src) or not self._ok(dst): + self._violation(operation, src, dst, *args, **kw) + return (src, dst) + + def open(self, file, flags, mode=0o777, *args, **kw): + """Called for low-level os.open()""" + if flags & WRITE_FLAGS and not self._ok(file): + self._violation("os.open", file, flags, mode, *args, **kw) + return _os.open(file, flags, mode, *args, **kw) + + +WRITE_FLAGS = functools.reduce( + operator.or_, [getattr(_os, a, 0) for a in + "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] +) + + +class SandboxViolation(DistutilsError): + """A setup script attempted to modify the filesystem outside the sandbox""" + + def __str__(self): + return """SandboxViolation: %s%r %s + +The package setup script has attempted to modify files on your system +that are not within the EasyInstall build area, and has been aborted. + +This package cannot be safely installed by EasyInstall, and may not +support alternate installation locations even if you run its setup +script by hand. Please inform the package's author and the EasyInstall +maintainers to find out if a fix or workaround is available.""" % self.args + + +# diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script (dev).tmpl b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 0000000..d58b1bb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,5 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +exec(compile(open(__file__).read(), __file__, 'exec')) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script.tmpl b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script.tmpl new file mode 100644 index 0000000..ff5efbc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/site-patch.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/site-patch.py new file mode 100644 index 0000000..0d2d2ff --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/site-patch.py @@ -0,0 +1,74 @@ +def __boot(): + import sys + import os + PYTHONPATH = os.environ.get('PYTHONPATH') + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): + PYTHONPATH = [] + else: + PYTHONPATH = PYTHONPATH.split(os.pathsep) + + pic = getattr(sys, 'path_importer_cache', {}) + stdpath = sys.path[len(PYTHONPATH):] + mydir = os.path.dirname(__file__) + + for item in stdpath: + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory + importer = pic.get(item) + if importer is not None: + loader = importer.find_module('site') + if loader is not None: + # This should actually reload the current module + loader.load_module('site') + break + else: + try: + import imp # Avoid import loop in Python >= 3.3 + stream, path, descr = imp.find_module('site', [item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site', stream, path, descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d, nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p, np = makepath(item) + + if np == nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + + +if __name__ == 'site': + __boot() + del __boot diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/ssl_support.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/ssl_support.py new file mode 100644 index 0000000..72b18ef --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/ssl_support.py @@ -0,0 +1,255 @@ +import os +import socket +import atexit +import re +import functools + +from setuptools.extern.six.moves import urllib, http_client, map, filter + +from pkg_resources import ResolutionError, ExtractionError + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +/usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem +""".strip().split() + +try: + HTTPSHandler = urllib.request.HTTPSHandler + HTTPSConnection = http_client.HTTPSConnection +except AttributeError: + HTTPSHandler = HTTPSConnection = object + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + try: + from backports.ssl_match_hostname import CertificateError + from backports.ssl_match_hostname import match_hostname + except ImportError: + CertificateError = None + match_hostname = None + +if not CertificateError: + + class CertificateError(ValueError): + pass + + +if not match_hostname: + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = socket.create_connection( + (self.host, self.port), getattr(self, 'source_address', None) + ) + + # Handle the socket if a (proxy) tunnel is present + if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host + + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), actual_host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib.request.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + + +@once +def get_win_certfile(): + try: + import wincertstore + except ImportError: + return None + + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() + atexit.register(self.close) + + def close(self): + try: + super(CertFile, self).close() + except OSError: + pass + + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): + try: + return __import__('certifi').where() + except (ImportError, ResolutionError, ExtractionError): + pass diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/unicode_utils.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/unicode_utils.py new file mode 100644 index 0000000..7c63efd --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,44 @@ +import unicodedata +import sys + +from setuptools.extern import six + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, six.text_type): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +def filesys_decode(path): + """ + Ensure that the given path is decoded, + NONE when no expected encoding works + """ + + if isinstance(path, six.text_type): + return path + + fs_enc = sys.getfilesystemencoding() or 'utf-8' + candidates = fs_enc, 'utf-8' + + for enc in candidates: + try: + return path.decode(enc) + except UnicodeDecodeError: + continue + + +def try_encode(string, enc): + "turn unicode encoding into a functional routine" + try: + return string.encode(enc) + except UnicodeEncodeError: + return None diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/version.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/version.py new file mode 100644 index 0000000..95e1869 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/version.py @@ -0,0 +1,6 @@ +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/windows_support.py b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000..cb977cf --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.5/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d8e390295fb656065ddb211d82057fd4afe4c32 GIT binary patch literal 281 zcmYk!y-LJD5C`zt-KgR4og_}87s}7+*cPYdf;t}4P|$#8iYC~7bTG=_oFXEtNV>X>PWj5|1D&HbbFHTyG z*c?TjhLF5BvDyHYCKS81+6yw?q2HzW9p5K)vY`%LSZrPv);_7z`^UEav+Dmw6;@+@ SX1yAWK4%2QNy~W7_Sp~M`A(Mr literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/easy_install.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt new file mode 100644 index 0000000..f0156c5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.LESSER.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.txt b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.txt new file mode 100644 index 0000000..c8dcb1e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + _clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/INSTALLER b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..ef8a5c2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/LICENSE.txt @@ -0,0 +1,13 @@ +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program in the COPYING and COPYING.LESSER files. +If not, see . \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/METADATA b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/METADATA new file mode 100644 index 0000000..834b610 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/METADATA @@ -0,0 +1,165 @@ +Metadata-Version: 2.1 +Name: ldap3 +Version: 2.9.1 +Summary: A strictly RFC 4510 conforming LDAP V3 pure Python client library +Home-page: https://github.com/cannatag/ldap3 +Author: Giovanni Cannata +Author-email: cannatag@gmail.com +License: LGPL v3 +Keywords: python3 python2 ldap +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX :: Linux +Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3) +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP +Requires-Dist: pyasn1 (>=0.4.6) + +LDAP3 +===== + +.. image:: https://img.shields.io/pypi/v/ldap3.svg + :target: https://pypi.python.org/pypi/ldap3/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/l/ldap3.svg + :target: https://pypi.python.org/pypi/ldap3/ + :alt: License + +.. image:: https://img.shields.io/travis/cannatag/ldap3/master.svg + :target: https://travis-ci.org/cannatag/ldap3 + :alt: TRAVIS-CI build status for master branch + + +ldap3 is a strictly RFC 4510 conforming **LDAP V3 pure Python client** library. The same codebase runs in Python 2, Python 3, PyPy and PyPy3. + + +A more pythonic LDAP +-------------------- + +LDAP operations look clumsy and hard-to-use because they reflect the old-age idea that time-consuming operations should be performed client-side +to not hog the server with heavy elaborations. To alleviate this ldap3 includes a fully functional **Abstraction Layer** that lets you +interact with the LDAP server in a modern and *pythonic* way. With the Abstraction Layer you don't need to directly issue any LDAP operation at all. + + +Thread safe strategies +---------------------- + +In multithreaded programs you must use on of **SAFE_SYNC** (synchronous connection strategy), **SAFE_RESTARTABLE** (restartable syncronous connection strategy) or **ASYNC** (asynchronous connection strategy). + Each LDAP operation with SAFE_SYNC or SAFE_RESTARTABLE strategies returns a tuple of four elements: status, result, response and request. + + * status: states if the operation was successful + + * result: the LDAP result of the operation + + * response: the response of a LDAP Search Operation + + * request: the original request of the operation + + The SafeSync strategy can be used with the Abstract Layer, but the Abstract Layer currently is NOT thread safe. + For example, to use *SAFE_SYNC*:: + + from ldap3 import Server, Connection, SAFE_SYNC + server = Server('my_server') + conn = Connection(server, 'my_user', 'my_password', client_strategy=SAFE_SYNC, auto_bind=True) + status, result, response, _ = conn.search('o=test', '(objectclass=*)') # usually you don't need the original request (4th element of the returned tuple) + + + With *ASYNC* you must request the response with the *get_response()* method. + +Home Page +--------- + +The home page of the ldap3 project is https://github.com/cannatag/ldap3 + + +Documentation +------------- + +Documentation is available at http://ldap3.readthedocs.io + + +License +------- + +The ldap3 project is open source software released under the **LGPL v3 license**. +Copyright 2013 - 2020 Giovanni Cannata + + +PEP8 Compliance +--------------- + +ldap3 is PEP8 compliant, except for line length. + + +Download +-------- + +Package download is available at https://pypi.python.org/pypi/ldap3. + + +Install +------- + +Install with **pip install ldap3** + + +Git repository +-------------- + +You can download the latest source at https://github.com/cannatag/ldap3 + + +Continuous integration +---------------------- + +Continuous integration for testing is at https://travis-ci.org/cannatag/ldap3 + + +Support & Development +--------------------- + +You can submit support tickets on https://github.com/cannatag/ldap3/issues/new +You can submit pull request on the **dev** branch at https://github.com/cannatag/ldap3/tree/dev + + +Thanks to +--------- + +* **Ilya Etingof**, the author of the *pyasn1* package for his excellent work and support. + +* **Mark Lutz** for his *Learning Python* and *Programming Python* excellent books series and **John Goerzen** and **Brandon Rhodes** for their book *Foundations of Python Network Programming*. These books are wonderful tools for learning Python and this project owes a lot to them. + +* **JetBrains** for donating to this project the Open Source license of *PyCharm Professional*. + +* **GitHub** for providing the *free source repository space and the tools* I use to develop this project. + +* The **FreeIPA** team for letting me use their demo LDAP server in the ldap3 tutorial. + + +Contact me +---------- + +For information and suggestions you can contact me at cannatag@gmail.com. You can also open a support ticket on https://github.com/cannatag/ldap3/issues/new + + +Donate +------ + +If you want to keep this project up and running you can send me an Amazon gift card. I will use it to improve my skills in Information and Communication technologies. + + +Changelog +--------- + +Updated changelog at https://ldap3.readthedocs.io/changelog.html + + + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/RECORD b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/RECORD new file mode 100644 index 0000000..0e9e80c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/RECORD @@ -0,0 +1,230 @@ +ldap3-2.9.1.dist-info/COPYING.LESSER.txt,sha256=LPNKwDiu5awG-TPd0dqYJuC7k4PBPY4LCI_O0LSpW1s,7814 +ldap3-2.9.1.dist-info/COPYING.txt,sha256=mW-DoJmlCb8dVheH3WgTBXT6aRoPIPc8E4WnHWxpQtU,35820 +ldap3-2.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +ldap3-2.9.1.dist-info/LICENSE.txt,sha256=XX5XVJ8iam2PA7UJW3uo37L_x-X6eSIP5lo4VMdxWbA,683 +ldap3-2.9.1.dist-info/METADATA,sha256=SgBryFUSxtahPvaoldnKM2aVtoXdVh_D5CaaOpIXgMU,5408 +ldap3-2.9.1.dist-info/RECORD,, +ldap3-2.9.1.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110 +ldap3-2.9.1.dist-info/top_level.txt,sha256=Zg1GRSTgLedl2RfLDLI0W0OaUFdYc0H1zzRbrK96JBw,6 +ldap3/__init__.py,sha256=fDS0j-uC8aY5g6U2z98mYC8JM6xLEZmL1RTn3exUkuE,4333 +ldap3/__pycache__/__init__.cpython-37.pyc,, +ldap3/__pycache__/version.cpython-37.pyc,, +ldap3/abstract/__init__.py,sha256=mw1tDTTwjwK-KF67PDCxgVltT_UM3YLFJyJbz8swMxA,2166 +ldap3/abstract/__pycache__/__init__.cpython-37.pyc,, +ldap3/abstract/__pycache__/attrDef.cpython-37.pyc,, +ldap3/abstract/__pycache__/attribute.cpython-37.pyc,, +ldap3/abstract/__pycache__/cursor.cpython-37.pyc,, +ldap3/abstract/__pycache__/entry.cpython-37.pyc,, +ldap3/abstract/__pycache__/objectDef.cpython-37.pyc,, +ldap3/abstract/attrDef.py,sha256=Bw23WrEdkErJUTHBJe--ag1KRP7lDueB7XDhC9HuCvo,4983 +ldap3/abstract/attribute.py,sha256=w8S2uhznzygj_VStYH_NGCvosPD8k3gXAVuE87Pkwj4,12428 +ldap3/abstract/cursor.py,sha256=UMKVwBXzsLraAHDKQYzfJ6yIaNC_m8XzLr5CQEzX5Vk,43620 +ldap3/abstract/entry.py,sha256=XeKOH1UA0SU_dJaMVNHv2_AswoVo5L7ok0t6coznJGA,35603 +ldap3/abstract/objectDef.py,sha256=48ROgT4Q3C0asmo2iYFonB2B3qNrsCyeNg5cHgHTxqk,11809 +ldap3/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/core/__pycache__/__init__.cpython-37.pyc,, +ldap3/core/__pycache__/connection.cpython-37.pyc,, +ldap3/core/__pycache__/exceptions.cpython-37.pyc,, +ldap3/core/__pycache__/pooling.cpython-37.pyc,, +ldap3/core/__pycache__/rdns.cpython-37.pyc,, +ldap3/core/__pycache__/results.cpython-37.pyc,, +ldap3/core/__pycache__/server.cpython-37.pyc,, +ldap3/core/__pycache__/timezone.cpython-37.pyc,, +ldap3/core/__pycache__/tls.cpython-37.pyc,, +ldap3/core/__pycache__/usage.cpython-37.pyc,, +ldap3/core/connection.py,sha256=Fy26Xkv0ikFY05qUTtfDDJJieLvlHUsuKneNvJKk2Zg,82600 +ldap3/core/exceptions.py,sha256=jjyx8LCftsxoy4i_KrpcAUMW0rAwfu0UZnBBPwCYOrk,16670 +ldap3/core/pooling.py,sha256=KXfOKdYWaKLDe-bDZZdEhnJAVcPb5cRAc51XZFDNFtA,14881 +ldap3/core/rdns.py,sha256=GxK_0nw1F6-ep_uApxKOYSfwCkSsrjmPFUSWaPc3NUQ,2525 +ldap3/core/results.py,sha256=TtF3F4UR32nseJhEUHE40DJjnXVYdvjLwKDyBlv0Gdo,5564 +ldap3/core/server.py,sha256=wFWUsQOmNsylQ_Cp7hja6mRKwEdOKOM7rec3tWG6VSc,34112 +ldap3/core/timezone.py,sha256=URXtnURG_WpbBwgJNe5YGeQryXD9NDO9yTfenGDLQm4,1620 +ldap3/core/tls.py,sha256=iO8a3SOogZ3n01Yn_i-und3hg6dqLq1ciaUycJy-yYk,15389 +ldap3/core/usage.py,sha256=sXRrE6S5shv-RrjL9yjz5H77voXHnbparHuAYdslOWo,10690 +ldap3/extend/__init__.py,sha256=yRQfHDmqJ2CiZlF5y2mLQtO2Mna-4NnwWlw7ABUkZFk,14146 +ldap3/extend/__pycache__/__init__.cpython-37.pyc,, +ldap3/extend/__pycache__/operation.cpython-37.pyc,, +ldap3/extend/microsoft/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/extend/microsoft/__pycache__/__init__.cpython-37.pyc,, +ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-37.pyc,, +ldap3/extend/microsoft/__pycache__/dirSync.cpython-37.pyc,, +ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-37.pyc,, +ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-37.pyc,, +ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-37.pyc,, +ldap3/extend/microsoft/__pycache__/unlockAccount.cpython-37.pyc,, +ldap3/extend/microsoft/addMembersToGroups.py,sha256=Xktg2W-lyL-2AvNfgwQ67yI_Kd5mLN56JvptfbDFk9g,4220 +ldap3/extend/microsoft/dirSync.py,sha256=XKl1o8_JeVPiBAWQX19po4zQ5ET34AtR_Ncg1fBASwU,4238 +ldap3/extend/microsoft/modifyPassword.py,sha256=DTdm6w7x__-jfSsBrQDNF4ptWk8kZi7hLW6mWTNRAxc,3160 +ldap3/extend/microsoft/persistentSearch.py,sha256=EboAmUIeGkq_x0FsZUHUKqtjkbayRVTKNEnyL-1x8yo,4303 +ldap3/extend/microsoft/removeMembersFromGroups.py,sha256=IByzrBU5Buhb_EjRJgkAJE2eiLObKhWuR2gla8q38Jc,4112 +ldap3/extend/microsoft/unlockAccount.py,sha256=wYCae0gBhqZNloO_b5Dzey8DHHjZYruJdO3WaRFrMHs,2142 +ldap3/extend/novell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/extend/novell/__pycache__/__init__.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/addMembersToGroups.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/checkGroupsMemberships.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/endTransaction.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/getBindDn.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/listReplicas.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/nmasGetUniversalPassword.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/nmasSetUniversalPassword.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/partition_entry_count.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/removeMembersFromGroups.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/replicaInfo.cpython-37.pyc,, +ldap3/extend/novell/__pycache__/startTransaction.cpython-37.pyc,, +ldap3/extend/novell/addMembersToGroups.py,sha256=zKzjpgIsiB4AyhPxbS54kcA3IukUdmH00VKPbXrlZ8g,8209 +ldap3/extend/novell/checkGroupsMemberships.py,sha256=UpcDbMlDFitpUX3piTNijM9MVg4OgMI18nyYpaH7Dzw,8006 +ldap3/extend/novell/endTransaction.py,sha256=FJ_Fh5x4kSP8qnvHU8YWnDZHoj0GjRN8KLHslP-DWCs,2252 +ldap3/extend/novell/getBindDn.py,sha256=FmObH2gATugZHMqYFyvvV1zugqaI6SRylkblddp_TkI,1422 +ldap3/extend/novell/listReplicas.py,sha256=yHDgw0S3utZQaRehZxWsIGSONhvgKgDby5he4Qku4Qk,1851 +ldap3/extend/novell/nmasGetUniversalPassword.py,sha256=C3kBWt80qBox6anBULlnvzQB50NlENmWcLt5ttiROSU,2225 +ldap3/extend/novell/nmasSetUniversalPassword.py,sha256=n5X-P_8R9uiQWPhm4wzOnP0_Z63JTSgDDkL-uKbqYRE,2077 +ldap3/extend/novell/partition_entry_count.py,sha256=aoLUTylSGlDfKARQxTSwt0yokCgRjx-1Vz2JPIPR3Zo,2077 +ldap3/extend/novell/removeMembersFromGroups.py,sha256=Tadzd3iXhEYZ-M-v5SfapDpZ3xjVNcHUOWaY1G3lIHI,8299 +ldap3/extend/novell/replicaInfo.py,sha256=a315GB4ZEM_svqc252KTVijMX_W84gKId6sHx_hFhy0,3391 +ldap3/extend/novell/startTransaction.py,sha256=h1YeBByo2zC7UmLdhbX6L4pJ3ajTIdABvoRp-b6FyDg,2293 +ldap3/extend/operation.py,sha256=rm6hcH0JXiKHvlpQmaCZ-8Rw279bgff-268dw6hCZXo,3988 +ldap3/extend/standard/PagedSearch.py,sha256=QyORR5GTMcPvd5E7qMKmbBmi5K7HLHzaGiTsXUhpNhk,6385 +ldap3/extend/standard/PersistentSearch.py,sha256=5Dvlix29nsbMl0B7sm0dBoCOZFN4w58dhY5C-dsrbhU,5367 +ldap3/extend/standard/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/extend/standard/__pycache__/PagedSearch.cpython-37.pyc,, +ldap3/extend/standard/__pycache__/PersistentSearch.cpython-37.pyc,, +ldap3/extend/standard/__pycache__/__init__.cpython-37.pyc,, +ldap3/extend/standard/__pycache__/modifyPassword.cpython-37.pyc,, +ldap3/extend/standard/__pycache__/whoAmI.cpython-37.pyc,, +ldap3/extend/standard/modifyPassword.py,sha256=unNRVqGMlyqohN3s1chgqmKFZNkX1MpKGJ2V1aC5f_U,3512 +ldap3/extend/standard/whoAmI.py,sha256=1lQK1wmfNzAgD7fNBJCCafrrLY4wK8U2vz2ERNQBUkg,1389 +ldap3/operation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/operation/__pycache__/__init__.cpython-37.pyc,, +ldap3/operation/__pycache__/abandon.cpython-37.pyc,, +ldap3/operation/__pycache__/add.cpython-37.pyc,, +ldap3/operation/__pycache__/bind.cpython-37.pyc,, +ldap3/operation/__pycache__/compare.cpython-37.pyc,, +ldap3/operation/__pycache__/delete.cpython-37.pyc,, +ldap3/operation/__pycache__/extended.cpython-37.pyc,, +ldap3/operation/__pycache__/modify.cpython-37.pyc,, +ldap3/operation/__pycache__/modifyDn.cpython-37.pyc,, +ldap3/operation/__pycache__/search.cpython-37.pyc,, +ldap3/operation/__pycache__/unbind.cpython-37.pyc,, +ldap3/operation/abandon.py,sha256=Mf5a4-UTdnHF-E9VWFvy98V4XkrvvydIt0wszVrjgd8,1139 +ldap3/operation/add.py,sha256=4XXYwAnKbVfS8IDe8mC1fzG9NPCYNpEl4y9t4FeSWls,2983 +ldap3/operation/bind.py,sha256=70pPGIUeLQUi7Y3t7PbODykHBKViKXDVsP0c4S7Ykwg,7802 +ldap3/operation/compare.py,sha256=1mvmuI_uJUh3-dVym6VkTjC9rVxBFYShQQthc-nwxjI,2467 +ldap3/operation/delete.py,sha256=_SF5tgIIUZP_q0RG2WIaUuZx9tK8C2mHYpHTa-fim3s,1527 +ldap3/operation/extended.py,sha256=EB47JGHjbgjAQEFaQcsG2PaLvvgK4sXYJXKKUj2_8Hs,4914 +ldap3/operation/modify.py,sha256=N8w-CD4i9-9AXB8lR7ZazXoa3NAMQCQgdmdaEHlFa1Y,3927 +ldap3/operation/modifyDn.py,sha256=ut5sY8sP_UTDCDq73Ct0Y8awk73qDJ0MHWghj3enCIQ,2358 +ldap3/operation/search.py,sha256=RjaA4_HxnMQeuE9pSWzL9bzy07fDPkOaCppyio13xi4,28197 +ldap3/operation/unbind.py,sha256=Ph5ww3NkEz8yX7dv4FC5zikJLUfya4otOlvFu_In9y4,1012 +ldap3/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/__pycache__/__init__.cpython-37.pyc,, +ldap3/protocol/__pycache__/controls.cpython-37.pyc,, +ldap3/protocol/__pycache__/convert.cpython-37.pyc,, +ldap3/protocol/__pycache__/microsoft.cpython-37.pyc,, +ldap3/protocol/__pycache__/novell.cpython-37.pyc,, +ldap3/protocol/__pycache__/oid.cpython-37.pyc,, +ldap3/protocol/__pycache__/persistentSearch.cpython-37.pyc,, +ldap3/protocol/__pycache__/rfc2696.cpython-37.pyc,, +ldap3/protocol/__pycache__/rfc2849.cpython-37.pyc,, +ldap3/protocol/__pycache__/rfc3062.cpython-37.pyc,, +ldap3/protocol/__pycache__/rfc4511.cpython-37.pyc,, +ldap3/protocol/__pycache__/rfc4512.cpython-37.pyc,, +ldap3/protocol/__pycache__/rfc4527.cpython-37.pyc,, +ldap3/protocol/controls.py,sha256=pty1PqVDiRB71jPPMbgiPpcjRbBTJRtP3_VRkbOPsXA,1392 +ldap3/protocol/convert.py,sha256=sQWsEfffAqRbKXEevL_zCDEGpQ6z_un1w_X40D-ZlJQ,9879 +ldap3/protocol/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/formatters/__pycache__/__init__.cpython-37.pyc,, +ldap3/protocol/formatters/__pycache__/formatters.cpython-37.pyc,, +ldap3/protocol/formatters/__pycache__/standard.cpython-37.pyc,, +ldap3/protocol/formatters/__pycache__/validators.cpython-37.pyc,, +ldap3/protocol/formatters/formatters.py,sha256=QNiIBtMbFh9X_mv0skKfeQcJ3xAEMpox5QWZWQ1VfyE,16175 +ldap3/protocol/formatters/standard.py,sha256=V0Gf9e80v2ALJbh6g6lc7iB4b1QOqQpGU64Kvjxxn9Y,15252 +ldap3/protocol/formatters/validators.py,sha256=XQunpPTqDESJVS_DR8gKR53U9-wsTtHw2GXOEEXY5RA,19777 +ldap3/protocol/microsoft.py,sha256=RPk9FxPYzMT9yvsV1hNnfQbCylydPM-G0g-g4t8aOMc,5416 +ldap3/protocol/novell.py,sha256=7yyZ2oFUuNlJ3pBawEhRkolTt_tTnvdPfGgXXcRwnlY,5157 +ldap3/protocol/oid.py,sha256=Y6BsJGLi9p8ncWgY46NAp4SChkZChvk_tNHibjf69Bs,127654 +ldap3/protocol/persistentSearch.py,sha256=3mNW7KFu57uLJmKZB3E26BMvuuyAbDMrIp5arJrKZ4s,3177 +ldap3/protocol/rfc2696.py,sha256=UY6UUYaG_qE1llceZFLYjkW5RyXrIhTGeYI9W2xVqEg,2267 +ldap3/protocol/rfc2849.py,sha256=E6otnGh4e3jU8Tzsftt1xQS95nwCeeNk_vgr6UkAe3M,11234 +ldap3/protocol/rfc3062.py,sha256=zxnQ3eP94PrL8Vy8HUD7umH9nXkJMHjEMrSEinJi7-E,2955 +ldap3/protocol/rfc4511.py,sha256=7QUoXYeKdtts7p7crxeeZduGAlk3HBWgun03SLKhMf4,42545 +ldap3/protocol/rfc4512.py,sha256=x6VQsUgOo3nUwN1x7A_aHOvWonqc1N3dOpghSm7IRMo,39009 +ldap3/protocol/rfc4527.py,sha256=piYI1zm1jJ-Wp65_t5QRGdvXv6gbYum7hmstNJSk344,2078 +ldap3/protocol/sasl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/sasl/__pycache__/__init__.cpython-37.pyc,, +ldap3/protocol/sasl/__pycache__/digestMd5.cpython-37.pyc,, +ldap3/protocol/sasl/__pycache__/external.cpython-37.pyc,, +ldap3/protocol/sasl/__pycache__/kerberos.cpython-37.pyc,, +ldap3/protocol/sasl/__pycache__/plain.cpython-37.pyc,, +ldap3/protocol/sasl/__pycache__/sasl.cpython-37.pyc,, +ldap3/protocol/sasl/digestMd5.py,sha256=y58cRTmAAVhrtBAWMCR1VsHR1qZLzUVGmJwyzdM2xrM,5829 +ldap3/protocol/sasl/external.py,sha256=rXeZI70yZQWrr_j0COysZURKWCVQ22pjMdyRj46mQpo,1051 +ldap3/protocol/sasl/kerberos.py,sha256=4ggxFknqHKwjgkB3I2vjFS9qNtTUhXyMAJ4yVdq3tZA,15290 +ldap3/protocol/sasl/plain.py,sha256=uwuoh6Z1P6U4fhyvKEXNjcPyhY2r-COewVjPlIWLK-g,2235 +ldap3/protocol/sasl/sasl.py,sha256=-iHpfJVO1tf1NhK5iM69Xcw7uJsGjFGi5ftUhPBVyxA,7309 +ldap3/protocol/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/protocol/schemas/__pycache__/__init__.cpython-37.pyc,, +ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-37.pyc,, +ldap3/protocol/schemas/__pycache__/ds389.cpython-37.pyc,, +ldap3/protocol/schemas/__pycache__/edir888.cpython-37.pyc,, +ldap3/protocol/schemas/__pycache__/edir914.cpython-37.pyc,, +ldap3/protocol/schemas/__pycache__/slapd24.cpython-37.pyc,, +ldap3/protocol/schemas/ad2012R2.py,sha256=ZhjzvBlnxbk4Xmh2a-yiwHdQYGs27N5cC7eeeasKlwM,333672 +ldap3/protocol/schemas/ds389.py,sha256=_vsGT8rTaMDX1h_aod1iL7hhvI12blFi3YqmWVHgj50,310500 +ldap3/protocol/schemas/edir888.py,sha256=2C-QL5KJYEHm7A-UAVSN0PJSNRkPX4A1OOOHWVBQwRw,177862 +ldap3/protocol/schemas/edir914.py,sha256=O0VcJUmSRxUy8GKoNR1Cuhipij1R3o7hKeFuwMJNqQI,182158 +ldap3/protocol/schemas/slapd24.py,sha256=uAPuP5GsEG01HFe0tAF0h10_C5iLDOtIvdprsMKUtsU,129245 +ldap3/strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/strategy/__pycache__/__init__.cpython-37.pyc,, +ldap3/strategy/__pycache__/asyncStream.cpython-37.pyc,, +ldap3/strategy/__pycache__/asynchronous.cpython-37.pyc,, +ldap3/strategy/__pycache__/base.cpython-37.pyc,, +ldap3/strategy/__pycache__/ldifProducer.cpython-37.pyc,, +ldap3/strategy/__pycache__/mockAsync.cpython-37.pyc,, +ldap3/strategy/__pycache__/mockBase.cpython-37.pyc,, +ldap3/strategy/__pycache__/mockSync.cpython-37.pyc,, +ldap3/strategy/__pycache__/restartable.cpython-37.pyc,, +ldap3/strategy/__pycache__/reusable.cpython-37.pyc,, +ldap3/strategy/__pycache__/safeRestartable.cpython-37.pyc,, +ldap3/strategy/__pycache__/safeSync.cpython-37.pyc,, +ldap3/strategy/__pycache__/sync.cpython-37.pyc,, +ldap3/strategy/asyncStream.py,sha256=L-Jcb_FGWeuXLkMl-wVKHxlQZOFzzo4wthuPm6NwDzk,4578 +ldap3/strategy/asynchronous.py,sha256=s7FhaxizhCPiWU4Dfxnc_Xh7F8DyFW3ELajDifYBxHI,15247 +ldap3/strategy/base.py,sha256=48stBVEx9WP13etYE7uOQkDqnUB8iIzu5HSKjd90FVc,51995 +ldap3/strategy/ldifProducer.py,sha256=V1hdqCUbetGq6nHPa8xucYn0G3lglRTAnlc4rV1bor4,5715 +ldap3/strategy/mockAsync.py,sha256=rZEbmE4vxWgGxHjt7Tr76diB-C2Q9G_Sj5wjBZjv2Rw,10259 +ldap3/strategy/mockBase.py,sha256=zvVBdJ7S3F7_w03-FHoaL4reJXqqOgai23ZauF0K0P8,46685 +ldap3/strategy/mockSync.py,sha256=hYGif2UHypzX1a5TT4gPn855ZO5VQveCe6oEQ4amYck,7315 +ldap3/strategy/restartable.py,sha256=wuetnY_XvnQ6dBkdIyBwDlvGAj7aWcet7hVf0OFrYXI,13209 +ldap3/strategy/reusable.py,sha256=hydBw6IQlB3pdPsilMh2Gb60KXoAhev88N4wcMnIUrs,25459 +ldap3/strategy/safeRestartable.py,sha256=sb9X7t8KgihhfVO1sqyZncOsb18_RnpEa8ifDnSOlmw,1079 +ldap3/strategy/safeSync.py,sha256=bs034mamY73coENS3B8BIPtpaSdCY6rHR3Fd515HGCQ,1044 +ldap3/strategy/sync.py,sha256=feeQyySWkkp_8aijZ77n4MNCEglfRpj2Bsm9gTA9T5o,13932 +ldap3/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ldap3/utils/__pycache__/__init__.cpython-37.pyc,, +ldap3/utils/__pycache__/asn1.cpython-37.pyc,, +ldap3/utils/__pycache__/ciDict.cpython-37.pyc,, +ldap3/utils/__pycache__/config.cpython-37.pyc,, +ldap3/utils/__pycache__/conv.cpython-37.pyc,, +ldap3/utils/__pycache__/dn.cpython-37.pyc,, +ldap3/utils/__pycache__/hashed.cpython-37.pyc,, +ldap3/utils/__pycache__/log.cpython-37.pyc,, +ldap3/utils/__pycache__/ntlm.cpython-37.pyc,, +ldap3/utils/__pycache__/ordDict.cpython-37.pyc,, +ldap3/utils/__pycache__/port_validators.cpython-37.pyc,, +ldap3/utils/__pycache__/repr.cpython-37.pyc,, +ldap3/utils/__pycache__/tls_backport.cpython-37.pyc,, +ldap3/utils/__pycache__/uri.cpython-37.pyc,, +ldap3/utils/asn1.py,sha256=FYZA1WCmnHWCIqDiyKx9QqRBK7lcNa7n4K-EiX_HbRU,9304 +ldap3/utils/ciDict.py,sha256=_X4k9lnqmJ8MP55CSO4ZSLmfWGXkFZHDtvtF1Z35aaQ,7893 +ldap3/utils/config.py,sha256=H8LzitQYyx1lJUycZa6jHlHVV5aIZ5JkwSUs5H_8xuU,14927 +ldap3/utils/conv.py,sha256=D-rhsIHaV152ZypCQvIqC7jccyKi6GHXERNKSwjk7EI,9741 +ldap3/utils/dn.py,sha256=vKB-BzIqxphfbtMkpr2s8sieosGcbghVblz0iPWCwKU,14441 +ldap3/utils/hashed.py,sha256=yhqSd9iLj2hsYqT1p9ZnBFQPaaB9pnkVrYb1H6dzFBA,3575 +ldap3/utils/log.py,sha256=ScJ5IS9zYuSWqXkP___KQ8mzdoGzocfMkMiTSG2870U,7252 +ldap3/utils/ntlm.py,sha256=XKoz2G8W4npLIyTjMDpqepb3Xjz10qH6HmBxilAsMy0,20125 +ldap3/utils/ordDict.py,sha256=mmMzSklrAxwRZprA1Lj5K1D-eD-HLWVHxQVQD0NiPnQ,4251 +ldap3/utils/port_validators.py,sha256=r23jlhWgU09Kq8X0TB4nUqHiO3iYNQ0kh4WMgcDoZzM,1396 +ldap3/utils/repr.py,sha256=vKhXotKmFD5sCYNUZOHV5ybR2LbSsjVeDtY0RCLFa5E,1700 +ldap3/utils/tls_backport.py,sha256=VC4irAJVmNnuTu3uccViLYJU7YL-OXsvVbQR3XJJh5c,5426 +ldap3/utils/uri.py,sha256=bGq6eNc063NSJOF9xYl3mqLnF1c-SqvUq3-rd4CdaEA,4795 +ldap3/version.py,sha256=QxpAi50y5ypa0THbj-RzN7f3GTCbWftJRbdWCGr9J4s,626 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/WHEEL b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/WHEEL new file mode 100644 index 0000000..01b8fc7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/top_level.txt b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/top_level.txt new file mode 100644 index 0000000..a843647 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3-2.9.1.dist-info/top_level.txt @@ -0,0 +1 @@ +ldap3 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__init__.py new file mode 100644 index 0000000..19c206f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__init__.py @@ -0,0 +1,150 @@ +""" +""" + +# Created on 2013.05.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from types import GeneratorType + +# authentication +ANONYMOUS = 'ANONYMOUS' +SIMPLE = 'SIMPLE' +SASL = 'SASL' +NTLM = 'NTLM' + +# SASL MECHANISMS +EXTERNAL = 'EXTERNAL' +DIGEST_MD5 = 'DIGEST-MD5' +KERBEROS = GSSAPI = 'GSSAPI' +PLAIN = 'PLAIN' + +AUTO_BIND_DEFAULT = 'DEFAULT' # binds connection when using "with" context manager +AUTO_BIND_NONE = 'NONE' # same as False, no bind is performed +AUTO_BIND_NO_TLS = 'NO_TLS' # same as True, bind is performed without tls +AUTO_BIND_TLS_BEFORE_BIND = 'TLS_BEFORE_BIND' # start_tls is performed before bind +AUTO_BIND_TLS_AFTER_BIND = 'TLS_AFTER_BIND' # start_tls is performed after bind + +# server IP dual stack mode +IP_SYSTEM_DEFAULT = 'IP_SYSTEM_DEFAULT' +IP_V4_ONLY = 'IP_V4_ONLY' +IP_V6_ONLY = 'IP_V6_ONLY' +IP_V4_PREFERRED = 'IP_V4_PREFERRED' +IP_V6_PREFERRED = 'IP_V6_PREFERRED' + +# search scope +BASE = 'BASE' +LEVEL = 'LEVEL' +SUBTREE = 'SUBTREE' + +# search alias +DEREF_NEVER = 'NEVER' +DEREF_SEARCH = 'SEARCH' +DEREF_BASE = 'FINDING_BASE' +DEREF_ALWAYS = 'ALWAYS' + +# search attributes +ALL_ATTRIBUTES = '*' +NO_ATTRIBUTES = '1.1' # as per RFC 4511 +ALL_OPERATIONAL_ATTRIBUTES = '+' # as per RFC 3673 + +# modify type +MODIFY_ADD = 'MODIFY_ADD' +MODIFY_DELETE = 'MODIFY_DELETE' +MODIFY_REPLACE = 'MODIFY_REPLACE' +MODIFY_INCREMENT = 'MODIFY_INCREMENT' + +# client strategies +SYNC = 'SYNC' +SAFE_SYNC = 'SAFE_SYNC' +SAFE_RESTARTABLE = 'SAFE_RESTARTABLE' +ASYNC = 'ASYNC' +LDIF = 'LDIF' +RESTARTABLE = 'RESTARTABLE' +REUSABLE = 'REUSABLE' +MOCK_SYNC = 'MOCK_SYNC' +MOCK_ASYNC = 'MOCK_ASYNC' +ASYNC_STREAM = 'ASYNC_STREAM' + +# get rootDSE info +NONE = 'NO_INFO' +DSA = 'DSA' +SCHEMA = 'SCHEMA' +ALL = 'ALL' + +OFFLINE_EDIR_8_8_8 = 'EDIR_8_8_8' +OFFLINE_EDIR_9_1_4 = 'EDIR_9_1_4' +OFFLINE_AD_2012_R2 = 'AD_2012_R2' +OFFLINE_SLAPD_2_4 = 'SLAPD_2_4' +OFFLINE_DS389_1_3_3 = 'DS389_1_3_3' + +# server pooling +FIRST = 'FIRST' +ROUND_ROBIN = 'ROUND_ROBIN' +RANDOM = 'RANDOM' + +# Hashed password +HASHED_NONE = 'PLAIN' +HASHED_SHA = 'SHA' +HASHED_SHA256 = 'SHA256' +HASHED_SHA384 = 'SHA384' +HASHED_SHA512 = 'SHA512' +HASHED_MD5 = 'MD5' +HASHED_SALTED_SHA = 'SALTED_SHA' +HASHED_SALTED_SHA256 = 'SALTED_SHA256' +HASHED_SALTED_SHA384 = 'SALTED_SHA384' +HASHED_SALTED_SHA512 = 'SALTED_SHA512' +HASHED_SALTED_MD5 = 'SALTED_MD5' + +if str is not bytes: # Python 3 + NUMERIC_TYPES = (int, float) + INTEGER_TYPES = (int, ) +else: + NUMERIC_TYPES = (int, long, float) + INTEGER_TYPES = (int, long) + +# types for string and sequence +if str is not bytes: # Python 3 + STRING_TYPES = (str, ) + SEQUENCE_TYPES = (set, list, tuple, GeneratorType, type(dict().keys())) # dict.keys() is a iterable memoryview in Python 3 +else: # Python 2 + try: + from future.types.newstr import newstr + except ImportError: + pass + + STRING_TYPES = (str, unicode) + SEQUENCE_TYPES = (set, list, tuple, GeneratorType) + +# centralized imports # must be at the end of the __init__.py file +from .version import __author__, __version__, __email__, __description__, __status__, __license__, __url__ +from .utils.config import get_config_parameter, set_config_parameter +from .core.server import Server +from .core.connection import Connection +from .core.tls import Tls +from .core.pooling import ServerPool +from .core.rdns import ReverseDnsSetting +from .abstract.objectDef import ObjectDef +from .abstract.attrDef import AttrDef +from .abstract.attribute import Attribute, WritableAttribute, OperationalAttribute +from .abstract.entry import Entry, WritableEntry +from .abstract.cursor import Reader, Writer +from .protocol.rfc4512 import DsaInfo, SchemaInfo diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57bdc5d526665edc5b7d28ab67ed430682654992 GIT binary patch literal 3214 zcmZuz$#&bw73DmMn$@1?S$0ddM$5B7qA0-zK^h=!>$$rTidB?pV_*uP-Ez9K=^w}< zyKItWPX9rFN^P_1MSh@Hc?FW9Y==0yc=x`VP=$A)(&S_zhQELO%GiHrVzK{7GWz8( zc#40)r$j79V-TZpnsDN70uu2UO+u2UAVt%VrWwf4EM#d8ax|ZcK^_XU026cqinIum zbP}fM6im};n4vQ;OJ`w@&cQsLhXuL--_UR17(E8Z>2WwgPrylf5>C-maGIWmGxQ9c zrDx$BJqPFMdAL9?z(slyF40SHnO=q~^a@<1SK%7H2G{9zxIu5gB3*==^d{V*x8Pg) zEiBO`Sfy^bV}h6g>fYv45KXiv1Grq`~qY9?algmz{>&gl0VUD&`$a#n{XD z1)S&a@tC}JV_xEQ3`cy0BOi{`Nr6RGN}Sj3F6_Dh;J$%3?sxE=`#pT`{s2F?HrRN2 zDy=wwa$C@H_h2vL+fLi1K%;oaVQvRHQLH)p?pt^p#m}6s`wrek@pI?B>wpu*y5qVY zcu`z+e76U^C^nowyBxS1K;VWDMq173yC2|#`w>1yyzczy9>9V72|h*qh4UBpC-}+z z8Gc4?TCqh-#0$U6mvS*KCbyZ#cq{aIbA9OHAvMSjZi@8<+@!n^j#6fn}c|Ipw~@OA*M-G5eb|2 zSV)x=i-@#NUJ_kot!AlV5&~%hxd|DIC}w#FiWOXkW^CKCF=Q0|m9mSQbMsSjWqIX~ z_$^VW)>N&sYb&ZMCWo;~bkZPVYDi6jPhBQrX2><8Y?3N5@bRr(qb%~4QX%+U7|ukY ziQA@_4W)#8n^vMkO2=8m#L-O7Buy)7ldsmw&j$nGaxfh9DMmNj!sk+|ki|{bj7m); zRZGF6EANo1B9e-(LxHH8X>ZAE7~iv3>~$z8s=az=Wz{xUA#dqQ9VyBashAeGEeWdtAP;Sy8a^);w_hj zjEjZf|EO|R7UMWKMuoEPd8{pGLY8beffNVny6-#4W=$s7$y6_}SQvJ_eH8Pxy?5A6 zWgR40B@DR?lURcocK7-r6SJ>)H*D=WY%DF*da_<|vX*nG;_B1H3;BVV9QBAO>KT)@ zC_YC-^M*jhiC->PvU;_l!UZ|jD)NN`5l9y z0od}ObI*xcB4*9vd6}1AK$umUjapRLqiTk!u@pJO%uybB#L2PprCXf%JT>+WJ}Kv% zk}xd+zq&C#D`8H;yo3b=e6tDqg*~u<;(!c|pfF&O4Gc2_Gr%?Lx~()CrdDb;hy{~a zXh-NNnXc7|sWh}2`r?rsKQ3oJA>pKiQxZ-~I3wY#gmV(kOSmB6qJ&ElE=#x~p(x?1 zgliJ6Bfwm(QqeVo*hfnHb8S%KhuV=+pB?obm;C%lI#T-lhMa9t!c95l#ExR^U@b=n zR~VA0u*Y#!*kc+M_LxS6J*4ubnH{CZCb969B!~Q3l_P(x$_c(06z361^bV2UI|x}I zl3gzp>5k*KLOjW4m6%%DZtT|O!D>c>Y~!~mq9Wz^-aZu3Ugh^;pe4}?FwqTgjIiHx zm`KS=5h>bjW8ytK2w=)0FPg+Cli{%QoqpKoY&j~a<$;s&JGi4_LUVgQ4+-Z!7umko zZTpmo?9k8ns@(cD3F{IzBy38!D`5)(iv6(b1j_@<;`gL}U+NQWA7>0Af8r0MG94+{ zaOhL~p;U8`8ae@gBxy0CJ#;MeC;nJU`AFi_3-}Ys=URKXo2_=Z?2o*QKb47@!$fP~ zV_f;Xy_6$Q<0VY+vIJE&nL6yrq=9iFGZmScKFqZHJn%W+mZ=??n(1*r^xM9(%scIM zJb13j+%trK$M_o=OZa2ucIftQ_qx5Mu802bI7_|v8~dFfw+?PQwAEW1qHTA*ZfM)f zy#tYZ==!wpu*dj6dMx-2A$6jdOvR%sy657l#E{2Rqs%B8@xlFbHW*`squiHcjr38w k!97uk=i)hu$wE96Kb1(tXYk4-a`9sF3P#1xu7xQ3Kh)oS0ssI2 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__pycache__/version.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6da0922fd9ecf5d75b1be143a4d0ac2f9f291407 GIT binary patch literal 438 zcmYL_-%i3X6vj9H4N;;o@xESi!3H9U7-K+;+z_)!;>B*7(w5QKbxqq5w^#8AjBmuP zZ{d}lKs-&q{MvJR^7TBl+bze&#}}ol;yB;s;SjEcvE3S2Ax`8FH*!fOs*q|_CAFwV z>QS9Eq6YC6PN!Maul$kUFV1Ex-5?wgn-|Y$Ij)2tr!g zwdg^ZsS-{hBvfO?WZ7=_KpSK-ZP|9>3{#;ggrAOT+Nu4?PcJZu3?!3XCTun5UHLYQ gSMN9Z?x%a*+wf(+ZQdo;GpF}nIsX$YHTQr00*WAox&QzG literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__init__.py new file mode 100644 index 0000000..29aabb3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__init__.py @@ -0,0 +1,50 @@ +""" +""" + +# Created on 2016.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +STATUS_INIT = 'Initialized' # The entry object is initialized +STATUS_VIRTUAL = 'Virtual' # The entry is a new writable entry, still empty +STATUS_MANDATORY_MISSING = 'Missing mandatory attributes' # The entry has some mandatory attributes missing +STATUS_READ = 'Read' # The entry has been read +STATUS_WRITABLE = 'Writable' # The entry has been made writable, still no changes +STATUS_PENDING_CHANGES = 'Pending changes' # The entry has some changes to commit, mandatory attributes are present +STATUS_COMMITTED = 'Committed' # The entry changes has been committed +STATUS_READY_FOR_DELETION = 'Ready for deletion' # The entry is set to be deleted +STATUS_READY_FOR_MOVING = 'Ready for moving' # The entry is set to be moved in the DIT +STATUS_READY_FOR_RENAMING = 'Ready for renaming' # The entry is set to be renamed +STATUS_DELETED = 'Deleted' # The entry has been deleted + +STATUSES = [STATUS_INIT, + STATUS_VIRTUAL, + STATUS_MANDATORY_MISSING, + STATUS_READ, + STATUS_WRITABLE, + STATUS_PENDING_CHANGES, + STATUS_COMMITTED, + STATUS_READY_FOR_DELETION, + STATUS_READY_FOR_MOVING, + STATUS_READY_FOR_RENAMING, + STATUS_DELETED] + +INITIAL_STATUSES = [STATUS_READ, STATUS_WRITABLE, STATUS_VIRTUAL] diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ff250259c218570aca03d26c1350f12bdb12718 GIT binary patch literal 697 zcmZuv&2G~`5VjpBcH*Y3dVnHv$hC(y2ZV$wgzCnoSc;v>c2hc+)h0U)EBq&WQ<1z1 zPk?x%TzLyltb+qcVMhCD=bLY4G}^uH_j`)8uip`$Ohx%o2RpOmI?MornP9RmbXgC2%mNEl)Ubs*wy}c-n%Ko2S_=yfww$(TL7yE& z%2|J-_Q3KoE;vp28W|W>A6j*^CB4uFSmt4?U zg6pGO%vi0Sf1=q!3c8~_O}P-r)+e=gHF(U+0mB3Z&$IRMUoOp`WZ}Q65;K}g4h*N( zBMZ(BHwGarpA!OB6x;D#M7+R@;jjs&UKromV>oSM-wqr*o`es?_oB!PZvK>ouI<24 zBfAg1*uEaS@T?(j-N2D*GWuW#H*N&S4L_Rrz8A-?11}n;?(;z2PeS6jV>k9D0X*MJ z`IBiqd%q@h1KY1ty9KsQWP9^>k9u^ypl6TCj`^mPE%_O?@bhvg(qdTf;+$udphb`fh EU$djXTmS$7 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/attrDef.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/attrDef.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90b6459c269946d0d93eb1592e719665fe00a4d9 GIT binary patch literal 3832 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 RhtgTo)Y6+cy?B%R?$;+T=E?v7 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/attribute.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/attribute.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eed9933a82cce28596de3fcb16969c2c086d307 GIT binary patch literal 8985 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/objectDef.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/__pycache__/objectDef.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dda244120b84c41e770f12793f8dab3157ce3bb GIT binary patch literal 8659 zcmbtZOKcp;dG6Qr^bCi?;X@Rums@X*q@`@f>uj`KMHESGWNRsfq%3U%i{9Z>QyQ|T zdsN-jii4pKrVukW5I8;=2oO+!5o{13SOhr)HjvzW$R$A#7>fpS$|ZZqJurO8_gD4w zJeGnD>rKNkP|q>b&oxcQZ04PO({ik4!6}ILykBgNI3vxHQ)-Snqs_8Y7VVZl z)~q;{=D0I1o(uj&bJCd<^`bx3Jmwq|^$~x%dE7ZJ>Lq`sIqS?ePdF!O{rEAwfF^?SE_1~_Zxv1d95$h^m!qU`I5K! zg+|XtQo6si@bJ6d?lR{gPsZr!!N!(Xk7dIIHP9=Kjh)!*BU-CJ^O`l$K%=a!uijgE z-(COk;qqEiUR(atN6RaV%jvVZ=J6LEPl}6S5Mby=7*w^SD2KQgY=+5nJq)6_7Q}8G zx^=%6MecSZVBmjd6L+`P<-mPW^Bb%dha7#U7Hg4rFNnM#YQ&8f-s496Y{75TqNPSX zM*q}PFLp8VX5*>bs_|OWi#=X76WtG=CL<_ZFQ{$!9!qk|tE&%IliZz!wR?++^>FpU z`h&#>_Y-UR$@=oj((+QBwzK=oB;+%+c#5M!N;IZAI=e#h@k(_Jl8sl2lVf>i;cl`5 zE8?DKBdmnGB~Q&MurXG_bCHd+3EW56B%8v$#E!9P+(+4QHiLWF8}lmL1^$xFvJ-e7 z4=i?)okDGbon~inpJY{Lv$L3cid|*r*m=~Bu?y@X`li_>b{Y5MOoMb>OA7LYAqBNX zh{dYc;t-J_wrhbMio>@XfgL~dY&v~A5~nw3r;-!dHSXCFj=*C?SF;(m8)sVMyYGs( zw!K}u5sB(1Z+HRockKYXZ!-_4Dc?#5n=2M={Ia3zU}3|vYm9-c7BHK8&F}^4J5eKe zDu%rFp6Gb%Jv(f9oJ1j#gJi3+yQ9?WUKHVF4}#%wy9U;=n&&%SP{$k?y`T3v`|&dm z%jv#E>;L3g=zCr6uvn5&yo$wfFW%u;i=29;o=b%zk2}?MT+yf4-43K<+v26C%AOkI zDOUHj=u}62s_v;BL-buipMgF@^u5zD&}YQjzS2>)bf(TL9bMG4dF82W)8~~~IZ$F_ zU*j(hl&xG8pfss|n18LP=)=f`pQs$;g3bcnPeD=mb0xT&z4nQs`y?CsX+gE>}iWw}LfteZYZ{I{K_|Ib{%2oyM zw122!|anslJ70=+1&BqKebiIQ=*z5^+5 z_8=!IxM7324Iozg*p7e>I}RZVHD*Tw58ERbBYQLC_WZ@@R(nD=+CdoGsfs0eS2orO zkLgD^On@?pD>{XOj`*XgJ#6q6mN2VqL4anJzto-^U{d7*x3#1!6;*tVBX>wCl_F<>g~OPRXOx!96M?7DOFeps*h(JfTEuYARI@~>ew zxgd?7&FU&YNA>emT%h72ipRK8?vhcre}9sSTibcrfN9{na>v@Iq%y~iS`2{5)^Zak z$8S|9lVSsaBh{UkXod+CiRHQkcCO3Icy!7x5Y6KNLU#jZs{a|-6ySNY!M%)#kJ3QI zInG9aDj%bkV^mC2F+~NrCj1PFWYTSgtsNgM3c;j-B7Ph_)qG+^p1+xt`j;t&b}C;I z+p(d=C!^pwNOrU>K-O_MZ+J5Cl&2>G64WiuUe3@RP*UCl z&>j{#I`utY1;m^{PZ2$pJwV9e2msr74L9()kG}ipE1~ZM`Uqe~xAXiUrOFAagU3p6 ziJ2XBS^-3s<1xVLui{EP#_}1Qj!QTd5M-_J(^y$sv#+$Zs=a=0#H_U-kBnF7!64Tv(V^>!4m@+LXa|P05psSF-SAied*n97 zwMLMP!4$ij955&+f>T?A4#{4A5-$vkuZ6a%$*)t_*J;4fRJ`N>n0Tj^lzSeXkh&X0 zE!4TE)5Ogtu84F&QA_w=*G!aUToqhJbpoAsD z9}2*I4Z(;ZGqw^&QlaW$EJS5d05?u*BIijQ|)J>w2ejnZxwyd8X6a}J) zbE(C%URj_s$>!~=LzE+ZlqGnQZ={527+qvp>&>+>sN;N5DQ3y+>q zPf6a>*4%@8OE>L--JzXXqun7<5vItZRY~*HJE3Zd#&3hF*V@D4AJ7n_y2F-&!`VFA zQnbwv9<8kpvGY4DBR2+E16L%GNudenjy%KNl+VN}BosqBdunT`EER?QCOce1so;&d2;k`8 zT(`SuqY-<}A%RN?smFDH+&B5L{>d?vq{tYc$!URtfghp5RAS&zeGS`isJ(_dGqNT+ zEDYN%qK2cM#ZDMXoZBw)k5xF@a2{c2fbUvt#;_}VJ+|UJgUw0ZPz`l)+zrYopK%oc|uK}dV z{1Zr5H0c7ghtEYGah=YCexz`jrN4>?1^~hi>#>3WN#$o^EvA!!trh`^-qC4?#lGn) z?U_)9uwu_dqz3mq4E)`JO{*HiOC(W1tI#bSo1Wy5YuNFQS}93f)D_LY#(P3h$So4a zXkdLAT_$$}f=_;ASMcGFboDG5CA*s$$*%b4LJDMu<)1t>B6ojItkCu;*!Dp!mjp-i zKvudNn(`TNqjl6R;R6LzqMgFb>#|*VO(~Z-eg$uGI;*521N9!u{C(;hL6I`gze^40 zv*H43!nurgHeB~pJVk^8#CjQ5aR{awf-Hln?k3jhJsSmFHP~|Ds!`l0LZ|ORJ)c{T zWqc>#i_AlJGYi@F9>o!B#Lkm{N-Ba3h8~mL zL3L2-`v4`EjDYSUZ?dKFCsZOs^F;Kc2BVU;i6B1@%DkkZXFOS0eHw}gXoLI~g|6{& zOe#Hm$`>S7niKVe)8UL|V(rGeEiZCPlsfZ0%46(!iPcSE@bBQ|6!7>vG$i>fjwR3- z_F_mW__xvfD_jvl7Gd24ITdik;eOBdHf<OHTJIY#sx8i-ZqQ9jPh} zSaStS*AGO57W|)RB?S5$ZgTF>e2u6Lk=C#22^*G2{j&p7wmh}WlS^;$4wdx0t@94` z9Tw<`S}8Kay~uwi9B?@G!mTb+1h}sT8Z0ypkAK#C3-O?QXC(S{TtfROjfH!8Ur%E{ zG54(Ejs$-q_#FekzkNA>K!8-<1MOj@lM_+p|3H*4AZ2F8<7p~tCZ0qpD&H|vdp6ZE zg+0qbp{@4k3ydLGnI$2SaH7m)Z^P|HnKMP^1*vTN6XZI(dD3ozbWS8$k!Q7UiafY< z2aq!lgPVeO0Z!JEx7p49Vh$YRb&*F!J|`3@S)_b9R1b8DxWG1J+CCONo^XWC+Shp+wk0KC1{jN)&dG=h+u}0M?e#5B)xiTcW-gmeGr7 z{!d)p(BoQfn@BD*9*@dYIp-JF@fG9FqxI!AclpWU{YS|AyLVR~eBdIKT3%dtmzM7i zFinPUl4d)HLNI+ortQdul#V3C?@RH4FpPcckm)ToDGDb|oQhl**#(i=`Y)P*nf5R1#1E=IDzf=;g1mz7V-(({fRYCq>0+2=7DRM{2)o34o zgOFsS~z!c;i%IAO}y^K*#Nf%=EK2pbH94O;3p<n2qdw7w#xBs*d$(1O-QYi3-xsKHVU{aahL5qVaE` zNDP{U7f`L{`eG!ZRTTX9M7B?{KS0O-;)+Pkl^hA<6bUB8l0+6Edz#!TY84q*oahPa zu(zGz68VHWE+MNlGJ+>~!%Um+)^vOYQN_0~aK zFfyN`BK4?6n$e)-_#1rBO5OKrybl2^uo{^dLNQ1k+kLAWCaoGP_*K=rl!KU|pn=fA zb(5m&Hbb@p=f+Lo**)K>`DqW_X%^OzsQ(5rd5sE6UGP7qLU@X|sdkTw`&6t@@sNsD zD#W?wHg;n#;%n5fPQ@cC$Pp6G6Q?8OA5n3Bun@>iQSc>P5jnF~9tZr6HEE4mI{p>Q zv<%C_r6XHTEmpBmJY${Y^wvuCEU)37XkjE$K~A1b7c8_8NoTB%kFRq;P_IQcJmNwW z$$1t+D8C?(1c>-cqVy;|lI!MFkQs=>dg#yb&HA_A{>C@uR|rb@Ij6Ede8p;FQjbS- z^cjTJI1}jaly>5VAI;Sp^p#zF7Rj2#r*>gwoPwmnM|Sy9qxX%2zF+VeDrQk6ri6a6 f?xVIbvF7Cw-y#Dja$3er3AwBp{3#1ee_Q{5l6CV0 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attrDef.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attrDef.py new file mode 100644 index 0000000..caffb53 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attrDef.py @@ -0,0 +1,121 @@ +""" +""" + +# Created on 2014.01.11 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata + +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .. import SEQUENCE_TYPES +from ..core.exceptions import LDAPKeyError +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +class AttrDef(object): + """Hold the definition of an attribute + + :param name: the real attribute name + :type name: string + :param key: the friendly name to use in queries and when accessing the attribute, default to the real attribute name + :type key: string + :param validate: called to check if the value in the query is valid, the callable is called with the value parameter + :type validate: callable + :param pre_query: called to transform values returned by search + :type pre_query: callable + :param post_query: called to transform values returned by search + :type post_query: callable + :param default: value returned when the attribute is absent (defaults to NotImplemented to allow use of None as default) + :type default: string, integer + :param dereference_dn: reference to an ObjectDef instance. When the attribute value contains a dn it will be searched and substituted in the entry + :type dereference_dn: ObjectDef + :param description: custom attribute description + :type description: string + :param mandatory: specify if attribute is defined as mandatory in LDAP schema + :type mandatory: boolean + """ + + def __init__(self, name, key=None, validate=None, pre_query=None, post_query=None, default=NotImplemented, dereference_dn=None, description=None, mandatory=False, single_value=None, alias=None): + self.name = name + self.key = ''.join(key.split()) if key else name # key set to name if not present + self.validate = validate + self.pre_query = pre_query + self.post_query = post_query + self.default = default + self.dereference_dn = dereference_dn + self.description = description + self.mandatory = mandatory + self.single_value = single_value + self.oid_info = None + if not alias: + self.other_names = None + elif isinstance(alias, SEQUENCE_TYPES): # multiple aliases + self.\ + other_names = set(alias) + else: # single alias + self.other_names = set([alias]) # python 2 compatibility + + if log_enabled(BASIC): + log(BASIC, 'instantiated AttrDef: <%r>', self) + + def __repr__(self): + r = 'ATTR: ' + ', '.join([self.key] + list(self.other_names)) if self.other_names else self.key + r += '' if self.name == self.key else ' [' + self.name + ']' + r += '' if self.default is NotImplemented else ' - default: ' + str(self.default) + r += '' if self.mandatory is None else ' - mandatory: ' + str(self.mandatory) + r += '' if self.single_value is None else ' - single_value: ' + str(self.single_value) + r += '' if not self.dereference_dn else ' - dereference_dn: ' + str(self.dereference_dn) + r += '' if not self.description else ' - description: ' + str(self.description) + if self.oid_info: + for line in str(self.oid_info).split(linesep): + r += linesep + ' ' + line + return r + + def __str__(self): + return self.__repr__() + + def __eq__(self, other): + if isinstance(other, AttrDef): + return self.key == other.key + + return False + + def __lt__(self, other): + if isinstance(other, AttrDef): + return self.key < other.key + + return False + + def __hash__(self): + if self.key: + return hash(self.key) + else: + return id(self) # unique for each instance + + def __setattr__(self, key, value): + if hasattr(self, 'key') and key == 'key': # key cannot be changed because is being used for __hash__ + error_message = 'key \'%s\' already set' % key + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + else: + object.__setattr__(self, key, value) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attribute.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attribute.py new file mode 100644 index 0000000..5d33cc7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/attribute.py @@ -0,0 +1,290 @@ +""" +""" + +# Created on 2014.01.06 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .. import MODIFY_ADD, MODIFY_REPLACE, MODIFY_DELETE, SEQUENCE_TYPES +from ..core.exceptions import LDAPCursorError +from ..utils.repr import to_stdout_encoding +from . import STATUS_PENDING_CHANGES, STATUS_VIRTUAL, STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +# noinspection PyUnresolvedReferences +class Attribute(object): + """Attribute/values object, it includes the search result (after post_query transformation) of each attribute in an entry + + Attribute object is read only + + - values: contain the processed attribute values + - raw_values': contain the unprocessed attribute values + + + """ + + def __init__(self, attr_def, entry, cursor): + self.key = attr_def.key + self.definition = attr_def + self.values = [] + self.raw_values = [] + self.response = None + self.entry = entry + self.cursor = cursor + other_names = [name for name in attr_def.oid_info.name if self.key.lower() != name.lower()] if attr_def.oid_info else None + self.other_names = set(other_names) if other_names else None # self.other_names is None if there are no short names, else is a set of secondary names + + def __repr__(self): + if len(self.values) == 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + elif len(self.values) > 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + filler = ' ' * (len(self.key) + 6) + for value in self.values[1:]: + r += linesep + filler + to_stdout_encoding(value) + else: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding('') + + return r + + def __str__(self): + if len(self.values) == 1: + return to_stdout_encoding(self.values[0]) + else: + return to_stdout_encoding(self.values) + + def __len__(self): + return len(self.values) + + def __iter__(self): + return self.values.__iter__() + + def __getitem__(self, item): + return self.values[item] + + def __getstate__(self): + cpy = dict(self.__dict__) + cpy['cursor'] = None + return cpy + + def __eq__(self, other): + try: + if self.value == other: + return True + except Exception: + return False + + def __ne__(self, other): + return not self == other + + @property + def value(self): + """ + :return: The single value or a list of values of the attribute. + """ + if not self.values: + return None + + return self.values[0] if len(self.values) == 1 else self.values + + +class OperationalAttribute(Attribute): + """Operational attribute/values object. Include the search result of an + operational attribute in an entry + + OperationalAttribute object is read only + + - values: contains the processed attribute values + - raw_values: contains the unprocessed attribute values + + It may not have an AttrDef + + """ + + def __repr__(self): + if len(self.values) == 1: + r = to_stdout_encoding(self.key) + ' [OPERATIONAL]: ' + to_stdout_encoding(self.values[0]) + elif len(self.values) > 1: + r = to_stdout_encoding(self.key) + ' [OPERATIONAL]: ' + to_stdout_encoding(self.values[0]) + filler = ' ' * (len(self.key) + 6) + for value in sorted(self.values[1:]): + r += linesep + filler + to_stdout_encoding(value) + else: + r = '' + + return r + + +class WritableAttribute(Attribute): + def __repr__(self): + filler = ' ' * (len(self.key) + 6) + if len(self.values) == 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + elif len(self.values) > 1: + r = to_stdout_encoding(self.key) + ': ' + to_stdout_encoding(self.values[0]) + for value in self.values[1:]: + r += linesep + filler + to_stdout_encoding(value) + else: + r = to_stdout_encoding(self.key) + to_stdout_encoding(': ') + if self.definition.name in self.entry._changes: + r += linesep + filler + 'CHANGES: ' + str(self.entry._changes[self.definition.name]) + return r + + def __iadd__(self, other): + self.add(other) + return Ellipsis # hack to avoid calling set() in entry __setattr__ + + def __isub__(self, other): + self.delete(other) + return Ellipsis # hack to avoid calling set_value in entry __setattr__ + + def _update_changes(self, changes, remove_old=False): + # checks for friendly key in AttrDef and uses the real attribute name + if self.definition and self.definition.name: + key = self.definition.name + else: + key = self.key + + if key not in self.entry._changes or remove_old: # remove old changes (for removing attribute) + self.entry._changes[key] = [] + + self.entry._changes[key].append(changes) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'updated changes <%r> for <%s> attribute in <%s> entry', changes, self.key, self.entry.entry_dn) + self.entry._state.set_status(STATUS_PENDING_CHANGES) + + def add(self, values): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'adding %r to <%s> attribute in <%s> entry', values, self.key, self.entry.entry_dn) + # new value for attribute to commit with a MODIFY_ADD + if self.entry._state._initial_status == STATUS_VIRTUAL: + error_message = 'cannot perform a modify operation in a new entry' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot add attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is None: + error_message = 'value to add cannot be None' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is not None: + validated = self.definition.validate(values) # returns True, False or a value to substitute to the actual values + if validated is False: + error_message = 'value \'%s\' non valid for attribute \'%s\'' % (values, self.key) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif validated is not True: # a valid LDAP value equivalent to the actual values + values = validated + self._update_changes((MODIFY_ADD, values if isinstance(values, SEQUENCE_TYPES) else [values])) + + def set(self, values): + # new value for attribute to commit with a MODIFY_REPLACE, old values are deleted + if log_enabled(PROTOCOL): + log(PROTOCOL, 'setting %r to <%s> attribute in <%s> entry', values, self.key, self.entry.entry_dn) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot set attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is None: + error_message = 'new value cannot be None' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + validated = self.definition.validate(values) # returns True, False or a value to substitute to the actual values + if validated is False: + error_message = 'value \'%s\' non valid for attribute \'%s\'' % (values, self.key) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif validated is not True: # a valid LDAP value equivalent to the actual values + values = validated + self._update_changes((MODIFY_REPLACE, values if isinstance(values, SEQUENCE_TYPES) else [values]), remove_old=True) + + def delete(self, values): + # value for attribute to delete in commit with a MODIFY_DELETE + if log_enabled(PROTOCOL): + log(PROTOCOL, 'deleting %r from <%s> attribute in <%s> entry', values, self.key, self.entry.entry_dn) + if self.entry._state._initial_status == STATUS_VIRTUAL: + error_message = 'cannot delete an attribute value in a new entry' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot delete attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if values is None: + error_message = 'value to delete cannot be None' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if not isinstance(values, SEQUENCE_TYPES): + values = [values] + for single_value in values: + if single_value not in self.values: + error_message = 'value \'%s\' not present in \'%s\'' % (single_value, ', '.join(self.values)) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._update_changes((MODIFY_DELETE, values)) + + def remove(self): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'removing <%s> attribute in <%s> entry', self.key, self.entry.entry_dn) + if self.entry._state._initial_status == STATUS_VIRTUAL: + error_message = 'cannot remove an attribute in a new entry' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if self.entry.entry_status in [STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING]: + error_message = self.entry.entry_status + ' - cannot remove attributes' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._update_changes((MODIFY_REPLACE, []), True) + + def discard(self): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'discarding <%s> attribute in <%s> entry', self.key, self.entry.entry_dn) + del self.entry._changes[self.key] + if not self.entry._changes: + self.entry._state.set_status(self.entry._state._initial_status) + + @property + def virtual(self): + return False if len(self.values) else True + + @property + def changes(self): + if self.key in self.entry._changes: + return self.entry._changes[self.key] + return None diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/cursor.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/cursor.py new file mode 100644 index 0000000..690e87d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/cursor.py @@ -0,0 +1,912 @@ +""" +""" + +# Created on 2014.01.06 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from collections import namedtuple +from copy import deepcopy +from datetime import datetime +from os import linesep +from time import sleep + +from . import STATUS_VIRTUAL, STATUS_READ, STATUS_WRITABLE +from .. import SUBTREE, LEVEL, DEREF_ALWAYS, DEREF_NEVER, BASE, SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from ..abstract import STATUS_PENDING_CHANGES +from .attribute import Attribute, OperationalAttribute, WritableAttribute +from .attrDef import AttrDef +from .objectDef import ObjectDef +from .entry import Entry, WritableEntry +from ..core.exceptions import LDAPCursorError, LDAPObjectDereferenceError +from ..core.results import RESULT_SUCCESS +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..utils.dn import safe_dn, safe_rdn +from ..utils.conv import to_raw +from ..utils.config import get_config_parameter +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED +from ..protocol.oid import ATTRIBUTE_DIRECTORY_OPERATION, ATTRIBUTE_DISTRIBUTED_OPERATION, ATTRIBUTE_DSA_OPERATION, CLASS_AUXILIARY + +Operation = namedtuple('Operation', ('request', 'result', 'response')) + + +def _ret_search_value(value): + return value[0] + '=' + value[1:] if value[0] in '<>~' and value[1] != '=' else value + + +def _create_query_dict(query_text): + """ + Create a dictionary with query key:value definitions + query_text is a comma delimited key:value sequence + """ + query_dict = dict() + if query_text: + for arg_value_str in query_text.split(','): + if ':' in arg_value_str: + arg_value_list = arg_value_str.split(':') + query_dict[arg_value_list[0].strip()] = arg_value_list[1].strip() + + return query_dict + + +class Cursor(object): + # entry_class and attribute_class define the type of entry and attribute used by the cursor + # entry_initial_status defines the initial status of a entry + # entry_class = Entry, must be defined in subclasses + # attribute_class = Attribute, must be defined in subclasses + # entry_initial_status = STATUS, must be defined in subclasses + + def __init__(self, connection, object_def, get_operational_attributes=False, attributes=None, controls=None, auxiliary_class=None): + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + self.connection = connection + self.get_operational_attributes = get_operational_attributes + if connection._deferred_bind or connection._deferred_open: # probably a lazy connection, tries to bind + connection._fire_deferred() + + if isinstance(object_def, (STRING_TYPES, SEQUENCE_TYPES)): + if connection.closed: # try to open connection if closed to read schema + connection.bind() + object_def = ObjectDef(object_def, connection.server.schema, auxiliary_class=auxiliary_class) + self.definition = object_def + if attributes: # checks if requested attributes are defined in ObjectDef + not_defined_attributes = [] + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + + for attribute in attributes: + if attribute not in self.definition._attributes and attribute.lower() not in conf_attributes_excluded_from_object_def: + not_defined_attributes.append(attribute) + + if not_defined_attributes: + error_message = 'Attributes \'%s\' non in definition' % ', '.join(not_defined_attributes) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + self.attributes = set(attributes) if attributes else set([attr.name for attr in self.definition]) + self.controls = controls + self.execution_time = None + self.entries = [] + self.schema = self.connection.server.schema + self._do_not_reset = False # used for refreshing entry in entry_refresh() without removing all entries from the Cursor + self._operation_history = list() # a list storing all the requests, results and responses for the last cursor operation + + def __repr__(self): + r = 'CURSOR : ' + self.__class__.__name__ + linesep + r += 'CONN : ' + str(self.connection) + linesep + r += 'DEFS : ' + ', '.join(self.definition._object_class) + if self.definition._auxiliary_class: + r += ' [AUX: ' + ', '.join(self.definition._auxiliary_class) + ']' + r += linesep + # for attr_def in sorted(self.definition): + # r += (attr_def.key if attr_def.key == attr_def.name else (attr_def.key + ' <' + attr_def.name + '>')) + ', ' + # if r[-2] == ',': + # r = r[:-2] + # r += ']' + linesep + if hasattr(self, 'attributes'): + r += 'ATTRS : ' + repr(sorted(self.attributes)) + (' [OPERATIONAL]' if self.get_operational_attributes else '') + linesep + if isinstance(self, Reader): + if hasattr(self, 'base'): + r += 'BASE : ' + repr(self.base) + (' [SUB]' if self.sub_tree else ' [LEVEL]') + linesep + if hasattr(self, '_query') and self._query: + r += 'QUERY : ' + repr(self._query) + ('' if '(' in self._query else (' [AND]' if self.components_in_and else ' [OR]')) + linesep + if hasattr(self, 'validated_query') and self.validated_query: + r += 'PARSED : ' + repr(self.validated_query) + ('' if '(' in self._query else (' [AND]' if self.components_in_and else ' [OR]')) + linesep + if hasattr(self, 'query_filter') and self.query_filter: + r += 'FILTER : ' + repr(self.query_filter) + linesep + + if hasattr(self, 'execution_time') and self.execution_time: + r += 'ENTRIES: ' + str(len(self.entries)) + r += ' [executed at: ' + str(self.execution_time.isoformat()) + ']' + linesep + + if self.failed: + r += 'LAST OPERATION FAILED [' + str(len(self.errors)) + ' failure' + ('s' if len(self.errors) > 1 else '') + ' at operation' + ('s ' if len(self.errors) > 1 else ' ') + ', '.join([str(i) for i, error in enumerate(self.operations) if error.result['result'] != RESULT_SUCCESS]) + ']' + + return r + + def __str__(self): + return self.__repr__() + + def __iter__(self): + return self.entries.__iter__() + + def __getitem__(self, item): + """Return indexed item, if index is not found then try to sequentially search in DN of entries. + If only one entry is found return it else raise a KeyError exception. The exception message + includes the number of entries that matches, if less than 10 entries match then show the DNs + in the exception message. + """ + try: + return self.entries[item] + except TypeError: + pass + + if isinstance(item, STRING_TYPES): + found = self.match_dn(item) + + if len(found) == 1: + return found[0] + elif len(found) > 1: + error_message = 'Multiple entries found: %d entries match the text in dn' % len(found) + ('' if len(found) > 10 else (' [' + '; '.join([e.entry_dn for e in found]) + ']')) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise KeyError(error_message) + + error_message = 'no entry found' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise KeyError(error_message) + + def __len__(self): + return len(self.entries) + + if str is not bytes: # Python 3 + def __bool__(self): # needed to make the cursor appears as existing in "if cursor:" even if there are no entries + return True + else: # Python 2 + def __nonzero__(self): + return True + + def _get_attributes(self, response, attr_defs, entry): + """Assign the result of the LDAP query to the Entry object dictionary. + + If the optional 'post_query' callable is present in the AttrDef it is called with each value of the attribute and the callable result is stored in the attribute. + + Returns the default value for missing attributes. + If the 'dereference_dn' in AttrDef is a ObjectDef then the attribute values are treated as distinguished name and the relevant entry is retrieved and stored in the attribute value. + + """ + conf_operational_attribute_prefix = get_config_parameter('ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX') + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + attributes = CaseInsensitiveWithAliasDict() + used_attribute_names = set() + for attr in attr_defs: + attr_def = attr_defs[attr] + attribute_name = None + for attr_name in response['attributes']: + if attr_def.name.lower() == attr_name.lower(): + attribute_name = attr_name + break + + if attribute_name or attr_def.default is not NotImplemented: # attribute value found in result or default value present - NotImplemented allows use of None as default + attribute = self.attribute_class(attr_def, entry, self) + attribute.response = response + attribute.raw_values = response['raw_attributes'][attribute_name] if attribute_name else None + if attr_def.post_query and attr_def.name in response['attributes'] and response['raw_attributes'] != list(): + attribute.values = attr_def.post_query(attr_def.key, response['attributes'][attribute_name]) + else: + if attr_def.default is NotImplemented or (attribute_name and response['raw_attributes'][attribute_name] != list()): + attribute.values = response['attributes'][attribute_name] + else: + attribute.values = attr_def.default if isinstance(attr_def.default, SEQUENCE_TYPES) else [attr_def.default] + if not isinstance(attribute.values, list): # force attribute values to list (if attribute is single-valued) + attribute.values = [attribute.values] + if attr_def.dereference_dn: # try to get object referenced in value + if attribute.values: + temp_reader = Reader(self.connection, attr_def.dereference_dn, base='', get_operational_attributes=self.get_operational_attributes, controls=self.controls) + temp_values = [] + for element in attribute.values: + if entry.entry_dn != element: + temp_values.append(temp_reader.search_object(element)) + else: + error_message = 'object %s is referencing itself in the \'%s\' attribute' % (entry.entry_dn, attribute.definition.name) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectDereferenceError(error_message) + del temp_reader # remove the temporary Reader + attribute.values = temp_values + attributes[attribute.key] = attribute + if attribute.other_names: + attributes.set_alias(attribute.key, attribute.other_names) + if attr_def.other_names: + attributes.set_alias(attribute.key, attr_def.other_names) + used_attribute_names.add(attribute_name) + + if self.attributes: + used_attribute_names.update(self.attributes) + + for attribute_name in response['attributes']: + if attribute_name not in used_attribute_names: + operational_attribute = False + # check if the type is an operational attribute + if attribute_name in self.schema.attribute_types: + if self.schema.attribute_types[attribute_name].no_user_modification or self.schema.attribute_types[attribute_name].usage in [ATTRIBUTE_DIRECTORY_OPERATION, ATTRIBUTE_DISTRIBUTED_OPERATION, ATTRIBUTE_DSA_OPERATION]: + operational_attribute = True + else: + operational_attribute = True + if not operational_attribute and attribute_name not in attr_defs and attribute_name.lower() not in conf_attributes_excluded_from_object_def: + error_message = 'attribute \'%s\' not in object class \'%s\' for entry %s' % (attribute_name, ', '.join(entry.entry_definition._object_class), entry.entry_dn) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + attribute = OperationalAttribute(AttrDef(conf_operational_attribute_prefix + attribute_name), entry, self) + attribute.raw_values = response['raw_attributes'][attribute_name] + attribute.values = response['attributes'][attribute_name] if isinstance(response['attributes'][attribute_name], SEQUENCE_TYPES) else [response['attributes'][attribute_name]] + if (conf_operational_attribute_prefix + attribute_name) not in attributes: + attributes[conf_operational_attribute_prefix + attribute_name] = attribute + + return attributes + + def match_dn(self, dn): + """Return entries with text in DN""" + matched = [] + for entry in self.entries: + if dn.lower() in entry.entry_dn.lower(): + matched.append(entry) + return matched + + def match(self, attributes, value): + """Return entries with text in one of the specified attributes""" + matched = [] + if not isinstance(attributes, SEQUENCE_TYPES): + attributes = [attributes] + + for entry in self.entries: + found = False + for attribute in attributes: + if attribute in entry: + for attr_value in entry[attribute].values: + if hasattr(attr_value, 'lower') and hasattr(value, 'lower') and value.lower() in attr_value.lower(): + found = True + elif value == attr_value: + found = True + if found: + matched.append(entry) + break + if found: + break + # checks raw values, tries to convert value to byte + raw_value = to_raw(value) + if isinstance(raw_value, (bytes, bytearray)): + for attr_value in entry[attribute].raw_values: + if hasattr(attr_value, 'lower') and hasattr(raw_value, 'lower') and raw_value.lower() in attr_value.lower(): + found = True + elif raw_value == attr_value: + found = True + if found: + matched.append(entry) + break + if found: + break + return matched + + def _create_entry(self, response): + if not response['type'] == 'searchResEntry': + return None + + entry = self.entry_class(response['dn'], self) # define an Entry (writable or readonly), as specified in the cursor definition + entry._state.attributes = self._get_attributes(response, self.definition._attributes, entry) + entry._state.raw_attributes = deepcopy(response['raw_attributes']) + + entry._state.response = response + entry._state.read_time = datetime.now() + entry._state.set_status(self.entry_initial_status) + for attr in entry: # returns the whole attribute object + entry.__dict__[attr.key] = attr + + return entry + + def _execute_query(self, query_scope, attributes): + if not self.connection: + error_message = 'no connection established' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + old_query_filter = None + if query_scope == BASE: # requesting a single object so an always-valid filter is set + if hasattr(self, 'query_filter'): # only Reader has a query filter + old_query_filter = self.query_filter + self.query_filter = '(objectclass=*)' + else: + self._create_query_filter() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'executing query - base: %s - filter: %s - scope: %s for <%s>', self.base, self.query_filter, query_scope, self) + with self.connection: + result = self.connection.search(search_base=self.base, + search_filter=self.query_filter, + search_scope=query_scope, + dereference_aliases=self.dereference_aliases, + attributes=attributes if attributes else list(self.attributes), + get_operational_attributes=self.get_operational_attributes, + controls=self.controls) + if not self.connection.strategy.sync: + response, result, request = self.connection.get_response(result, get_request=True) + else: + if self.connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = self.connection.response + result = self.connection.result + request = self.connection.request + + self._store_operation_in_history(request, result, response) + + if self._do_not_reset: # trick to not remove entries when using _refresh() + return self._create_entry(response[0]) + + self.entries = [] + for r in response: + entry = self._create_entry(r) + if entry is not None: + self.entries.append(entry) + if 'objectClass' in entry: + for object_class in entry.objectClass: + if self.schema and self.schema.object_classes[object_class].kind == CLASS_AUXILIARY and object_class not in self.definition._auxiliary_class: + # add auxiliary class to object definition + self.definition._auxiliary_class.append(object_class) + self.definition._populate_attr_defs(object_class) + self.execution_time = datetime.now() + + if old_query_filter: # requesting a single object so an always-valid filter is set + self.query_filter = old_query_filter + + def remove(self, entry): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'removing entry <%s> in <%s>', entry, self) + self.entries.remove(entry) + + def _reset_history(self): + self._operation_history = list() + + def _store_operation_in_history(self, request, result, response): + self._operation_history.append(Operation(request, result, response)) + + @property + def operations(self): + return self._operation_history + + @property + def errors(self): + return [error for error in self._operation_history if error.result['result'] != RESULT_SUCCESS] + + @property + def failed(self): + if hasattr(self, '_operation_history'): + return any([error.result['result'] != RESULT_SUCCESS for error in self._operation_history]) + + +class Reader(Cursor): + """Reader object to perform searches: + + :param connection: the LDAP connection object to use + :type connection: LDAPConnection + :param object_def: the ObjectDef of the LDAP object returned + :type object_def: ObjectDef + :param query: the simplified query (will be transformed in an LDAP filter) + :type query: str + :param base: starting base of the search + :type base: str + :param components_in_and: specify if assertions in the query must all be satisfied or not (AND/OR) + :type components_in_and: bool + :param sub_tree: specify if the search must be performed ad Single Level (False) or Whole SubTree (True) + :type sub_tree: bool + :param get_operational_attributes: specify if operational attributes are returned or not + :type get_operational_attributes: bool + :param controls: controls to be used in search + :type controls: tuple + + """ + entry_class = Entry # entries are read_only + attribute_class = Attribute # attributes are read_only + entry_initial_status = STATUS_READ + + def __init__(self, connection, object_def, base, query='', components_in_and=True, sub_tree=True, get_operational_attributes=False, attributes=None, controls=None, auxiliary_class=None): + Cursor.__init__(self, connection, object_def, get_operational_attributes, attributes, controls, auxiliary_class) + self._components_in_and = components_in_and + self.sub_tree = sub_tree + self._query = query + self.base = base + self.dereference_aliases = DEREF_ALWAYS + self.validated_query = None + self._query_dict = dict() + self._validated_query_dict = dict() + self.query_filter = None + self.reset() + + if log_enabled(BASIC): + log(BASIC, 'instantiated Reader Cursor: <%r>', self) + + @property + def query(self): + return self._query + + @query.setter + def query(self, value): + self._query = value + self.reset() + + @property + def components_in_and(self): + return self._components_in_and + + @components_in_and.setter + def components_in_and(self, value): + self._components_in_and = value + self.reset() + + def clear(self): + """Clear the Reader search parameters + + """ + self.dereference_aliases = DEREF_ALWAYS + self._reset_history() + + def reset(self): + """Clear all the Reader parameters + + """ + self.clear() + self.validated_query = None + self._query_dict = dict() + self._validated_query_dict = dict() + self.execution_time = None + self.query_filter = None + self.entries = [] + self._create_query_filter() + + def _validate_query(self): + """Processes the text query and verifies that the requested friendly names are in the Reader dictionary + If the AttrDef has a 'validate' property the callable is executed and if it returns False an Exception is raised + + """ + if not self._query_dict: + self._query_dict = _create_query_dict(self._query) + + query = '' + for d in sorted(self._query_dict): + attr = d[1:] if d[0] in '&|' else d + for attr_def in self.definition: + if ''.join(attr.split()).lower() == attr_def.key.lower(): + attr = attr_def.key + break + if attr in self.definition: + vals = sorted(self._query_dict[d].split(';')) + + query += (d[0] + attr if d[0] in '&|' else attr) + ': ' + for val in vals: + val = val.strip() + val_not = True if val[0] == '!' else False + val_search_operator = '=' # default + if val_not: + if val[1:].lstrip()[0] not in '=<>~': + value = val[1:].lstrip() + else: + val_search_operator = val[1:].lstrip()[0] + value = val[1:].lstrip()[1:] + else: + if val[0] not in '=<>~': + value = val.lstrip() + else: + val_search_operator = val[0] + value = val[1:].lstrip() + + if self.definition[attr].validate: + validated = self.definition[attr].validate(value) # returns True, False or a value to substitute to the actual values + if validated is False: + error_message = 'validation failed for attribute %s and value %s' % (d, val) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif validated is not True: # a valid LDAP value equivalent to the actual values + value = validated + if val_not: + query += '!' + val_search_operator + str(value) + else: + query += val_search_operator + str(value) + + query += ';' + query = query[:-1] + ', ' + else: + error_message = 'attribute \'%s\' not in definition' % attr + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self.validated_query = query[:-2] + self._validated_query_dict = _create_query_dict(self.validated_query) + + def _create_query_filter(self): + """Converts the query dictionary to the filter text""" + self.query_filter = '' + + if self.definition._object_class: + self.query_filter += '(&' + if isinstance(self.definition._object_class, SEQUENCE_TYPES) and len(self.definition._object_class) == 1: + self.query_filter += '(objectClass=' + self.definition._object_class[0] + ')' + elif isinstance(self.definition._object_class, SEQUENCE_TYPES): + self.query_filter += '(&' + for object_class in self.definition._object_class: + self.query_filter += '(objectClass=' + object_class + ')' + self.query_filter += ')' + else: + error_message = 'object class must be a string or a list' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + if self._query and self._query.startswith('(') and self._query.endswith(')'): # query is already an LDAP filter + if 'objectclass' not in self._query.lower(): + self.query_filter += self._query + ')' # if objectclass not in filter adds from definition + else: + self.query_filter = self._query + return + elif self._query: # if a simplified filter is present + if not self.components_in_and: + self.query_filter += '(|' + elif not self.definition._object_class: + self.query_filter += '(&' + + self._validate_query() + + attr_counter = 0 + for attr in sorted(self._validated_query_dict): + attr_counter += 1 + multi = True if ';' in self._validated_query_dict[attr] else False + vals = sorted(self._validated_query_dict[attr].split(';')) + attr_def = self.definition[attr[1:]] if attr[0] in '&|' else self.definition[attr] + if attr_def.pre_query: + modvals = [] + for val in vals: + modvals.append(val[0] + attr_def.pre_query(attr_def.key, val[1:])) + vals = modvals + if multi: + if attr[0] in '&|': + self.query_filter += '(' + attr[0] + else: + self.query_filter += '(|' + + for val in vals: + if val[0] == '!': + self.query_filter += '(!(' + attr_def.name + _ret_search_value(val[1:]) + '))' + else: + self.query_filter += '(' + attr_def.name + _ret_search_value(val) + ')' + if multi: + self.query_filter += ')' + + if not self.components_in_and: + self.query_filter += '))' + else: + self.query_filter += ')' + + if not self.definition._object_class and attr_counter == 1: # removes unneeded starting filter + self.query_filter = self.query_filter[2: -1] + + if self.query_filter == '(|)' or self.query_filter == '(&)': # removes empty filter + self.query_filter = '' + else: # no query, remove unneeded leading (& + self.query_filter = self.query_filter[2:] + + def search(self, attributes=None): + """Perform the LDAP search + + :return: Entries found in search + + """ + self.clear() + query_scope = SUBTREE if self.sub_tree else LEVEL + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing search in <%s>', self) + self._execute_query(query_scope, attributes) + + return self.entries + + def search_object(self, entry_dn=None, attributes=None): # base must be a single dn + """Perform the LDAP search operation SINGLE_OBJECT scope + + :return: Entry found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing object search in <%s>', self) + self.clear() + if entry_dn: + old_base = self.base + self.base = entry_dn + self._execute_query(BASE, attributes) + self.base = old_base + else: + self._execute_query(BASE, attributes) + + return self.entries[0] if len(self.entries) > 0 else None + + def search_level(self, attributes=None): + """Perform the LDAP search operation with SINGLE_LEVEL scope + + :return: Entries found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing single level search in <%s>', self) + self.clear() + self._execute_query(LEVEL, attributes) + + return self.entries + + def search_subtree(self, attributes=None): + """Perform the LDAP search operation WHOLE_SUBTREE scope + + :return: Entries found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing whole subtree search in <%s>', self) + self.clear() + self._execute_query(SUBTREE, attributes) + + return self.entries + + def _entries_generator(self, responses): + for response in responses: + yield self._create_entry(response) + + def search_paged(self, paged_size, paged_criticality=True, generator=True, attributes=None): + """Perform a paged search, can be called as an Iterator + + :param attributes: optional attributes to search + :param paged_size: number of entries returned in each search + :type paged_size: int + :param paged_criticality: specify if server must not execute the search if it is not capable of paging searches + :type paged_criticality: bool + :param generator: if True the paged searches are executed while generating the entries, + if False all the paged searches are execute before returning the generator + :type generator: bool + :return: Entries found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing paged search in <%s> with paged size %s', self, str(paged_size)) + if not self.connection: + error_message = 'no connection established' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + self.clear() + self._create_query_filter() + self.entries = [] + self.execution_time = datetime.now() + response = self.connection.extend.standard.paged_search(search_base=self.base, + search_filter=self.query_filter, + search_scope=SUBTREE if self.sub_tree else LEVEL, + dereference_aliases=self.dereference_aliases, + attributes=attributes if attributes else self.attributes, + get_operational_attributes=self.get_operational_attributes, + controls=self.controls, + paged_size=paged_size, + paged_criticality=paged_criticality, + generator=generator) + if generator: + return self._entries_generator(response) + else: + return list(self._entries_generator(response)) + + +class Writer(Cursor): + entry_class = WritableEntry + attribute_class = WritableAttribute + entry_initial_status = STATUS_WRITABLE + + @staticmethod + def from_cursor(cursor, connection=None, object_def=None, custom_validator=None): + if connection is None: + connection = cursor.connection + if object_def is None: + object_def = cursor.definition + writer = Writer(connection, object_def, attributes=cursor.attributes) + for entry in cursor.entries: + if isinstance(cursor, Reader): + entry.entry_writable(object_def, writer, custom_validator=custom_validator) + elif isinstance(cursor, Writer): + pass + else: + error_message = 'unknown cursor type %s' % str(type(cursor)) + if log_enabled(ERROR): + log(ERROR, '%s', error_message) + raise LDAPCursorError(error_message) + writer.execution_time = cursor.execution_time + if log_enabled(BASIC): + log(BASIC, 'instantiated Writer Cursor <%r> from cursor <%r>', writer, cursor) + return writer + + @staticmethod + def from_response(connection, object_def, response=None): + if response is None: + if not connection.strategy.sync: + error_message = 'with asynchronous strategies response must be specified' + if log_enabled(ERROR): + log(ERROR, '%s', error_message) + raise LDAPCursorError(error_message) + elif connection.response: + response = connection.response + else: + error_message = 'response not present' + if log_enabled(ERROR): + log(ERROR, '%s', error_message) + raise LDAPCursorError(error_message) + writer = Writer(connection, object_def) + + for resp in response: + if resp['type'] == 'searchResEntry': + entry = writer._create_entry(resp) + writer.entries.append(entry) + if log_enabled(BASIC): + log(BASIC, 'instantiated Writer Cursor <%r> from response', writer) + return writer + + def __init__(self, connection, object_def, get_operational_attributes=False, attributes=None, controls=None, auxiliary_class=None): + Cursor.__init__(self, connection, object_def, get_operational_attributes, attributes, controls, auxiliary_class) + self.dereference_aliases = DEREF_NEVER + + if log_enabled(BASIC): + log(BASIC, 'instantiated Writer Cursor: <%r>', self) + + def commit(self, refresh=True): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'committed changes for <%s>', self) + self._reset_history() + successful = True + for entry in self.entries: + if not entry.entry_commit_changes(refresh=refresh, controls=self.controls, clear_history=False): + successful = False + + self.execution_time = datetime.now() + + return successful + + def discard(self): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'discarded changes for <%s>', self) + for entry in self.entries: + entry.entry_discard_changes() + + def _refresh_object(self, entry_dn, attributes=None, tries=4, seconds=2, controls=None): # base must be a single dn + """Performs the LDAP search operation SINGLE_OBJECT scope + + :return: Entry found in search + + """ + if log_enabled(PROTOCOL): + log(PROTOCOL, 'refreshing object <%s> for <%s>', entry_dn, self) + if not self.connection: + error_message = 'no connection established' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + response = [] + with self.connection: + counter = 0 + while counter < tries: + result = self.connection.search(search_base=entry_dn, + search_filter='(objectclass=*)', + search_scope=BASE, + dereference_aliases=DEREF_NEVER, + attributes=attributes if attributes else self.attributes, + get_operational_attributes=self.get_operational_attributes, + controls=controls) + if not self.connection.strategy.sync: + response, result, request = self.connection.get_response(result, get_request=True) + else: + if self.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.connection.response + result = self.connection.result + request = self.connection.request + + if result['result'] in [RESULT_SUCCESS]: + break + sleep(seconds) + counter += 1 + self._store_operation_in_history(request, result, response) + + if len(response) == 1: + return self._create_entry(response[0]) + elif len(response) == 0: + return None + + error_message = 'more than 1 entry returned for a single object search' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + def new(self, dn): + if log_enabled(BASIC): + log(BASIC, 'creating new entry <%s> for <%s>', dn, self) + dn = safe_dn(dn) + for entry in self.entries: # checks if dn is already used in an cursor entry + if entry.entry_dn == dn: + error_message = 'dn already present in cursor' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + rdns = safe_rdn(dn, decompose=True) + entry = self.entry_class(dn, self) # defines a new empty Entry + for attr in entry.entry_mandatory_attributes: # defines all mandatory attributes as virtual + entry._state.attributes[attr] = self.attribute_class(entry._state.definition[attr], entry, self) + entry.__dict__[attr] = entry._state.attributes[attr] + entry.objectclass.set(self.definition._object_class) + for rdn in rdns: # adds virtual attributes from rdns in entry name (should be more than one with + syntax) + if rdn[0] in entry._state.definition._attributes: + rdn_name = entry._state.definition._attributes[rdn[0]].name # normalize case folding + if rdn_name not in entry._state.attributes: + entry._state.attributes[rdn_name] = self.attribute_class(entry._state.definition[rdn_name], entry, self) + entry.__dict__[rdn_name] = entry._state.attributes[rdn_name] + entry.__dict__[rdn_name].set(rdn[1]) + else: + error_message = 'rdn type \'%s\' not in object class definition' % rdn[0] + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + entry._state.set_status(STATUS_VIRTUAL) # set intial status + entry._state.set_status(STATUS_PENDING_CHANGES) # tries to change status to PENDING_CHANGES. If mandatory attributes are missing status is reverted to MANDATORY_MISSING + self.entries.append(entry) + return entry + + def refresh_entry(self, entry, tries=4, seconds=2): + conf_operational_attribute_prefix = get_config_parameter('ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX') + + self._do_not_reset = True + attr_list = [] + if log_enabled(PROTOCOL): + log(PROTOCOL, 'refreshing entry <%s> for <%s>', entry, self) + for attr in entry._state.attributes: # check friendly attribute name in AttrDef, do not check operational attributes + if attr.lower().startswith(conf_operational_attribute_prefix.lower()): + continue + if entry._state.definition[attr].name: + attr_list.append(entry._state.definition[attr].name) + else: + attr_list.append(entry._state.definition[attr].key) + + temp_entry = self._refresh_object(entry.entry_dn, attr_list, tries, seconds=seconds) # if any attributes is added adds only to the entry not to the definition + self._do_not_reset = False + if temp_entry: + temp_entry._state.origin = entry._state.origin + entry.__dict__.clear() + entry.__dict__['_state'] = temp_entry._state + for attr in entry._state.attributes: # returns the attribute key + entry.__dict__[attr] = entry._state.attributes[attr] + + for attr in entry.entry_attributes: # if any attribute of the class was deleted makes it virtual + if attr not in entry._state.attributes and attr in entry.entry_definition._attributes: + entry._state.attributes[attr] = WritableAttribute(entry.entry_definition[attr], entry, self) + entry.__dict__[attr] = entry._state.attributes[attr] + entry._state.set_status(entry._state._initial_status) + return True + return False diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/entry.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/entry.py new file mode 100644 index 0000000..2375796 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/entry.py @@ -0,0 +1,712 @@ +""" +""" + +# Created on 2016.08.19 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +import json +try: + from collections import OrderedDict +except ImportError: + from ..utils.ordDict import OrderedDict # for Python 2.6 + +from os import linesep +from copy import deepcopy + +from .. import STRING_TYPES, SEQUENCE_TYPES, MODIFY_ADD, MODIFY_REPLACE +from .attribute import WritableAttribute +from .objectDef import ObjectDef +from .attrDef import AttrDef +from ..core.exceptions import LDAPKeyError, LDAPCursorError, LDAPCursorAttributeError +from ..utils.conv import check_json_dict, format_json, prepare_for_stream +from ..protocol.rfc2849 import operation_to_ldif, add_ldif_header +from ..utils.dn import safe_dn, safe_rdn, to_dn +from ..utils.repr import to_stdout_encoding +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..utils.config import get_config_parameter +from . import STATUS_VIRTUAL, STATUS_WRITABLE, STATUS_PENDING_CHANGES, STATUS_COMMITTED, STATUS_DELETED,\ + STATUS_INIT, STATUS_READY_FOR_DELETION, STATUS_READY_FOR_MOVING, STATUS_READY_FOR_RENAMING, STATUS_MANDATORY_MISSING, STATUSES, INITIAL_STATUSES +from ..core.results import RESULT_SUCCESS +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +class EntryState(object): + """Contains data on the status of the entry. Does not pollute the Entry __dict__. + + """ + + def __init__(self, dn, cursor): + self.dn = dn + self._initial_status = None + self._to = None # used for move and rename + self.status = STATUS_INIT + self.attributes = CaseInsensitiveWithAliasDict() + self.raw_attributes = CaseInsensitiveWithAliasDict() + self.response = None + self.cursor = cursor + self.origin = None # reference to the original read-only entry (set when made writable). Needed to update attributes in read-only when modified (only if both refer the same server) + self.read_time = None + self.changes = OrderedDict() # includes changes to commit in a writable entry + if cursor.definition: + self.definition = cursor.definition + else: + self.definition = None + + def __repr__(self): + if self.__dict__ and self.dn is not None: + r = 'DN: ' + to_stdout_encoding(self.dn) + ' - STATUS: ' + ((self._initial_status + ', ') if self._initial_status != self.status else '') + self.status + ' - READ TIME: ' + (self.read_time.isoformat() if self.read_time else '') + linesep + r += 'attributes: ' + ', '.join(sorted(self.attributes.keys())) + linesep + r += 'object def: ' + (', '.join(sorted(self.definition._object_class)) if self.definition._object_class else '') + linesep + r += 'attr defs: ' + ', '.join(sorted(self.definition._attributes.keys())) + linesep + r += 'response: ' + ('present' if self.response else '') + linesep + r += 'cursor: ' + (self.cursor.__class__.__name__ if self.cursor else '') + linesep + return r + else: + return object.__repr__(self) + + def __str__(self): + return self.__repr__() + + def __getstate__(self): + cpy = dict(self.__dict__) + cpy['cursor'] = None + return cpy + + def set_status(self, status): + conf_ignored_mandatory_attributes_in_object_def = [v.lower() for v in get_config_parameter('IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF')] + if status not in STATUSES: + error_message = 'invalid entry status ' + str(status) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + if status in INITIAL_STATUSES: + self._initial_status = status + self.status = status + if status == STATUS_DELETED: + self._initial_status = STATUS_VIRTUAL + if status == STATUS_COMMITTED: + self._initial_status = STATUS_WRITABLE + if self.status == STATUS_VIRTUAL or (self.status == STATUS_PENDING_CHANGES and self._initial_status == STATUS_VIRTUAL): # checks if all mandatory attributes are present in new entries + for attr in self.definition._attributes: + if self.definition._attributes[attr].mandatory and attr.lower() not in conf_ignored_mandatory_attributes_in_object_def: + if (attr not in self.attributes or self.attributes[attr].virtual) and attr not in self.changes: + self.status = STATUS_MANDATORY_MISSING + break + + @property + def entry_raw_attributes(self): + return self.raw_attributes + + +class EntryBase(object): + """The Entry object contains a single LDAP entry. + Attributes can be accessed either by sequence, by assignment + or as dictionary keys. Keys are not case sensitive. + + The Entry object is read only + + - The DN is retrieved by entry_dn + - The cursor reference is in _cursor + - Raw attributes values are retrieved with _raw_attributes and the _raw_attribute() methods + """ + + def __init__(self, dn, cursor): + self._state = EntryState(dn, cursor) + + def __repr__(self): + if self.__dict__ and self.entry_dn is not None: + r = 'DN: ' + to_stdout_encoding(self.entry_dn) + ' - STATUS: ' + ((self._state._initial_status + ', ') if self._state._initial_status != self.entry_status else '') + self.entry_status + ' - READ TIME: ' + (self.entry_read_time.isoformat() if self.entry_read_time else '') + linesep + if self._state.attributes: + for attr in sorted(self._state.attributes): + if self._state.attributes[attr] or (hasattr(self._state.attributes[attr], 'changes') and self._state.attributes[attr].changes): + r += ' ' + repr(self._state.attributes[attr]) + linesep + return r + else: + return object.__repr__(self) + + def __str__(self): + return self.__repr__() + + def __iter__(self): + for attribute in self._state.attributes: + yield self._state.attributes[attribute] + # raise StopIteration # deprecated in PEP 479 + return + + def __contains__(self, item): + try: + self.__getitem__(item) + return True + except LDAPKeyError: + return False + + def __getattr__(self, item): + if isinstance(item, STRING_TYPES): + if item == '_state': + return object.__getattr__(self, item) + item = ''.join(item.split()).lower() + attr_found = None + for attr in self._state.attributes.keys(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.keys(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.keys(): + if item + ';range' in attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item + ';range' in attr.lower(): + attr_found = attr + break + if not attr_found: + error_message = 'attribute \'%s\' not found' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + return self._state.attributes[attr] + error_message = 'attribute name must be a string' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + def __setattr__(self, item, value): + if item == '_state': + object.__setattr__(self, item, value) + elif item in self._state.attributes: + error_message = 'attribute \'%s\' is read only' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + else: + error_message = 'entry is read only, cannot add \'%s\'' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + def __getitem__(self, item): + if isinstance(item, STRING_TYPES): + item = ''.join(item.split()).lower() + attr_found = None + for attr in self._state.attributes.keys(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.keys(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + for attr in self._state.attributes.aliases(): + if item + ';binary' == attr.lower(): + attr_found = attr + break + if not attr_found: + error_message = 'key \'%s\' not found' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + return self._state.attributes[attr] + + error_message = 'key must be a string' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + + def __eq__(self, other): + if isinstance(other, EntryBase): + return self.entry_dn == other.entry_dn + + return False + + def __lt__(self, other): + if isinstance(other, EntryBase): + return self.entry_dn <= other.entry_dn + + return False + + @property + def entry_dn(self): + return self._state.dn + + @property + def entry_cursor(self): + return self._state.cursor + + @property + def entry_status(self): + return self._state.status + + @property + def entry_definition(self): + return self._state.definition + + @property + def entry_raw_attributes(self): + return self._state.raw_attributes + + def entry_raw_attribute(self, name): + """ + + :param name: name of the attribute + :return: raw (unencoded) value of the attribute, None if attribute is not found + """ + return self._state.raw_attributes[name] if name in self._state.raw_attributes else None + + @property + def entry_mandatory_attributes(self): + return [attribute for attribute in self.entry_definition._attributes if self.entry_definition._attributes[attribute].mandatory] + + @property + def entry_attributes(self): + return list(self._state.attributes.keys()) + + @property + def entry_attributes_as_dict(self): + return dict((attribute_key, deepcopy(attribute_value.values)) for (attribute_key, attribute_value) in self._state.attributes.items()) + + @property + def entry_read_time(self): + return self._state.read_time + + @property + def _changes(self): + return self._state.changes + + def entry_to_json(self, raw=False, indent=4, sort=True, stream=None, checked_attributes=True, include_empty=True): + json_entry = dict() + json_entry['dn'] = self.entry_dn + if checked_attributes: + if not include_empty: + # needed for python 2.6 compatibility + json_entry['attributes'] = dict((key, self.entry_attributes_as_dict[key]) for key in self.entry_attributes_as_dict if self.entry_attributes_as_dict[key]) + else: + json_entry['attributes'] = self.entry_attributes_as_dict + if raw: + if not include_empty: + # needed for python 2.6 compatibility + json_entry['raw'] = dict((key, self.entry_raw_attributes[key]) for key in self.entry_raw_attributes if self.entry_raw_attributes[key]) + else: + json_entry['raw'] = dict(self.entry_raw_attributes) + + if str is bytes: # Python 2 + check_json_dict(json_entry) + + json_output = json.dumps(json_entry, + ensure_ascii=True, + sort_keys=sort, + indent=indent, + check_circular=True, + default=format_json, + separators=(',', ': ')) + + if stream: + stream.write(json_output) + + return json_output + + def entry_to_ldif(self, all_base64=False, line_separator=None, sort_order=None, stream=None): + ldif_lines = operation_to_ldif('searchResponse', [self._state.response], all_base64, sort_order=sort_order) + ldif_lines = add_ldif_header(ldif_lines) + line_separator = line_separator or linesep + ldif_output = line_separator.join(ldif_lines) + if stream: + if stream.tell() == 0: + header = add_ldif_header(['-'])[0] + stream.write(prepare_for_stream(header + line_separator + line_separator)) + stream.write(prepare_for_stream(ldif_output + line_separator + line_separator)) + return ldif_output + + +class Entry(EntryBase): + """The Entry object contains a single LDAP entry. + Attributes can be accessed either by sequence, by assignment + or as dictionary keys. Keys are not case sensitive. + + The Entry object is read only + + - The DN is retrieved by entry_dn + - The Reader reference is in _cursor() + - Raw attributes values are retrieved by the _ra_attributes and + _raw_attribute() methods + + """ + def entry_writable(self, object_def=None, writer_cursor=None, attributes=None, custom_validator=None, auxiliary_class=None): + conf_operational_attribute_prefix = get_config_parameter('ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX') + if not self.entry_cursor.schema: + error_message = 'schema must be available to make an entry writable' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + # returns a new WritableEntry and its Writer cursor + if object_def is None: + if self.entry_cursor.definition._object_class: + object_def = self.entry_definition._object_class + auxiliary_class = self.entry_definition._auxiliary_class + (auxiliary_class if isinstance(auxiliary_class, SEQUENCE_TYPES) else []) + elif 'objectclass' in self: + object_def = self.objectclass.values + + if not object_def: + error_message = 'object class must be specified to make an entry writable' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + + if not isinstance(object_def, ObjectDef): + object_def = ObjectDef(object_def, self.entry_cursor.schema, custom_validator, auxiliary_class) + + if attributes: + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + + if isinstance(attributes, SEQUENCE_TYPES): + for attribute in attributes: + if attribute not in object_def._attributes: + error_message = 'attribute \'%s\' not in schema for \'%s\'' % (attribute, object_def) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + else: + attributes = [] + + if not writer_cursor: + from .cursor import Writer # local import to avoid circular reference in import at startup + writable_cursor = Writer(self.entry_cursor.connection, object_def) + else: + writable_cursor = writer_cursor + + if attributes: # force reading of attributes + writable_entry = writable_cursor._refresh_object(self.entry_dn, list(attributes) + self.entry_attributes) + else: + writable_entry = writable_cursor._create_entry(self._state.response) + writable_cursor.entries.append(writable_entry) + writable_entry._state.read_time = self.entry_read_time + writable_entry._state.origin = self # reference to the original read-only entry + # checks original entry for custom definitions in AttrDefs + attr_to_add = [] + attr_to_remove = [] + object_def_to_add = [] + object_def_to_remove = [] + for attr in writable_entry._state.origin.entry_definition._attributes: + original_attr = writable_entry._state.origin.entry_definition._attributes[attr] + if attr != original_attr.name and (attr not in writable_entry._state.attributes or conf_operational_attribute_prefix + original_attr.name not in writable_entry._state.attributes): + old_attr_def = writable_entry.entry_definition._attributes[original_attr.name] + new_attr_def = AttrDef(original_attr.name, + key=attr, + validate=original_attr.validate, + pre_query=original_attr.pre_query, + post_query=original_attr.post_query, + default=original_attr.default, + dereference_dn=original_attr.dereference_dn, + description=original_attr.description, + mandatory=old_attr_def.mandatory, # keeps value read from schema + single_value=old_attr_def.single_value, # keeps value read from schema + alias=original_attr.other_names) + od = writable_entry.entry_definition + object_def_to_remove.append(old_attr_def) + object_def_to_add.append(new_attr_def) + # updates attribute name in entry attributes + new_attr = WritableAttribute(new_attr_def, writable_entry, writable_cursor) + if original_attr.name in writable_entry._state.attributes: + new_attr.other_names = writable_entry._state.attributes[original_attr.name].other_names + new_attr.raw_values = writable_entry._state.attributes[original_attr.name].raw_values + new_attr.values = writable_entry._state.attributes[original_attr.name].values + new_attr.response = writable_entry._state.attributes[original_attr.name].response + attr_to_add.append((attr, new_attr)) + attr_to_remove.append(original_attr.name) + # writable_entry._state.attributes[attr] = new_attr + ## writable_entry._state.attributes.set_alias(attr, new_attr.other_names) + # del writable_entry._state.attributes[original_attr.name] + for attr, new_attr in attr_to_add: + writable_entry._state.attributes[attr] = new_attr + for attr in attr_to_remove: + del writable_entry._state.attributes[attr] + for object_def in object_def_to_remove: + o = writable_entry.entry_definition + o -= object_def + for object_def in object_def_to_add: + o = writable_entry.entry_definition + o += object_def + + writable_entry._state.set_status(STATUS_WRITABLE) + return writable_entry + + +class WritableEntry(EntryBase): + def __setitem__(self, key, value): + if value is not Ellipsis: # hack for using implicit operators in writable attributes + self.__setattr__(key, value) + + def __setattr__(self, item, value): + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + if item == '_state' and isinstance(value, EntryState): + self.__dict__['_state'] = value + return + + if value is not Ellipsis: # hack for using implicit operators in writable attributes + # checks if using an alias + if item in self.entry_cursor.definition._attributes or item.lower() in conf_attributes_excluded_from_object_def: + if item not in self._state.attributes: # setting value to an attribute still without values + new_attribute = WritableAttribute(self.entry_cursor.definition._attributes[item], self, cursor=self.entry_cursor) + self._state.attributes[str(item)] = new_attribute # force item to a string for key in attributes dict + self._state.attributes[item].set(value) # try to add to new_values + else: + error_message = 'attribute \'%s\' not defined' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + def __getattr__(self, item): + if isinstance(item, STRING_TYPES): + if item == '_state': + return self.__dict__['_state'] + item = ''.join(item.split()).lower() + for attr in self._state.attributes.keys(): + if item == attr.lower(): + return self._state.attributes[attr] + for attr in self._state.attributes.aliases(): + if item == attr.lower(): + return self._state.attributes[attr] + if item in self.entry_definition._attributes: # item is a new attribute to commit, creates the AttrDef and add to the attributes to retrive + self._state.attributes[item] = WritableAttribute(self.entry_definition._attributes[item], self, self.entry_cursor) + self.entry_cursor.attributes.add(item) + return self._state.attributes[item] + error_message = 'attribute \'%s\' not defined' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + else: + error_message = 'attribute name must be a string' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorAttributeError(error_message) + + @property + def entry_virtual_attributes(self): + return [attr for attr in self.entry_attributes if self[attr].virtual] + + def entry_commit_changes(self, refresh=True, controls=None, clear_history=True): + if clear_history: + self.entry_cursor._reset_history() + + if self.entry_status == STATUS_READY_FOR_DELETION: + result = self.entry_cursor.connection.delete(self.entry_dn, controls) + if not self.entry_cursor.connection.strategy.sync: + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + if result['result'] == RESULT_SUCCESS: + dn = self.entry_dn + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # deletes original read-only Entry + cursor = self._state.origin.entry_cursor + self._state.origin.__dict__.clear() + self._state.origin.__dict__['_state'] = EntryState(dn, cursor) + self._state.origin._state.set_status(STATUS_DELETED) + cursor = self.entry_cursor + self.__dict__.clear() + self._state = EntryState(dn, cursor) + self._state.set_status(STATUS_DELETED) + return True + return False + elif self.entry_status == STATUS_READY_FOR_MOVING: + result = self.entry_cursor.connection.modify_dn(self.entry_dn, '+'.join(safe_rdn(self.entry_dn)), new_superior=self._state._to) + if not self.entry_cursor.connection.strategy.sync: + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + if result['result'] == RESULT_SUCCESS: + self._state.dn = safe_dn('+'.join(safe_rdn(self.entry_dn)) + ',' + self._state._to) + if refresh: + if self.entry_refresh(): + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # refresh dn of origin + self._state.origin._state.dn = self.entry_dn + self._state.set_status(STATUS_COMMITTED) + self._state._to = None + return True + return False + elif self.entry_status == STATUS_READY_FOR_RENAMING: + rdn = '+'.join(safe_rdn(self._state._to)) + result = self.entry_cursor.connection.modify_dn(self.entry_dn, rdn) + if not self.entry_cursor.connection.strategy.sync: + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + if result['result'] == RESULT_SUCCESS: + self._state.dn = rdn + ',' + ','.join(to_dn(self.entry_dn)[1:]) + if refresh: + if self.entry_refresh(): + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # refresh dn of origin + self._state.origin._state.dn = self.entry_dn + self._state.set_status(STATUS_COMMITTED) + self._state._to = None + return True + return False + elif self.entry_status in [STATUS_VIRTUAL, STATUS_MANDATORY_MISSING]: + missing_attributes = [] + for attr in self.entry_mandatory_attributes: + if (attr not in self._state.attributes or self._state.attributes[attr].virtual) and attr not in self._changes: + missing_attributes.append('\'' + attr + '\'') + error_message = 'mandatory attributes %s missing in entry %s' % (', '.join(missing_attributes), self.entry_dn) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + elif self.entry_status == STATUS_PENDING_CHANGES: + if self._changes: + if self.entry_definition._auxiliary_class: # checks if an attribute is from an auxiliary class and adds it to the objectClass attribute if not present + for attr in self._changes: + # checks schema to see if attribute is defined in one of the already present object classes + attr_classes = self.entry_cursor.schema.attribute_types[attr].mandatory_in + self.entry_cursor.schema.attribute_types[attr].optional_in + for object_class in self.objectclass: + if object_class in attr_classes: + break + else: # executed only if the attribute class is not present in the objectClass attribute + # checks if attribute is defined in one of the possible auxiliary classes + for aux_class in self.entry_definition._auxiliary_class: + if aux_class in attr_classes: + if self._state._initial_status == STATUS_VIRTUAL: # entry is new, there must be a pending objectClass MODIFY_REPLACE + self._changes['objectClass'][0][1].append(aux_class) + else: + self.objectclass += aux_class + if self._state._initial_status == STATUS_VIRTUAL: + new_attributes = dict() + for attr in self._changes: + new_attributes[attr] = self._changes[attr][0][1] + result = self.entry_cursor.connection.add(self.entry_dn, None, new_attributes, controls) + else: + result = self.entry_cursor.connection.modify(self.entry_dn, self._changes, controls) + + if not self.entry_cursor.connection.strategy.sync: # asynchronous request + response, result, request = self.entry_cursor.connection.get_response(result, get_request=True) + else: + if self.entry_cursor.connection.strategy.thread_safe: + _, result, response, request = result + else: + response = self.entry_cursor.connection.response + result = self.entry_cursor.connection.result + request = self.entry_cursor.connection.request + self.entry_cursor._store_operation_in_history(request, result, response) + + if result['result'] == RESULT_SUCCESS: + if refresh: + if self.entry_refresh(): + if self._state.origin and self.entry_cursor.connection.server == self._state.origin.entry_cursor.connection.server: # updates original read-only entry if present + for attr in self: # adds AttrDefs from writable entry to origin entry definition if some is missing + if attr.key in self.entry_definition._attributes and attr.key not in self._state.origin.entry_definition._attributes: + self._state.origin.entry_cursor.definition.add_attribute(self.entry_cursor.definition._attributes[attr.key]) # adds AttrDef from writable entry to original entry if missing + temp_entry = self._state.origin.entry_cursor._create_entry(self._state.response) + self._state.origin.__dict__.clear() + self._state.origin.__dict__['_state'] = temp_entry._state + for attr in self: # returns the whole attribute object + if not hasattr(attr,'virtual'): + self._state.origin.__dict__[attr.key] = self._state.origin._state.attributes[attr.key] + self._state.origin._state.read_time = self.entry_read_time + else: + self.entry_discard_changes() # if not refreshed remove committed changes + self._state.set_status(STATUS_COMMITTED) + return True + return False + + def entry_discard_changes(self): + self._changes.clear() + self._state.set_status(self._state._initial_status) + + def entry_delete(self): + if self.entry_status not in [STATUS_WRITABLE, STATUS_COMMITTED, STATUS_READY_FOR_DELETION]: + error_message = 'cannot delete entry, invalid status: ' + self.entry_status + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._state.set_status(STATUS_READY_FOR_DELETION) + + def entry_refresh(self, tries=4, seconds=2): + """ + + Refreshes the entry from the LDAP Server + """ + if self.entry_cursor.connection: + if self.entry_cursor.refresh_entry(self, tries, seconds): + return True + + return False + + def entry_move(self, destination_dn): + if self.entry_status not in [STATUS_WRITABLE, STATUS_COMMITTED, STATUS_READY_FOR_MOVING]: + error_message = 'cannot move entry, invalid status: ' + self.entry_status + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._state._to = safe_dn(destination_dn) + self._state.set_status(STATUS_READY_FOR_MOVING) + + def entry_rename(self, new_name): + if self.entry_status not in [STATUS_WRITABLE, STATUS_COMMITTED, STATUS_READY_FOR_RENAMING]: + error_message = 'cannot rename entry, invalid status: ' + self.entry_status + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPCursorError(error_message) + self._state._to = new_name + self._state.set_status(STATUS_READY_FOR_RENAMING) + + @property + def entry_changes(self): + return self._changes diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/objectDef.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/objectDef.py new file mode 100644 index 0000000..1f8609c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/abstract/objectDef.py @@ -0,0 +1,270 @@ +""" +""" + +# Created on 2014.02.02 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .attrDef import AttrDef +from ..core.exceptions import LDAPKeyError, LDAPObjectError, LDAPAttributeError, LDAPSchemaError +from .. import STRING_TYPES, SEQUENCE_TYPES, Server, Connection +from ..protocol.rfc4512 import SchemaInfo, constant_to_class_kind +from ..protocol.formatters.standard import find_attribute_validator +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..utils.config import get_config_parameter +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED + + +class ObjectDef(object): + """Represent an object in the LDAP server. AttrDefs are stored in a dictionary; the key is the friendly name defined in AttrDef. + + AttrDefs can be added and removed using the += and -= operators + + ObjectDef can be accessed either as a sequence and a dictionary. When accessed the whole AttrDef instance is returned + + """ + def __init__(self, object_class=None, schema=None, custom_validator=None, auxiliary_class=None): + if object_class is None: + object_class = [] + + if not isinstance(object_class, SEQUENCE_TYPES): + object_class = [object_class] + + if auxiliary_class is None: + auxiliary_class = [] + + if not isinstance(auxiliary_class, SEQUENCE_TYPES): + auxiliary_class = [auxiliary_class] + + self.__dict__['_attributes'] = CaseInsensitiveWithAliasDict() + self.__dict__['_custom_validator'] = custom_validator + self.__dict__['_oid_info'] = [] + + if isinstance(schema, Connection) and (schema._deferred_bind or schema._deferred_open): # probably a lazy connection, tries to bind + schema._fire_deferred() + + if schema is not None: + if isinstance(schema, Server): + schema = schema.schema + elif isinstance(schema, Connection): + schema = schema.server.schema + elif isinstance(schema, SchemaInfo): + pass + elif schema: + error_message = 'unable to read schema' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPSchemaError(error_message) + if schema is None: + error_message = 'schema not present' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPSchemaError(error_message) + self.__dict__['_schema'] = schema + + if self._schema: + object_class = [schema.object_classes[name].name[0] for name in object_class] # uses object class names capitalized as in schema + auxiliary_class = [schema.object_classes[name].name[0] for name in auxiliary_class] + for object_name in object_class: + if object_name: + self._populate_attr_defs(object_name) + + for object_name in auxiliary_class: + if object_name: + self._populate_attr_defs(object_name) + + self.__dict__['_object_class'] = object_class + self.__dict__['_auxiliary_class'] = auxiliary_class + + if log_enabled(BASIC): + log(BASIC, 'instantiated ObjectDef: <%r>', self) + + def _populate_attr_defs(self, object_name): + if object_name in self._schema.object_classes: + object_schema = self._schema.object_classes[object_name] + self.__dict__['_oid_info'].append(object_name + " (" + constant_to_class_kind(object_schema.kind) + ") " + str(object_schema.oid)) + + if object_schema.superior: + for sup in object_schema.superior: + self._populate_attr_defs(sup) + for attribute_name in object_schema.must_contain: + self.add_from_schema(attribute_name, True) + for attribute_name in object_schema.may_contain: + if attribute_name not in self._attributes: # the attribute could already be defined as "mandatory" in a superclass + self.add_from_schema(attribute_name, False) + else: + error_message = 'object class \'%s\' not defined in schema' % object_name + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectError(error_message) + + def __repr__(self): + if self._object_class: + r = 'OBJ : ' + ', '.join(self._object_class) + linesep + else: + r = 'OBJ : ' + linesep + if self._auxiliary_class: + r += 'AUX : ' + ', '.join(self._auxiliary_class) + linesep + else: + r += 'AUX : ' + linesep + r += 'OID: ' + ', '.join([oid for oid in self._oid_info]) + linesep + r += 'MUST: ' + ', '.join(sorted([attr for attr in self._attributes if self._attributes[attr].mandatory])) + linesep + r += 'MAY : ' + ', '.join(sorted([attr for attr in self._attributes if not self._attributes[attr].mandatory])) + linesep + + return r + + def __str__(self): + return self.__repr__() + + def __getitem__(self, item): + return self.__getattr__(item) + + def __getattr__(self, item): + item = ''.join(item.split()).lower() + if '_attributes' in self.__dict__: + try: + return self._attributes[item] + except KeyError: + error_message = 'key \'%s\' not present' % item + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + else: + error_message = 'internal _attributes property not defined' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + + def __setattr__(self, key, value): + error_message = 'object \'%s\' is read only' % key + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectError(error_message) + + def __iadd__(self, other): + self.add_attribute(other) + return self + + def __isub__(self, other): + if isinstance(other, AttrDef): + self.remove_attribute(other.key) + elif isinstance(other, STRING_TYPES): + self.remove_attribute(other) + + return self + + def __iter__(self): + for attribute in self._attributes: + yield self._attributes[attribute] + + def __len__(self): + return len(self._attributes) + + if str is not bytes: # Python 3 + def __bool__(self): # needed to make the objectDef appears as existing in "if cursor:" even if there are no entries + return True + else: # Python 2 + def __nonzero__(self): + return True + + def __contains__(self, item): + try: + self.__getitem__(item) + except KeyError: + return False + + return True + + def add_from_schema(self, attribute_name, mandatory=False): + attr_def = AttrDef(attribute_name) + attr_def.validate = find_attribute_validator(self._schema, attribute_name, self._custom_validator) + attr_def.mandatory = mandatory # in schema mandatory is specified in the object class, not in the attribute class + if self._schema and self._schema.attribute_types and attribute_name in self._schema.attribute_types: + attr_def.single_value = self._schema.attribute_types[attribute_name].single_value + attr_def.oid_info = self._schema.attribute_types[attribute_name] + self.add_attribute(attr_def) + + def add_attribute(self, definition=None): + """Add an AttrDef to the ObjectDef. Can be called with the += operator. + :param definition: the AttrDef object to add, can also be a string containing the name of attribute to add. Can be a list of both + + """ + conf_attributes_excluded_from_object_def = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF')] + if isinstance(definition, STRING_TYPES): + self.add_from_schema(definition) + elif isinstance(definition, AttrDef): + if definition.key.lower() not in conf_attributes_excluded_from_object_def: + if definition.key not in self._attributes: + self._attributes[definition.key] = definition + if definition.name and definition.name != definition.key: + self._attributes.set_alias(definition.key, definition.name) + other_names = [name for name in definition.oid_info.name if definition.key.lower() != name.lower()] if definition.oid_info else None + if other_names: + self._attributes.set_alias(definition.key, other_names) + + if not definition.validate: + validator = find_attribute_validator(self._schema, definition.key, self._custom_validator) + self._attributes[definition.key].validate = validator + elif isinstance(definition, SEQUENCE_TYPES): + for element in definition: + self.add_attribute(element) + else: + error_message = 'unable to add element to object definition' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPObjectError(error_message) + + def remove_attribute(self, item): + """Remove an AttrDef from the ObjectDef. Can be called with the -= operator. + :param item: the AttrDef to remove, can also be a string containing the name of attribute to remove + + """ + key = None + if isinstance(item, STRING_TYPES): + key = ''.join(item.split()).lower() + elif isinstance(item, AttrDef): + key = item.key.lower() + + if key: + for attr in self._attributes: + if key == attr.lower(): + del self._attributes[attr] + break + else: + error_message = 'key \'%s\' not present' % key + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPKeyError(error_message) + else: + error_message = 'key type must be str or AttrDef not ' + str(type(item)) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error_message, self) + raise LDAPAttributeError(error_message) + + def clear_attributes(self): + """Empty the ObjectDef attribute list + + """ + self.__dict__['object_class'] = None + self.__dict__['auxiliary_class'] = None + self.__dict__['_attributes'] = dict() diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94c8f59386ae996842526153eaa9ff91095c76a2 GIT binary patch literal 141 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vEza+OnzaXjpvA`HgCg&HW>c_`t=4F<|$LkeT-r}&y%}*)KNwou+ I_Zf&8088Q^>;M1& literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/connection.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..232337407cae1c15a45f6c695c60bb68f2cf1b1b GIT binary patch literal 45232 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/pooling.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/pooling.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8c96584c4af24778b447619951c65a7457f8b4f GIT binary patch literal 9548 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/rdns.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/rdns.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44e151e8c56fdde6fd0022f0fc77b68f461c3305 GIT binary patch literal 1739 zcmaJ>Pfz1U6rUM8PU3|uTcJvOSUTN9t4Q5YZCly{MVppTAw>y|!xk*9rjBO-FUB@A z6G~9%q3{KI?gfrjzmcV$dfKnBr@nC#SXi}Vz2`T7-k*8zH}AXoc^AR><1Zopt|Ii0 znaqX_!V4hv92iGF;+T^d`}haMEpA^TZVPf@`4)G%!^@Z0w|RwEFOgs3#6$H5XJ6B8 z9mSE3grY&hX_zKT2Z>fxia5}MQ=Ni%BBT$YFE zShL+`&GmJddM(fY`2P0h*6l9qcG|oCQg^Gr+3hsj|6$_kd;9O(Sn#&Dwz|E3Yn{Dp zwzpf}pGcYl7wqlxWqp(_XHoVnGIfaKXW8Lb`+KL~jFw{_WM52qm`brMp&X5DBu!eL z0I3?V3bt=P2N!$&(3~*CWX|~d9!RYM8`U(r!eexeIev^hWFt)uUAcnMIl<`69b@^) zZ|En)2`A^|SF(e4Q3AXGj}!u zpD{8YCu4Nz$Q@mpw3sovasVHtYtX;I7g+9?7j5)*(QyqBRR&$igZa$L4iF%!c=cz4 zS;6{pD2lo#vw|9w6c9T3@@8p|}n^Bjlws_@objU%PQ z^e9{V))+L|b<_6pBwEB5vDy-zyD1p*u zI!*FgQ)?LwhFY|wOl58b$tW*Nk;OqM@^aTJmg_`51Y3U9K!E8{ChmoqySMSIm@q#C zhR6q);5q0OHT)FYqym4J$d6#Bj{9{dFEhr|kg-XiPC9rkLS6Ke0#U`ucN`Thtbk@^ Vb<%{_4CYh?nEkk7Ex7K(e*xe0#x(!{ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/results.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/results.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2b3fdf7c41cca97a01a3766ce198d16d9a8746e GIT binary patch literal 3483 zcmcgu+gjV$6*dV3!XX56NXYq|kc5!)OxtuCA#H=EvgDCu5>^kY&{_sfh2)Xs1gDSE zC+OE#=+}qnCAYoe6?)aRZAn1d>oK2ythLu(hkyNh+v_tklQn+*_3uRgSgh6lEg#C) z9)Ebx@9du=wHnr-h9fY7XW$H;g|j#cqc{d*cn;3tIE>>2OyGGqkCQNoQ!s_oFpV=X zgBRce&cZBSgo`)_b6AHu&ci$|zydD9A}+xaUV=+_87|{8EaMfpf>+@xUW03R9j@aI zxPdp}CfFnn8sw;5yBsN*7V1ITTdK2F>FJE#M|CqE1WrJzc`z(q%Mg8JlzkO}dH} zUBeb##~J=NH{M+isNWX!nA}L2^S<>lrSfuE@586f&>;(?dX<- z+Y;_bxF_McgclNCN_ZvVwS+ek-b#2cL6NX7L6x9M5E3>dv?Tl_A(fCx$R+e7e3I~4 z!hwXogf9~Q!VuQD=)>`>7X*}LFq?EK_46=^Gm)lA3Nzg_$&(<7hL3Z3xKBp7ALim9 zAVNZz%fc^TnWlqezw4*e@S}`is(5nK9>J2|%lDd;?t-@6}T^N~ME4&kjd-dRhN)>IBhH@5P_PDB^r>(xSAJr28-( zB}rGKoa^SP&Bi{@YWJ9kg=El@8u?jvY@LsjT#2IOGoclmNoczpH z-^=8dMQL{^=&^+Q$K}mRvp$@Z=I8#UDxW+9#+F!$yhEx7kp)hZBJx2NVss z7zoQM4;YN+Nn)^cV48inS#{tEvrG-8@(4Cq(Y$e99+@N!zYNBvQ5+I}S)|ph9|tyd zShdwLF;~7h9QQm-0?&gBws6{p>p5*z6^;X!if5}OY{k_r)A59DTQ)2f3oYAnE!8p# z^OeHv>P_JpdQ*2j@lh2*6B?9jjt>8`wovR-t!7KHh1XCFN5K47R@ZI|xK$XHw!7&y zg}Z5Ko@vRFTP@3WInnjP!*OlP+z_@maJ9t`ZQbVO*!#*$E~ayX?G9WnR!vLJV$)Mx*VfnDuBZaHO-(d(Q)tI)p1a)=Rr|WBv^ZYN))iNH zO~q9=b#tR?jtgUg6y0>aE!{E((>*4)Oy^m)x1|_u!L8|z>s0A=lg;|cBexab%y&TeE7jjHa1h5#~-oz|db4w&39iQ{@(_-FFM0)1As`OTN`% zOQr0}6e??AI1UGHR{@-MqoJ!hFL=s8`kt+CY;wO-h0A)|*@k-YaANiqpKbGlZWyvW z*YfzdG%UMWb!}Ky%hQC*Ot9d}Q)McwuZMm9}YVgE?*L>$)tujG#0c+=bWVYeH|a z_W6=@V7ka`G4*z(5kqaaSn!V3w)r;UY@15kk+I4~1`du;+kAeuPc&Mpf3RK-PE%av z^vv@sKheIBVpqAo29vaTTxZFqYH5P+V9gp_aC}xB zc??z28r;NxtEKPw*Vq95^JXpI@2+*j?kay9=YABecK`flw{!4qe=S14`>MboNokF5 ofBu5Yo^|_&6YusD>_zmQ{2iP9i(&N2=*Z9VclKw=GBPpxUlL;omjD0& literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/server.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/server.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0349f37bb02a08c90fbbe95f13c1f550c10db07 GIT binary patch literal 18982 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/timezone.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/timezone.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9efab8d06ce2a8a9c5ba7b79e079b04aff69850 GIT binary patch literal 1446 zcma)6OK;Oa5Z+xoj*})dr7Z%fLg@iiOEjr?9{^QU;&CYl$|aYTm04E?I}YoO)S7T= zulxcoa76qgUpes?I5A@U+pF1WC2SL&& z&2$Oe>?5TwkSW&V2qJ*@ED&IwGjxb9QC7f#DoO`jsG+Pv9ad1f(10e&8eD=^lyzuf z0Bd>URS=}g9Az&NF}v|BJWsQig-j zNV$z(Qfwb%+`(VAIbVRz)T+!~(p`fuSqAOVgKQR-T8ZG5b z{79*JjAt85P=&z)(yW-|68INH`^t;bWw+-q@04YF{9&(C?zZ*ETWzW%9g)NX56kTY ziH?19L6BG!t%ew-H;YpIRglu6U*v#hBrhyT4V9iK3X%&j%SEY;OuvkGcLvC_EAyFk zW+wlKNV73P)N8n3hQzl-<=C6UTVKE{^$TE>V$pAMZmjXn!9K- z?R#qh5S0r(pP|v*&~zd3K$J5k{=9$-dbld(u`)EG|E+cvDDtl#N zihO6rnYp6`%ZB3Dc8c;dRiVFM^2?7^`M@vwWnn$m0MYPPKT|(Z0`0D{H;=xB&P;dK zneEOwbE*O!mopy!obrGi#m<2gi+TxlP&4lec>fc4S45e3XFQj{vjU#;&U|;lS%CCa zXK^gspQ`eB#(BnBgoNM%*kR^V8}k8|+0Mc4lCz{Lzo&>fao}@B9Pkf4)}6y*UMzgB zI7dW&U8yf7YVj*9s8Y`*OE<4xxxK!Av(byzcl-UGjC`>wWltuDGR#UZ*lca>N-t{l zf)q7Rs1;vEt<6@`i~JONB#b;6xlt!{{YOo|PxS7l*Nl2{FPUX-M6hvlo$0^QNCGvf zuCIRY`>TzWRd?f)+pFu4N$>Qwk`fBn54?LFUnIHJwY6JoN$$fd>o-=Cd}DRv&aJiI z{|XG0#^4OZw}W0}hrFWT+}Xhy#5OCM!jOR8NjYHqvRy)X*AuAkJV zXHr+?EXyWqcn#)u!&b0m)4c9^%^g}Ja9M0hA5(XQzv=CEBDdMYAdjLXe|uNReawW8}q^-agHVDGKF!H;0$A92=c>Jd4HlcW- zODo7jjv&H|Jlm7L{lM$Agxw1|d-lU^KY%18@K_9H)af<7j@y^52egYj{vJ4n;lrL3 zHWcT#Vu3Ytd#vW+Z{H_q5iPAtm@Y2q;N)UAsC^?4WLdBv`xMV%tUWA!qgjET(2w2* zo)tXdUtvq*oKSWwS>96ib8#+KTqV{cwXNZyx3Q(~m~uJRfyo7Stjk7ZMtL}T)!-&Dzltj1uQD#bWG*>!X3>nuF^^NA`8vb@3**h$%0_{_qfx4H0q)R@ zDpbY=@UI1@8Fo7D4YJ(T3iJFD)+t`7twnby$QBG>isGAE@aXbC&r$Q z4fL3cRg?!}4dr~CN4XG}P%g%0ln23QiCy;3!DmSTv#1a+p}-i+jlnCeAk{Z6p^kRn zlh6XVEBpPE;pM^M|D9mmdF6`T-@VsqHEk%fz1iycQ=MNV7`)f?0`i=&Rr@(~2oa*~ zGZRL`9(JUK1NhWb=9hF!$35~56oWI*4@{=}4TF7mf|~8t&g_<_I<(twVDRDpp8<@N zR%Sfo#a4g=E{Iy#AYsFSUcx-(<@%wdG~oym9gU>0vbwh6Hf}XmlL}XF-QKuyt8wLK z)?CApcVlh!YGMtyT$W(Jl1>3h;gBSgmh&hQ(|^3l81{A;c1fEB$@}Qk+01Td6yw27T6`H6(;#+tG|uTm~_yRf2ICI_%vU6gywsKibX1pQE`%rSE#U2IEP^`E06)Cdl>tv*%{Dgth%t;r>!2bwU@hLdmW^3hAJKx=c)?)HSwO^zQ}#nCKeN{(s{YL1s~zhy(w^)QmD%D#pjlCM+oDiy4}BfU*k zn{|1lrHRq*wSu}PPk}yBL)O`}I8Bhe>w>xKet|}~ghGK%)h7OB=prE6pp@zlQ$MFZ zqnMxurNRc|v_Vu*6>4A!?J3TyXX?I6=T=)|%qhm`Ddt@z!|9B>$~a>RXE5#$8JC;F zr7=j%ICBbz*Z`9Jm~r_jT%K`%%{XfcXEE;Aj4Mpx3XJ=jam6tXXRV45Soss}kU~m( zkmm&@tu_*6aQ2M-qDvt!^}B!c_VTnZd{yp`J4|RDyG80S4WkZ+&ZLnfjtn9hI(tGL z1S<8rj7h76cE^}nzDTv`NLcdj^Lf=kDTBNrTt+mNrl8ej>?TN9k z2R9?@DY-znuYE+t?Ob@BD7ehaPhxdQ66Ym3$j-obyRr$f(KH!GZUWkob@ciz={lB5rp;zq&)w_AgT??jMMoN3+6M;eY&J zBZ=Y@>xCJ?@@Yn~hB;m$$-w2r4qD-PC|9r+I+HY02>pReXi42-D zIG4&}Ka^g-k6`s-3wLG8l1$%(`QAxajAZ8a+O3USE4OaCpnLGn`MM>)4OWRoZjFRw z_DO-7Fx2~D8uboCM{DS^SO5;k>UriMze{4VY#&hV3Kbtx!J=kM_oAqjejv%}Z_49D zeS(TPDh{AXO6#j@AFr;tSH8b-efq#XNCd_4eLq>~^gQ9Fr@TuppEfN_4`w=DlQ||B zrE)02z#c7`VFXXQx$U(Ac6xluC)MV*-`p9ekxChViXu3OP4ZcCfR}^z61kmEA73LAUJeJJn2cGLfcywfqAN_6t1W0~Crup{|MW*HFs{Q|8n~ z3QjZ=ZxewqAgF5`yqKD$E+J?xs#R@?17{5o>Zx%_?tC8(U@;J{5wEqVvP?KU6?p1ewK0h zDRaqOuF%(&4E{F^w^HsjcCZOvHBmUEh~iEjPEtcWK0Aa_>_r#){T;Uloqt_`Av_K1HHbVCV)fE zupz&S5Pu6XJc91bP&Wn(+%L3zJTZ4g^L%L-+BA(^Y7NRMq@Bf zgK#&vsUfGq5jQj9j&~%Qu-b1g&qhOk@N5E7DqD(C0i2Xod=<*ia1Qxar z59KE&YRE3jGY~#0cDyihAz@F-JOjoY>INIST&G$7fRNUZ$&~db1(uP9{ZG(^mry8V zY1&~}Tp4zlT5WoTwQxx#I|Q7urdHGFI$Y!HZCM>uHeiP%jw36iu#DUmTj7sU83cP2 z`aomp8_pA?zYrFDjN@NLFw<6*eLx1dvqoBs#3O6A9vKl*f$}C2XgRXFHf)hKJ5My! zChfk1tBpYaAL9E=8aOb74sq))S$si$fwG7Yt0c^KDa0xv%urqS2=#np0}1~P67c}} zli`WP>x|ppX|C{Dl%7(g;MoC78cRwCd!V!Gnj|Mwudstm3ai7fAiRB&GW%2dA}MN> z4vHkV8+u#5W4h^k=6Mes%1?+hZu!)KHaSu8F@qXh(5+FrC=SEnr8h=w8jRobu##Zj--%ar?|`>yLIMc2g%w%eh4*>&&ldYue|OR4BJ5vG$7Njf*> zx2QNv#RV$pT#z0WB+7(%V;L8KpkN@R>#|iabd6m~O6oC+@=5JS zQT~6U0Vk$BQ}&VBj-V3qcmxHa7!p}*xWHJGmt%EHjSvq*l{9%F)&kVGpkVt(U=nWM zc=SbVAP)Z#<;%m5?|&2=M-E-v(PWfy?K4+>n6uqG5t+!Jr`hUs+&^au128%^kk^G` z=b_mD2*t*y$-&`_)87+aWFcFw61Pls%^#Yiy7xc2i{}nZB0|DN{u^iu$c2M0DhiB< ze#owGYRDc#?b&JP8-t@07f-m*U3`ThwLFRZIX<4jxh{E*HFW;B_8K~8s^EX2@LlwPox@`J4aSuZ6ec)GstOX@Zq z>=ax0Wbt!1PDbuiZcKJ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/usage.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/__pycache__/usage.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bec855958c837fee35f1ab8d95154c32122e355c GIT binary patch literal 7026 zcmc&(OOG4J5uP5thQrsA%UyC;D`_OZLMN7tIF1ZKaP)NGz+MNtvJo(d2NY*krbN!r zJ-wDhY%W^e5(GX40dkRZFdQVu{D2_v$(Q6jCj&Vd$S*K*$XC_F*J$^!NPv)F&3skW zJ=5LQ-Cq~4S1PuF&+q@_`+w^g#y<&6KUv&d#V`69glBXOPk81~j6_$A%&sX2XNH+k zwwuL$*2@iZqkK1y`@B~e7DiUr8Wp?6k=?aNrEW(am_K zmw94zv(zG7bJQAK^ZMPp1<&?Mz?N6`D!3NCs#n9+_S#f%PcD_t1N3QS6J3r zHdwB*Y_eQqxz4hs+G^ua$Umq}wc(kE6fg!lA+s%MxF)L-W2$t^oRJ>Q&Z)Q@j{U%m z!v1|bJpg% zdALP!6N96AQqe4O_j-fjJ{06U*GBvOJ~|d^ypjCGmyx?C!;w1AMV3hvAuwmN zkw4t~qaj}c{PwkrYBat$9*kcZ1gLO0d}Vz9^}Bly-*|L!==H|0C9)q%{~|~Jh4G^} z$MNza%11wdFhu@@UrS8ZQq%7O*Ln1m`V!CZ44zUXu|7bWEHfI^2_U)5Q4=7({bX{gJ1y5(49wt%VX{Gdc3|c zD;M?6CHHWwz1N1lNG;Aut!}V-8jh@!RrIo~kys&7C($6WN}@?(jl?>M7Kt{A4HBCq zPLbFmahk*#5@$&`B+ijIPvSWe&y#q8L^?nv1r|rA7T*DkE!U-Paoy`c(VGw_kGffu znux!4I{u~)n1vuMjXC^yRsR6%yC;;M3oLwT+Z^jkT*O?K*3lDQ%0jYbkA;wd*PE25Va>?Ivs6DeWoNVi#ZP zxh>XirnIM7dn%nv-* zLZ08A)aR2?uZEW=ryS=ti05VJ=l-xa2JyH|>`Z^Y6~7?6Z=n~TFmovTakG8H_ghBhbgNz&S%Zipp$WD zP7e{}gLzaW)q+QYc_buqR$3c(HJ#ksA1*m`&Pm!1<4mMvTux@CrVcNYzBq`&y-<#N zN`4nuzCz*xiSLo%z5YZTgXskmjsJpUbWG+Gv5-el3h9rf>w0*-=qC_{u*9Z#e)cVk z_2j$7S1qTyOhxH&MM8lTazOl)_A{2?^B9L0qSE_ff_ z`&V#@s0u?&TJu<7I(Z@S>9ZX!bOndekNYhiu8aer#Gx5A6i%my;xQOa7To1P+{;{o zyPIL018CQTSjKL*Pz6xArTxDDXt}zBjfPDpch4BjGI&htFopA%W!MMSA6?m2L zD&r<_lW~*r8t@w9HOA|}>x|bKw}4xWTa4SlZN_cJ8^9ZkHyCdMZ!+FIpusn{C(b^n zOdJ(DIOftNHMlsN+k;4-A^N_oU|3~=#EGWY|Bk{>=U6UOAK|1+2g?+7r{lW&8|Wj7 zYeU$=GFQaOzDLce0ax6oz@`sfXO#VbgZ!!Zj8BW)*_i{AyE+MNPcTXXJ3$C=&)fj5 zzi-MNE`=lw`{h3s!HbDC3+tGzNZzou04su>%jRJHHCvI?VXGDVE3xHa`+{vq^{}lN z{3EdyVEdA7NC2_T4*rtZEZDwg8`45-D+RwxY(?1q%{C;9*j5e>5}SSB{8UH;7bXLe zNNlYHA12lkTi;+Sl1pr@23HennXMnN6-g(y)`IhDMS(b@*0E}+x`!!Atv<{ML#=us z?2mCmM<~~}WgY_(XVs&z->oKToE`t;eQZu$8$&m}FHz293aUx!W{Pd3ZKn67X}$)E zZbc_$rnWNR&Fv|w=-kW<>by(>C$G<^SU*YladyMO28QW(KL{TL$b@mS%AwbHuDlSv zIeGP@#X3z%F&Sr2q23VrSk32XK31RnFwMv15-R0<4$u2eM(=Tj<~{)UX3z3YlXv8E_xXfEp&4#uL{T+T~U_8nlek$VnaBi z&o@b=4uZR>RBch>4+CSNCzyXR>!NN=XIL~N(q&R>b&j9(cNB^!31o;YD3Q(CJ&Up? z&t&b`e~Ht~NCr_Cv<*q0dAn6s<hwBdl&V0C^2_p|%o{-e=^Rb) z>V?=0BYm{6{fB*j%xQmK*t*4iH5f)0@IR7X?Rda>@uN|X^Ezp&8PGhGXD=07S9CYL SNdpm4>1-P-nOPR?%zpq2rY^1k literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/connection.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/connection.py new file mode 100644 index 0000000..c062d3a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/connection.py @@ -0,0 +1,1605 @@ +""" +""" + +# Created on 2014.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from copy import deepcopy, copy +from os import linesep +from threading import RLock +from functools import reduce +import json + +from .. import ANONYMOUS, SIMPLE, SASL, MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, get_config_parameter, DEREF_ALWAYS, \ + SUBTREE, ASYNC, SYNC, NO_ATTRIBUTES, ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, MODIFY_INCREMENT, LDIF, ASYNC_STREAM, \ + RESTARTABLE, ROUND_ROBIN, REUSABLE, AUTO_BIND_DEFAULT, AUTO_BIND_NONE, AUTO_BIND_TLS_BEFORE_BIND, SAFE_SYNC, SAFE_RESTARTABLE, \ + AUTO_BIND_TLS_AFTER_BIND, AUTO_BIND_NO_TLS, STRING_TYPES, SEQUENCE_TYPES, MOCK_SYNC, MOCK_ASYNC, NTLM, EXTERNAL,\ + DIGEST_MD5, GSSAPI, PLAIN, DSA, SCHEMA, ALL + +from .results import RESULT_SUCCESS, RESULT_COMPARE_TRUE, RESULT_COMPARE_FALSE +from ..extend import ExtendedOperationsRoot +from .pooling import ServerPool +from .server import Server +from ..operation.abandon import abandon_operation, abandon_request_to_dict +from ..operation.add import add_operation, add_request_to_dict +from ..operation.bind import bind_operation, bind_request_to_dict +from ..operation.compare import compare_operation, compare_request_to_dict +from ..operation.delete import delete_operation, delete_request_to_dict +from ..operation.extended import extended_operation, extended_request_to_dict +from ..operation.modify import modify_operation, modify_request_to_dict +from ..operation.modifyDn import modify_dn_operation, modify_dn_request_to_dict +from ..operation.search import search_operation, search_request_to_dict +from ..protocol.rfc2849 import operation_to_ldif, add_ldif_header +from ..protocol.sasl.digestMd5 import sasl_digest_md5 +from ..protocol.sasl.external import sasl_external +from ..protocol.sasl.plain import sasl_plain +from ..strategy.sync import SyncStrategy +from ..strategy.safeSync import SafeSyncStrategy +from ..strategy.safeRestartable import SafeRestartableStrategy +from ..strategy.mockAsync import MockAsyncStrategy +from ..strategy.asynchronous import AsyncStrategy +from ..strategy.reusable import ReusableStrategy +from ..strategy.restartable import RestartableStrategy +from ..strategy.ldifProducer import LdifProducerStrategy +from ..strategy.mockSync import MockSyncStrategy +from ..strategy.asyncStream import AsyncStreamStrategy +from ..operation.unbind import unbind_operation +from ..protocol.rfc2696 import paged_search_control +from .usage import ConnectionUsage +from .tls import Tls +from .exceptions import LDAPUnknownStrategyError, LDAPBindError, LDAPUnknownAuthenticationMethodError, \ + LDAPSASLMechanismNotSupportedError, LDAPObjectClassError, LDAPConnectionIsReadOnlyError, LDAPChangeError, LDAPExceptionError, \ + LDAPObjectError, LDAPSocketReceiveError, LDAPAttributeError, LDAPInvalidValueError, LDAPInvalidPortError, LDAPStartTLSError + +from ..utils.conv import escape_bytes, prepare_for_stream, check_json_dict, format_json, to_unicode +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, EXTENDED, get_library_log_hide_sensitive_data +from ..utils.dn import safe_dn +from ..utils.port_validators import check_port_and_port_list + + +SASL_AVAILABLE_MECHANISMS = [EXTERNAL, + DIGEST_MD5, + GSSAPI, + PLAIN] + +CLIENT_STRATEGIES = [SYNC, + SAFE_SYNC, + SAFE_RESTARTABLE, + ASYNC, + LDIF, + RESTARTABLE, + REUSABLE, + MOCK_SYNC, + MOCK_ASYNC, + ASYNC_STREAM] + + +def _format_socket_endpoint(endpoint): + if endpoint and len(endpoint) == 2: # IPv4 + return str(endpoint[0]) + ':' + str(endpoint[1]) + elif endpoint and len(endpoint) == 4: # IPv6 + return '[' + str(endpoint[0]) + ']:' + str(endpoint[1]) + + try: + return str(endpoint) + except Exception: + return '?' + + +def _format_socket_endpoints(sock): + if sock: + try: + local = sock.getsockname() + except Exception: + local = (None, None, None, None) + try: + remote = sock.getpeername() + except Exception: + remote = (None, None, None, None) + + return '' + return '' + + +class Connection(object): + """Main ldap connection class. + + Controls, if used, must be a list of tuples. Each tuple must have 3 + elements, the control OID, a boolean meaning if the control is + critical, a value. + + If the boolean is set to True the server must honor the control or + refuse the operation + + Mixing controls must be defined in controls specification (as per + RFC 4511) + + :param server: the Server object to connect to + :type server: Server, str + :param user: the user name for simple authentication + :type user: str + :param password: the password for simple authentication + :type password: str + :param auto_bind: specify if the bind will be performed automatically when defining the Connection object + :type auto_bind: int, can be one of AUTO_BIND_DEFAULT, AUTO_BIND_NONE, AUTO_BIND_NO_TLS, AUTO_BIND_TLS_BEFORE_BIND, AUTO_BIND_TLS_AFTER_BIND as specified in ldap3 + :param version: LDAP version, default to 3 + :type version: int + :param authentication: type of authentication + :type authentication: int, can be one of ANONYMOUS, SIMPLE or SASL, as specified in ldap3 + :param client_strategy: communication strategy used in the Connection + :type client_strategy: can be one of SYNC, ASYNC, LDIF, RESTARTABLE, REUSABLE as specified in ldap3 + :param auto_referrals: specify if the connection object must automatically follow referrals + :type auto_referrals: bool + :param sasl_mechanism: mechanism for SASL authentication, can be one of 'EXTERNAL', 'DIGEST-MD5', 'GSSAPI', 'PLAIN' + :type sasl_mechanism: str + :param sasl_credentials: credentials for SASL mechanism + :type sasl_credentials: tuple + :param check_names: if True the library will check names of attributes and object classes against the schema. Also values found in entries will be formatted as indicated by the schema + :type check_names: bool + :param collect_usage: collect usage metrics in the usage attribute + :type collect_usage: bool + :param read_only: disable operations that modify data in the LDAP server + :type read_only: bool + :param lazy: open and bind the connection only when an actual operation is performed + :type lazy: bool + :param raise_exceptions: raise exceptions when operations are not successful, if False operations return False if not successful but not raise exceptions + :type raise_exceptions: bool + :param pool_name: pool name for pooled strategies + :type pool_name: str + :param pool_size: pool size for pooled strategies + :type pool_size: int + :param pool_lifetime: pool lifetime for pooled strategies + :type pool_lifetime: int + :param cred_store: credential store for gssapi + :type cred_store: dict + :param use_referral_cache: keep referral connections open and reuse them + :type use_referral_cache: bool + :param auto_escape: automatic escaping of filter values + :type auto_escape: bool + :param auto_encode: automatic encoding of attribute values + :type auto_encode: bool + :param source_address: the ip address or hostname to use as the source when opening the connection to the server + :type source_address: str + :param source_port: the source port to use when opening the connection to the server. Cannot be specified with source_port_list + :type source_port: int + :param source_port_list: a list of source ports to choose from when opening the connection to the server. Cannot be specified with source_port + :type source_port_list: list + """ + def __init__(self, + server, + user=None, + password=None, + auto_bind=AUTO_BIND_DEFAULT, + version=3, + authentication=None, + client_strategy=SYNC, + auto_referrals=True, + auto_range=True, + sasl_mechanism=None, + sasl_credentials=None, + check_names=True, + collect_usage=False, + read_only=False, + lazy=False, + raise_exceptions=False, + pool_name=None, + pool_size=None, + pool_lifetime=None, + cred_store=None, + fast_decoder=True, + receive_timeout=None, + return_empty_attributes=True, + use_referral_cache=False, + auto_escape=True, + auto_encode=True, + pool_keepalive=None, + source_address=None, + source_port=None, + source_port_list=None): + + conf_default_pool_name = get_config_parameter('DEFAULT_THREADED_POOL_NAME') + self.connection_lock = RLock() # re-entrant lock to ensure that operations in the Connection object are executed atomically in the same thread + with self.connection_lock: + if client_strategy not in CLIENT_STRATEGIES: + self.last_error = 'unknown client connection strategy' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownStrategyError(self.last_error) + + self.strategy_type = client_strategy + self.user = user + self.password = password + + if not authentication and self.user: + self.authentication = SIMPLE + elif not authentication: + self.authentication = ANONYMOUS + elif authentication in [SIMPLE, ANONYMOUS, SASL, NTLM]: + self.authentication = authentication + else: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + + self.version = version + self.auto_referrals = True if auto_referrals else False + self.request = None + self.response = None + self.result = None + self.bound = False + self.listening = False + self.closed = True + self.last_error = None + if auto_bind is False: # compatibility with older version where auto_bind was a boolean + self.auto_bind = AUTO_BIND_DEFAULT + elif auto_bind is True: + self.auto_bind = AUTO_BIND_NO_TLS + else: + self.auto_bind = auto_bind + self.sasl_mechanism = sasl_mechanism + self.sasl_credentials = sasl_credentials + self._usage = ConnectionUsage() if collect_usage else None + self.socket = None + self.tls_started = False + self.sasl_in_progress = False + self.read_only = read_only + self._context_state = [] + self._deferred_open = False + self._deferred_bind = False + self._deferred_start_tls = False + self._bind_controls = None + self._executing_deferred = False + self.lazy = lazy + self.pool_name = pool_name if pool_name else conf_default_pool_name + self.pool_size = pool_size + self.cred_store = cred_store + self.pool_lifetime = pool_lifetime + self.pool_keepalive = pool_keepalive + self.starting_tls = False + self.check_names = check_names + self.raise_exceptions = raise_exceptions + self.auto_range = True if auto_range else False + self.extend = ExtendedOperationsRoot(self) + self._entries = [] + self.fast_decoder = fast_decoder + self.receive_timeout = receive_timeout + self.empty_attributes = return_empty_attributes + self.use_referral_cache = use_referral_cache + self.auto_escape = auto_escape + self.auto_encode = auto_encode + self._digest_md5_kic = None + self._digest_md5_kis = None + self._digest_md5_sec_num = 0 + + port_err = check_port_and_port_list(source_port, source_port_list) + if port_err: + if log_enabled(ERROR): + log(ERROR, port_err) + raise LDAPInvalidPortError(port_err) + # using an empty string to bind a socket means "use the default as if this wasn't provided" because socket + # binding requires that you pass something for the ip if you want to pass a specific port + self.source_address = source_address if source_address is not None else '' + # using 0 as the source port to bind a socket means "use the default behavior of picking a random port from + # all ports as if this wasn't provided" because socket binding requires that you pass something for the port + # if you want to pass a specific ip + self.source_port_list = [0] + if source_port is not None: + self.source_port_list = [source_port] + elif source_port_list is not None: + self.source_port_list = source_port_list[:] + + if isinstance(server, STRING_TYPES): + server = Server(server) + if isinstance(server, SEQUENCE_TYPES): + server = ServerPool(server, ROUND_ROBIN, active=True, exhaust=True) + + if isinstance(server, ServerPool): + self.server_pool = server + self.server_pool.initialize(self) + self.server = self.server_pool.get_current_server(self) + else: + self.server_pool = None + self.server = server + + # if self.authentication == SIMPLE and self.user and self.check_names: + # self.user = safe_dn(self.user) + # if log_enabled(EXTENDED): + # log(EXTENDED, 'user name sanitized to <%s> for simple authentication via <%s>', self.user, self) + + if self.strategy_type == SYNC: + self.strategy = SyncStrategy(self) + elif self.strategy_type == SAFE_SYNC: + self.strategy = SafeSyncStrategy(self) + elif self.strategy_type == SAFE_RESTARTABLE: + self.strategy = SafeRestartableStrategy(self) + elif self.strategy_type == ASYNC: + self.strategy = AsyncStrategy(self) + elif self.strategy_type == LDIF: + self.strategy = LdifProducerStrategy(self) + elif self.strategy_type == RESTARTABLE: + self.strategy = RestartableStrategy(self) + elif self.strategy_type == REUSABLE: + self.strategy = ReusableStrategy(self) + self.lazy = False + elif self.strategy_type == MOCK_SYNC: + self.strategy = MockSyncStrategy(self) + elif self.strategy_type == MOCK_ASYNC: + self.strategy = MockAsyncStrategy(self) + elif self.strategy_type == ASYNC_STREAM: + self.strategy = AsyncStreamStrategy(self) + else: + self.last_error = 'unknown strategy' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownStrategyError(self.last_error) + + # maps strategy functions to connection functions + self.send = self.strategy.send + self.open = self.strategy.open + self.get_response = self.strategy.get_response + self.post_send_single_response = self.strategy.post_send_single_response + self.post_send_search = self.strategy.post_send_search + + if not self.strategy.no_real_dsa: + self._do_auto_bind() + # else: # for strategies with a fake server set get_info to NONE if server hasn't a schema + # if self.server and not self.server.schema: + # self.server.get_info = NONE + if log_enabled(BASIC): + if get_library_log_hide_sensitive_data(): + log(BASIC, 'instantiated Connection: <%s>', self.repr_with_sensitive_data_stripped()) + else: + log(BASIC, 'instantiated Connection: <%r>', self) + + def _prepare_return_value(self, status, response=False): + if self.strategy.thread_safe: + temp_response = self.response + self.response = None + temp_request = self.request + self.request = None + return status, deepcopy(self.result), deepcopy(temp_response) if response else None, copy(temp_request) + return status + + def _do_auto_bind(self): + if self.auto_bind and self.auto_bind not in [AUTO_BIND_NONE, AUTO_BIND_DEFAULT]: + if log_enabled(BASIC): + log(BASIC, 'performing automatic bind for <%s>', self) + if self.closed: + self.open(read_server_info=False) + if self.auto_bind == AUTO_BIND_NO_TLS: + self.bind(read_server_info=True) + elif self.auto_bind == AUTO_BIND_TLS_BEFORE_BIND: + if self.start_tls(read_server_info=False): + self.bind(read_server_info=True) + else: + error = 'automatic start_tls befored bind not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() # unbind anyway to close connection + raise LDAPStartTLSError(error) + elif self.auto_bind == AUTO_BIND_TLS_AFTER_BIND: + self.bind(read_server_info=False) + if not self.start_tls(read_server_info=True): + error = 'automatic start_tls after bind not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPStartTLSError(error) + if not self.bound: + error = 'automatic bind not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPBindError(error) + + def __str__(self): + s = [ + str(self.server) if self.server else 'None', + 'user: ' + str(self.user), + 'lazy' if self.lazy else 'not lazy', + 'unbound' if not self.bound else ('deferred bind' if self._deferred_bind else 'bound'), + 'closed' if self.closed else ('deferred open' if self._deferred_open else 'open'), + _format_socket_endpoints(self.socket), + 'tls not started' if not self.tls_started else('deferred start_tls' if self._deferred_start_tls else 'tls started'), + 'listening' if self.listening else 'not listening', + self.strategy.__class__.__name__ if hasattr(self, 'strategy') else 'No strategy', + 'internal decoder' if self.fast_decoder else 'pyasn1 decoder' + ] + return ' - '.join(s) + + def __repr__(self): + conf_default_pool_name = get_config_parameter('DEFAULT_THREADED_POOL_NAME') + if self.server_pool: + r = 'Connection(server={0.server_pool!r}'.format(self) + else: + r = 'Connection(server={0.server!r}'.format(self) + r += '' if self.user is None else ', user={0.user!r}'.format(self) + r += '' if self.password is None else ', password={0.password!r}'.format(self) + r += '' if self.auto_bind is None else ', auto_bind={0.auto_bind!r}'.format(self) + r += '' if self.version is None else ', version={0.version!r}'.format(self) + r += '' if self.authentication is None else ', authentication={0.authentication!r}'.format(self) + r += '' if self.strategy_type is None else ', client_strategy={0.strategy_type!r}'.format(self) + r += '' if self.auto_referrals is None else ', auto_referrals={0.auto_referrals!r}'.format(self) + r += '' if self.sasl_mechanism is None else ', sasl_mechanism={0.sasl_mechanism!r}'.format(self) + r += '' if self.sasl_credentials is None else ', sasl_credentials={0.sasl_credentials!r}'.format(self) + r += '' if self.check_names is None else ', check_names={0.check_names!r}'.format(self) + r += '' if self.usage is None else (', collect_usage=' + ('True' if self.usage else 'False')) + r += '' if self.read_only is None else ', read_only={0.read_only!r}'.format(self) + r += '' if self.lazy is None else ', lazy={0.lazy!r}'.format(self) + r += '' if self.raise_exceptions is None else ', raise_exceptions={0.raise_exceptions!r}'.format(self) + r += '' if (self.pool_name is None or self.pool_name == conf_default_pool_name) else ', pool_name={0.pool_name!r}'.format(self) + r += '' if self.pool_size is None else ', pool_size={0.pool_size!r}'.format(self) + r += '' if self.pool_lifetime is None else ', pool_lifetime={0.pool_lifetime!r}'.format(self) + r += '' if self.pool_keepalive is None else ', pool_keepalive={0.pool_keepalive!r}'.format(self) + r += '' if self.cred_store is None else (', cred_store=' + repr(self.cred_store)) + r += '' if self.fast_decoder is None else (', fast_decoder=' + ('True' if self.fast_decoder else 'False')) + r += '' if self.auto_range is None else (', auto_range=' + ('True' if self.auto_range else 'False')) + r += '' if self.receive_timeout is None else ', receive_timeout={0.receive_timeout!r}'.format(self) + r += '' if self.empty_attributes is None else (', return_empty_attributes=' + ('True' if self.empty_attributes else 'False')) + r += '' if self.auto_encode is None else (', auto_encode=' + ('True' if self.auto_encode else 'False')) + r += '' if self.auto_escape is None else (', auto_escape=' + ('True' if self.auto_escape else 'False')) + r += '' if self.use_referral_cache is None else (', use_referral_cache=' + ('True' if self.use_referral_cache else 'False')) + r += ')' + + return r + + def repr_with_sensitive_data_stripped(self): + conf_default_pool_name = get_config_parameter('DEFAULT_THREADED_POOL_NAME') + if self.server_pool: + r = 'Connection(server={0.server_pool!r}'.format(self) + else: + r = 'Connection(server={0.server!r}'.format(self) + r += '' if self.user is None else ', user={0.user!r}'.format(self) + r += '' if self.password is None else ", password='{0}'".format('' % len(self.password)) + r += '' if self.auto_bind is None else ', auto_bind={0.auto_bind!r}'.format(self) + r += '' if self.version is None else ', version={0.version!r}'.format(self) + r += '' if self.authentication is None else ', authentication={0.authentication!r}'.format(self) + r += '' if self.strategy_type is None else ', client_strategy={0.strategy_type!r}'.format(self) + r += '' if self.auto_referrals is None else ', auto_referrals={0.auto_referrals!r}'.format(self) + r += '' if self.sasl_mechanism is None else ', sasl_mechanism={0.sasl_mechanism!r}'.format(self) + if self.sasl_mechanism == DIGEST_MD5: + r += '' if self.sasl_credentials is None else ", sasl_credentials=({0!r}, {1!r}, '{2}', {3!r})".format(self.sasl_credentials[0], self.sasl_credentials[1], '*' * len(self.sasl_credentials[2]), self.sasl_credentials[3]) + else: + r += '' if self.sasl_credentials is None else ', sasl_credentials={0.sasl_credentials!r}'.format(self) + r += '' if self.check_names is None else ', check_names={0.check_names!r}'.format(self) + r += '' if self.usage is None else (', collect_usage=' + 'True' if self.usage else 'False') + r += '' if self.read_only is None else ', read_only={0.read_only!r}'.format(self) + r += '' if self.lazy is None else ', lazy={0.lazy!r}'.format(self) + r += '' if self.raise_exceptions is None else ', raise_exceptions={0.raise_exceptions!r}'.format(self) + r += '' if (self.pool_name is None or self.pool_name == conf_default_pool_name) else ', pool_name={0.pool_name!r}'.format(self) + r += '' if self.pool_size is None else ', pool_size={0.pool_size!r}'.format(self) + r += '' if self.pool_lifetime is None else ', pool_lifetime={0.pool_lifetime!r}'.format(self) + r += '' if self.pool_keepalive is None else ', pool_keepalive={0.pool_keepalive!r}'.format(self) + r += '' if self.cred_store is None else (', cred_store=' + repr(self.cred_store)) + r += '' if self.fast_decoder is None else (', fast_decoder=' + 'True' if self.fast_decoder else 'False') + r += '' if self.auto_range is None else (', auto_range=' + ('True' if self.auto_range else 'False')) + r += '' if self.receive_timeout is None else ', receive_timeout={0.receive_timeout!r}'.format(self) + r += '' if self.empty_attributes is None else (', return_empty_attributes=' + 'True' if self.empty_attributes else 'False') + r += '' if self.auto_encode is None else (', auto_encode=' + ('True' if self.auto_encode else 'False')) + r += '' if self.auto_escape is None else (', auto_escape=' + ('True' if self.auto_escape else 'False')) + r += '' if self.use_referral_cache is None else (', use_referral_cache=' + ('True' if self.use_referral_cache else 'False')) + r += ')' + + return r + + @property + def stream(self): + """Used by the LDIFProducer strategy to accumulate the ldif-change operations with a single LDIF header + :return: reference to the response stream if defined in the strategy. + """ + return self.strategy.get_stream() if self.strategy.can_stream else None + + @stream.setter + def stream(self, value): + with self.connection_lock: + if self.strategy.can_stream: + self.strategy.set_stream(value) + + @property + def usage(self): + """Usage statistics for the connection. + :return: Usage object + """ + if not self._usage: + return None + if self.strategy.pooled: # update master connection usage from pooled connections + self._usage.reset() + for worker in self.strategy.pool.workers: + self._usage += worker.connection.usage + self._usage += self.strategy.pool.terminated_usage + return self._usage + + def __enter__(self): + with self.connection_lock: + self._context_state.append((self.bound, self.closed)) # save status out of context as a tuple in a list + if self.auto_bind != AUTO_BIND_NONE: + if self.auto_bind == AUTO_BIND_DEFAULT: + self.auto_bind = AUTO_BIND_NO_TLS + if self.closed: + self.open() + if not self.bound: + if not self.bind(): + raise LDAPBindError('unable to bind') + + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + with self.connection_lock: + context_bound, context_closed = self._context_state.pop() + if (not context_bound and self.bound) or self.stream: # restore status prior to entering context + try: + self.unbind() + except LDAPExceptionError: + pass + + if not context_closed and self.closed: + self.open() + + if exc_type is not None: + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', exc_type, self) + return False # re-raise LDAPExceptionError + + def bind(self, + read_server_info=True, + controls=None): + """Bind to ldap Server with the authentication method and the user defined in the connection + + :param read_server_info: reads info from server + :param controls: LDAP controls to send along with the bind operation + :type controls: list of tuple + :return: bool + + """ + if log_enabled(BASIC): + log(BASIC, 'start BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + if self.lazy and not self._executing_deferred: + if self.strategy.pooled: + self.strategy.validate_bind(controls) + self._deferred_bind = True + self._bind_controls = controls + self.bound = True + if log_enabled(BASIC): + log(BASIC, 'deferring bind for <%s>', self) + else: + self._deferred_bind = False + self._bind_controls = None + if self.closed: # try to open connection if closed + self.open(read_server_info=False) + if self.authentication == ANONYMOUS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing anonymous BIND for <%s>', self) + if not self.strategy.pooled: + request = bind_operation(self.version, self.authentication, self.user, '', auto_encode=self.auto_encode) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'anonymous BIND request <%s> sent via <%s>', bind_request_to_dict(request), self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + elif self.authentication == SIMPLE: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing simple BIND for <%s>', self) + if not self.strategy.pooled: + request = bind_operation(self.version, self.authentication, self.user, self.password, auto_encode=self.auto_encode) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'simple BIND request <%s> sent via <%s>', bind_request_to_dict(request), self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + elif self.authentication == SASL: + if self.sasl_mechanism in SASL_AVAILABLE_MECHANISMS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing SASL BIND for <%s>', self) + if not self.strategy.pooled: + response = self.do_sasl_bind(controls) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + else: + self.last_error = 'requested SASL mechanism not supported' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPSASLMechanismNotSupportedError(self.last_error) + elif self.authentication == NTLM: + if self.user and self.password and len(self.user.split('\\')) == 2: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing NTLM BIND for <%s>', self) + if not self.strategy.pooled: + response = self.do_ntlm_bind(controls) + else: + response = self.strategy.validate_bind(controls) # only for REUSABLE + else: # user or password missing + self.last_error = 'NTLM needs domain\\username and a password' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + else: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + + if not self.strategy.sync and not self.strategy.pooled and self.authentication not in (SASL, NTLM): # get response if asynchronous except for SASL and NTLM that return the bind result even for asynchronous strategy + _, result = self.get_response(response) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async BIND response id <%s> received via <%s>', result, self) + elif self.strategy.sync: + result = self.result + if log_enabled(PROTOCOL): + log(PROTOCOL, 'BIND response <%s> received via <%s>', result, self) + elif self.strategy.pooled or self.authentication in (SASL, NTLM): # asynchronous SASL and NTLM or reusable strtegy get the bind result synchronously + result = response + else: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + + if result is None: + # self.bound = True if self.strategy_type == REUSABLE else False + self.bound = False + elif result is True: + self.bound = True + elif result is False: + self.bound = False + else: + self.bound = True if result['result'] == RESULT_SUCCESS else False + if not self.bound and result and result['description'] and not self.last_error: + self.last_error = result['description'] + + if read_server_info and self.bound: + self.refresh_server_info() + self._entries = [] + + if log_enabled(BASIC): + log(BASIC, 'done BIND operation, result <%s>', self.bound) + + return self._prepare_return_value(self.bound, self.result) + + def rebind(self, + user=None, + password=None, + authentication=None, + sasl_mechanism=None, + sasl_credentials=None, + read_server_info=True, + controls=None + ): + + if log_enabled(BASIC): + log(BASIC, 'start (RE)BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + if user: + self.user = user + if password is not None: + self.password = password + if not authentication and user: + self.authentication = SIMPLE + if authentication in [SIMPLE, ANONYMOUS, SASL, NTLM]: + self.authentication = authentication + elif authentication is not None: + self.last_error = 'unknown authentication method' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPUnknownAuthenticationMethodError(self.last_error) + if sasl_mechanism: + self.sasl_mechanism = sasl_mechanism + if sasl_credentials: + self.sasl_credentials = sasl_credentials + + # if self.authentication == SIMPLE and self.user and self.check_names: + # self.user = safe_dn(self.user) + # if log_enabled(EXTENDED): + # log(EXTENDED, 'user name sanitized to <%s> for rebind via <%s>', self.user, self) + + if not self.strategy.pooled: + try: + return self.bind(read_server_info, controls) + except LDAPSocketReceiveError: + self.last_error = 'Unable to rebind as a different user, furthermore the server abruptly closed the connection' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPBindError(self.last_error) + else: + self.strategy.pool.rebind_pool() + return self._prepare_return_value(True, self.result) + + def unbind(self, + controls=None): + """Unbind the connected user. Unbind implies closing session as per RFC4511 (4.3) + + :param controls: LDAP controls to send along with the bind operation + + """ + if log_enabled(BASIC): + log(BASIC, 'start UNBIND operation via <%s>', self) + + if self.use_referral_cache: + self.strategy.unbind_referral_cache() + + self.last_error = None + with self.connection_lock: + if self.lazy and not self._executing_deferred and (self._deferred_bind or self._deferred_open): # _clear deferred status + self.strategy.close() + self._deferred_open = False + self._deferred_bind = False + self._deferred_start_tls = False + elif not self.closed: + request = unbind_operation() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'UNBIND request sent via <%s>', self) + self.send('unbindRequest', request, controls) + self.strategy.close() + + if log_enabled(BASIC): + log(BASIC, 'done UNBIND operation, result <%s>', True) + + return self._prepare_return_value(True) + + def search(self, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=None, + paged_criticality=False, + paged_cookie=None, + auto_escape=None): + """ + Perform an ldap search: + + - If attributes is empty noRFC2696 with the specified size + - If paged is 0 and cookie is present the search is abandoned on + server attribute is returned + - If attributes is ALL_ATTRIBUTES all attributes are returned + - If paged_size is an int greater than 0 a simple paged search + is tried as described in + - Cookie is an opaque string received in the last paged search + and must be used on the next paged search response + - If lazy == True open and bind will be deferred until another + LDAP operation is performed + - If mssing_attributes == True then an attribute not returned by the server is set to None + - If auto_escape is set it overrides the Connection auto_escape + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + if log_enabled(BASIC): + log(BASIC, 'start SEARCH operation via <%s>', self) + + if self.check_names and search_base: + search_base = safe_dn(search_base) + if log_enabled(EXTENDED): + log(EXTENDED, 'search base sanitized to <%s> for SEARCH operation via <%s>', search_base, self) + + with self.connection_lock: + self._fire_deferred() + if not attributes: + attributes = [NO_ATTRIBUTES] + elif attributes == ALL_ATTRIBUTES: + attributes = [ALL_ATTRIBUTES] + + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + + if get_operational_attributes and isinstance(attributes, list): + attributes.append(ALL_OPERATIONAL_ATTRIBUTES) + elif get_operational_attributes and isinstance(attributes, tuple): + attributes += (ALL_OPERATIONAL_ATTRIBUTES, ) # concatenate tuple + + if isinstance(paged_size, int): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing paged search for %d items with cookie <%s> for <%s>', paged_size, escape_bytes(paged_cookie), self) + + if controls is None: + controls = [] + else: + # Copy the controls to prevent modifying the original object + controls = list(controls) + controls.append(paged_search_control(paged_criticality, paged_size, paged_cookie)) + + if self.server and self.server.schema and self.check_names: + for attribute_name in attributes: + if ';' in attribute_name: # remove tags + attribute_name_to_check = attribute_name.split(';')[0] + else: + attribute_name_to_check = attribute_name + if self.server.schema and attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + + request = search_operation(search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + self.auto_escape if auto_escape is None else auto_escape, + self.auto_encode, + self.server.schema if self.server else None, + validator=self.server.custom_validator, + check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'SEARCH request <%s> sent via <%s>', search_request_to_dict(request), self) + response = self.post_send_search(self.send('searchRequest', request, controls)) + self._entries = [] + + if isinstance(response, int): # asynchronous strategy + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async SEARCH response id <%s> received via <%s>', return_value, self) + else: + return_value = True if self.result['type'] == 'searchResDone' and len(response) > 0 else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(PROTOCOL): + for entry in response: + if entry['type'] == 'searchResEntry': + log(PROTOCOL, 'SEARCH response entry <%s> received via <%s>', entry, self) + elif entry['type'] == 'searchResRef': + log(PROTOCOL, 'SEARCH response reference <%s> received via <%s>', entry, self) + + if log_enabled(BASIC): + log(BASIC, 'done SEARCH operation, result <%s>', return_value) + + return self._prepare_return_value(return_value, response=True) + + def compare(self, + dn, + attribute, + value, + controls=None): + """ + Perform a compare operation + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + + if log_enabled(BASIC): + log(BASIC, 'start COMPARE operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for COMPARE operation via <%s>', dn, self) + + if self.server and self.server.schema and self.check_names: + if ';' in attribute: # remove tags for checking + attribute_name_to_check = attribute.split(';')[0] + else: + attribute_name_to_check = attribute + + if self.server.schema.attribute_types and attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + + if isinstance(value, SEQUENCE_TYPES): # value can't be a sequence + self.last_error = 'value cannot be a sequence' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPInvalidValueError(self.last_error) + + with self.connection_lock: + self._fire_deferred() + request = compare_operation(dn, attribute, value, self.auto_encode, self.server.schema if self.server else None, validator=self.server.custom_validator if self.server else None, check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'COMPARE request <%s> sent via <%s>', compare_request_to_dict(request), self) + response = self.post_send_single_response(self.send('compareRequest', request, controls)) + self._entries = [] + if isinstance(response, int): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async COMPARE response id <%s> received via <%s>', return_value, self) + else: + return_value = True if self.result['type'] == 'compareResponse' and self.result['result'] == RESULT_COMPARE_TRUE else False + if not return_value and self.result['result'] not in [RESULT_COMPARE_TRUE, RESULT_COMPARE_FALSE] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(PROTOCOL): + log(PROTOCOL, 'COMPARE response <%s> received via <%s>', response, self) + + if log_enabled(BASIC): + log(BASIC, 'done COMPARE operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def add(self, + dn, + object_class=None, + attributes=None, + controls=None): + """ + Add dn to the DIT, object_class is None, a class name or a list + of class names. + + Attributes is a dictionary in the form 'attr': 'val' or 'attr': + ['val1', 'val2', ...] for multivalued attributes + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + conf_classes_excluded_from_check = [v.lower() for v in get_config_parameter('CLASSES_EXCLUDED_FROM_CHECK')] + if log_enabled(BASIC): + log(BASIC, 'start ADD operation via <%s>', self) + self.last_error = None + _attributes = deepcopy(attributes) # dict could change when adding objectClass values + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for ADD operation via <%s>', dn, self) + + with self.connection_lock: + self._fire_deferred() + attr_object_class = [] + if object_class is None: + parm_object_class = [] + else: + parm_object_class = list(object_class) if isinstance(object_class, SEQUENCE_TYPES) else [object_class] + + object_class_attr_name = '' + if _attributes: + for attr in _attributes: + if attr.lower() == 'objectclass': + object_class_attr_name = attr + attr_object_class = list(_attributes[object_class_attr_name]) if isinstance(_attributes[object_class_attr_name], SEQUENCE_TYPES) else [_attributes[object_class_attr_name]] + break + else: + _attributes = dict() + + if not object_class_attr_name: + object_class_attr_name = 'objectClass' + + attr_object_class = [to_unicode(object_class) for object_class in attr_object_class] # converts objectclass to unicode in case of bytes value + _attributes[object_class_attr_name] = reduce(lambda x, y: x + [y] if y not in x else x, parm_object_class + attr_object_class, []) # remove duplicate ObjectClasses + + if not _attributes[object_class_attr_name]: + self.last_error = 'objectClass attribute is mandatory' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPObjectClassError(self.last_error) + + if self.server and self.server.schema and self.check_names: + for object_class_name in _attributes[object_class_attr_name]: + if object_class_name.lower() not in conf_classes_excluded_from_check and object_class_name not in self.server.schema.object_classes: + self.last_error = 'invalid object class ' + str(object_class_name) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPObjectClassError(self.last_error) + + for attribute_name in _attributes: + if ';' in attribute_name: # remove tags for checking + attribute_name_to_check = attribute_name.split(';')[0] + else: + attribute_name_to_check = attribute_name + + if attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + + request = add_operation(dn, _attributes, self.auto_encode, self.server.schema if self.server else None, validator=self.server.custom_validator if self.server else None, check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'ADD request <%s> sent via <%s>', add_request_to_dict(request), self) + response = self.post_send_single_response(self.send('addRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async ADD response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'ADD response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'addResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done ADD operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def delete(self, + dn, + controls=None): + """ + Delete the entry identified by the DN from the DIB. + """ + if log_enabled(BASIC): + log(BASIC, 'start DELETE operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for DELETE operation via <%s>', dn, self) + + with self.connection_lock: + self._fire_deferred() + if self.read_only: + self.last_error = 'connection is read-only' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPConnectionIsReadOnlyError(self.last_error) + + request = delete_operation(dn) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'DELETE request <%s> sent via <%s>', delete_request_to_dict(request), self) + response = self.post_send_single_response(self.send('delRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async DELETE response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'DELETE response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'delResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done DELETE operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def modify(self, + dn, + changes, + controls=None): + """ + Modify attributes of entry + + - changes is a dictionary in the form {'attribute1': change), 'attribute2': [change, change, ...], ...} + - change is (operation, [value1, value2, ...]) + - operation is 0 (MODIFY_ADD), 1 (MODIFY_DELETE), 2 (MODIFY_REPLACE), 3 (MODIFY_INCREMENT) + """ + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + + if log_enabled(BASIC): + log(BASIC, 'start MODIFY operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for MODIFY operation via <%s>', dn, self) + + with self.connection_lock: + self._fire_deferred() + if self.read_only: + self.last_error = 'connection is read-only' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPConnectionIsReadOnlyError(self.last_error) + + if not isinstance(changes, dict): + self.last_error = 'changes must be a dictionary' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + + if not changes: + self.last_error = 'no changes in modify request' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + + changelist = dict() + for attribute_name in changes: + if self.server and self.server.schema and self.check_names: + if ';' in attribute_name: # remove tags for checking + attribute_name_to_check = attribute_name.split(';')[0] + else: + attribute_name_to_check = attribute_name + + if self.server.schema.attribute_types and attribute_name_to_check.lower() not in conf_attributes_excluded_from_check and attribute_name_to_check not in self.server.schema.attribute_types: + self.last_error = 'invalid attribute type ' + attribute_name_to_check + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPAttributeError(self.last_error) + change = changes[attribute_name] + if isinstance(change, SEQUENCE_TYPES) and change[0] in [MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, MODIFY_INCREMENT, 0, 1, 2, 3]: + if len(change) != 2: + self.last_error = 'malformed change' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + + changelist[attribute_name] = [change] # insert change in a list + else: + for change_operation in change: + if len(change_operation) != 2 or change_operation[0] not in [MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, MODIFY_INCREMENT, 0, 1, 2, 3]: + self.last_error = 'invalid change list' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPChangeError(self.last_error) + changelist[attribute_name] = change + request = modify_operation(dn, changelist, self.auto_encode, self.server.schema if self.server else None, validator=self.server.custom_validator if self.server else None, check_names=self.check_names) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY request <%s> sent via <%s>', modify_request_to_dict(request), self) + response = self.post_send_single_response(self.send('modifyRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async MODIFY response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'modifyResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done MODIFY operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def modify_dn(self, + dn, + relative_dn, + delete_old_dn=True, + new_superior=None, + controls=None): + """ + Modify DN of the entry or performs a move of the entry in the + DIT. + """ + if log_enabled(BASIC): + log(BASIC, 'start MODIFY DN operation via <%s>', self) + self.last_error = None + if self.check_names: + dn = safe_dn(dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'dn sanitized to <%s> for MODIFY DN operation via <%s>', dn, self) + relative_dn = safe_dn(relative_dn) + if log_enabled(EXTENDED): + log(EXTENDED, 'relative dn sanitized to <%s> for MODIFY DN operation via <%s>', relative_dn, self) + + with self.connection_lock: + self._fire_deferred() + if self.read_only: + self.last_error = 'connection is read-only' + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', self.last_error, self) + raise LDAPConnectionIsReadOnlyError(self.last_error) + + # if new_superior and not dn.startswith(relative_dn): # as per RFC4511 (4.9) + # self.last_error = 'DN cannot change while performing moving' + # if log_enabled(ERROR): + # log(ERROR, '%s for <%s>', self.last_error, self) + # raise LDAPChangeError(self.last_error) + + request = modify_dn_operation(dn, relative_dn, delete_old_dn, new_superior) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY DN request <%s> sent via <%s>', modify_dn_request_to_dict(request), self) + response = self.post_send_single_response(self.send('modDNRequest', request, controls)) + self._entries = [] + + if isinstance(response, STRING_TYPES + (int, )): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async MODIFY DN response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'MODIFY DN response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'modDNResponse' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done MODIFY DN operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def abandon(self, + message_id, + controls=None): + """ + Abandon the operation indicated by message_id + """ + if log_enabled(BASIC): + log(BASIC, 'start ABANDON operation via <%s>', self) + self.last_error = None + with self.connection_lock: + self._fire_deferred() + return_value = False + if self.strategy._outstanding or message_id == 0: + # only current operation should be abandoned, abandon, bind and unbind cannot ever be abandoned, + # messagiId 0 is invalid and should be used as a "ping" to keep alive the connection + if (self.strategy._outstanding and message_id in self.strategy._outstanding and self.strategy._outstanding[message_id]['type'] not in ['abandonRequest', 'bindRequest', 'unbindRequest']) or message_id == 0: + request = abandon_operation(message_id) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'ABANDON request: <%s> sent via <%s>', abandon_request_to_dict(request), self) + self.send('abandonRequest', request, controls) + self.result = None + self.response = None + self._entries = [] + return_value = True + else: + if log_enabled(ERROR): + log(ERROR, 'cannot abandon a Bind, an Unbind or an Abandon operation or message ID %s not found via <%s>', str(message_id), self) + + if log_enabled(BASIC): + log(BASIC, 'done ABANDON operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def extended(self, + request_name, + request_value=None, + controls=None, + no_encode=None): + """ + Performs an extended operation + """ + if log_enabled(BASIC): + log(BASIC, 'start EXTENDED operation via <%s>', self) + self.last_error = None + with self.connection_lock: + self._fire_deferred() + request = extended_operation(request_name, request_value, no_encode=no_encode) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'EXTENDED request <%s> sent via <%s>', extended_request_to_dict(request), self) + response = self.post_send_single_response(self.send('extendedReq', request, controls)) + self._entries = [] + if isinstance(response, int): + return_value = response + if log_enabled(PROTOCOL): + log(PROTOCOL, 'async EXTENDED response id <%s> received via <%s>', return_value, self) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'EXTENDED response <%s> received via <%s>', response, self) + return_value = True if self.result['type'] == 'extendedResp' and self.result['result'] == RESULT_SUCCESS else False + if not return_value and self.result['result'] not in [RESULT_SUCCESS] and not self.last_error: + self.last_error = self.result['description'] + + if log_enabled(BASIC): + log(BASIC, 'done EXTENDED operation, result <%s>', return_value) + + return self._prepare_return_value(return_value, response=True) + + def start_tls(self, read_server_info=True): # as per RFC4511. Removal of TLS is defined as MAY in RFC4511 so the client can't implement a generic stop_tls method0 + if log_enabled(BASIC): + log(BASIC, 'start START TLS operation via <%s>', self) + + with self.connection_lock: + return_value = False + self.result = None + + if not self.server.tls: + self.server.tls = Tls() + + if self.lazy and not self._executing_deferred: + self._deferred_start_tls = True + self.tls_started = True + return_value = True + if log_enabled(BASIC): + log(BASIC, 'deferring START TLS for <%s>', self) + else: + self._deferred_start_tls = False + if self.closed: + self.open() + if self.server.tls.start_tls(self) and self.strategy.sync: # for asynchronous connections _start_tls is run by the strategy + if read_server_info: + self.refresh_server_info() # refresh server info as per RFC4515 (3.1.5) + return_value = True + elif not self.strategy.sync: + return_value = True + + if log_enabled(BASIC): + log(BASIC, 'done START TLS operation, result <%s>', return_value) + + return self._prepare_return_value(return_value) + + def do_sasl_bind(self, + controls): + if log_enabled(BASIC): + log(BASIC, 'start SASL BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + result = None + + if not self.sasl_in_progress: + self.sasl_in_progress = True + try: + if self.sasl_mechanism == EXTERNAL: + result = sasl_external(self, controls) + elif self.sasl_mechanism == DIGEST_MD5: + result = sasl_digest_md5(self, controls) + elif self.sasl_mechanism == GSSAPI: + from ..protocol.sasl.kerberos import sasl_gssapi # needs the gssapi package + result = sasl_gssapi(self, controls) + elif self.sasl_mechanism == 'PLAIN': + result = sasl_plain(self, controls) + finally: + self.sasl_in_progress = False + + if log_enabled(BASIC): + log(BASIC, 'done SASL BIND operation, result <%s>', result) + + return result + + def do_ntlm_bind(self, + controls): + if log_enabled(BASIC): + log(BASIC, 'start NTLM BIND operation via <%s>', self) + self.last_error = None + with self.connection_lock: + if not self.sasl_in_progress: + self.sasl_in_progress = True # ntlm is same of sasl authentication + try: + # additional import for NTLM + from ..utils.ntlm import NtlmClient + domain_name, user_name = self.user.split('\\', 1) + ntlm_client = NtlmClient(user_name=user_name, domain=domain_name, password=self.password) + + # as per https://msdn.microsoft.com/en-us/library/cc223501.aspx + # send a sicilyPackageDiscovery request (in the bindRequest) + request = bind_operation(self.version, 'SICILY_PACKAGE_DISCOVERY', ntlm_client) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY PACKAGE DISCOVERY request sent via <%s>', self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + if not self.strategy.sync: + _, result = self.get_response(response) + else: + result = response[0] + if 'server_creds' in result: + sicily_packages = result['server_creds'].decode('ascii').split(';') + if 'NTLM' in sicily_packages: # NTLM available on server + request = bind_operation(self.version, 'SICILY_NEGOTIATE_NTLM', ntlm_client) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY NEGOTIATE request sent via <%s>', self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + if not self.strategy.sync: + _, result = self.get_response(response) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY NEGOTIATE response <%s> received via <%s>', response[0], + self) + result = response[0] + + if result['result'] == RESULT_SUCCESS: + request = bind_operation(self.version, 'SICILY_RESPONSE_NTLM', ntlm_client, + result['server_creds']) + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM SICILY RESPONSE NTLM request sent via <%s>', self) + response = self.post_send_single_response(self.send('bindRequest', request, controls)) + if not self.strategy.sync: + _, result = self.get_response(response) + else: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'NTLM BIND response <%s> received via <%s>', response[0], self) + result = response[0] + else: + result = None + finally: + self.sasl_in_progress = False + + if log_enabled(BASIC): + log(BASIC, 'done SASL NTLM operation, result <%s>', result) + + return result + + def refresh_server_info(self): + # if self.strategy.no_real_dsa: # do not refresh for mock strategies + # return + + if not self.strategy.pooled: + with self.connection_lock: + if not self.closed: + if log_enabled(BASIC): + log(BASIC, 'refreshing server info for <%s>', self) + previous_response = self.response + previous_result = self.result + previous_entries = self._entries + self.server.get_info_from_server(self) + self.response = previous_response + self.result = previous_result + self._entries = previous_entries + else: + if log_enabled(BASIC): + log(BASIC, 'refreshing server info from pool for <%s>', self) + self.strategy.pool.get_info_from_server() + + def response_to_ldif(self, + search_result=None, + all_base64=False, + line_separator=None, + sort_order=None, + stream=None): + with self.connection_lock: + if search_result is None: + search_result = self.response + + if isinstance(search_result, SEQUENCE_TYPES): + ldif_lines = operation_to_ldif('searchResponse', search_result, all_base64, sort_order=sort_order) + ldif_lines = add_ldif_header(ldif_lines) + line_separator = line_separator or linesep + ldif_output = line_separator.join(ldif_lines) + if stream: + if stream.tell() == 0: + header = add_ldif_header(['-'])[0] + stream.write(prepare_for_stream(header + line_separator + line_separator)) + stream.write(prepare_for_stream(ldif_output + line_separator + line_separator)) + if log_enabled(BASIC): + log(BASIC, 'building LDIF output <%s> for <%s>', ldif_output, self) + return ldif_output + + return None + + def response_to_json(self, + raw=False, + search_result=None, + indent=4, + sort=True, + stream=None, + checked_attributes=True, + include_empty=True): + + with self.connection_lock: + if search_result is None: + search_result = self.response + + if isinstance(search_result, SEQUENCE_TYPES): + json_dict = dict() + json_dict['entries'] = [] + + for response in search_result: + if response['type'] == 'searchResEntry': + entry = dict() + + entry['dn'] = response['dn'] + if checked_attributes: + if not include_empty: + # needed for python 2.6 compatibility + entry['attributes'] = dict((key, response['attributes'][key]) for key in response['attributes'] if response['attributes'][key]) + else: + entry['attributes'] = dict(response['attributes']) + if raw: + if not include_empty: + # needed for python 2.6 compatibility + entry['raw_attributes'] = dict((key, response['raw_attributes'][key]) for key in response['raw_attributes'] if response['raw:attributes'][key]) + else: + entry['raw'] = dict(response['raw_attributes']) + json_dict['entries'].append(entry) + + if str is bytes: # Python 2 + check_json_dict(json_dict) + + json_output = json.dumps(json_dict, ensure_ascii=True, sort_keys=sort, indent=indent, check_circular=True, default=format_json, separators=(',', ': ')) + + if log_enabled(BASIC): + log(BASIC, 'building JSON output <%s> for <%s>', json_output, self) + if stream: + stream.write(json_output) + + return json_output + + def response_to_file(self, + target, + raw=False, + indent=4, + sort=True): + with self.connection_lock: + if self.response: + if isinstance(target, STRING_TYPES): + target = open(target, 'w+') + + if log_enabled(BASIC): + log(BASIC, 'writing response to file for <%s>', self) + + target.writelines(self.response_to_json(raw=raw, indent=indent, sort=sort)) + target.close() + + def _fire_deferred(self, read_info=None): + # if read_info is None reads the schema and server info if not present, if False doesn't read server info, if True reads always server info + with self.connection_lock: + if self.lazy and not self._executing_deferred: + self._executing_deferred = True + + if log_enabled(BASIC): + log(BASIC, 'executing deferred (open: %s, start_tls: %s, bind: %s) for <%s>', self._deferred_open, self._deferred_start_tls, self._deferred_bind, self) + try: + if self._deferred_open: + self.open(read_server_info=False) + if self._deferred_start_tls: + if not self.start_tls(read_server_info=False): + error = 'deferred start_tls not successful' + (' - ' + self.last_error if self.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPStartTLSError(error) + if self._deferred_bind: + self.bind(read_server_info=False, controls=self._bind_controls) + if (read_info is None and (not self.server.info and self.server.get_info in [DSA, ALL]) or (not self.server.schema and self.server.get_info in [SCHEMA, ALL])) or read_info: + self.refresh_server_info() + except LDAPExceptionError as e: + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', e, self) + raise # re-raise LDAPExceptionError + finally: + self._executing_deferred = False + + @property + def entries(self): + if self.response: + if not self._entries: + self._entries = self._get_entries(self.response, self.request) + return self._entries + + def _get_entries(self, search_response, search_request): + with self.connection_lock: + from .. import ObjectDef, Reader + + # build a table of ObjectDefs, grouping the entries found in search_response for their attributes set, subset will be included in superset + attr_sets = [] + for response in search_response: + if response['type'] == 'searchResEntry': + resp_attr_set = set(response['attributes'].keys()) + if resp_attr_set not in attr_sets: + attr_sets.append(resp_attr_set) + attr_sets.sort(key=lambda x: -len(x)) # sorts the list in descending length order + unique_attr_sets = [] + for attr_set in attr_sets: + for unique_set in unique_attr_sets: + if unique_set >= attr_set: # checks if unique set is a superset of attr_set + break + else: # the attr_set is not a subset of any element in unique_attr_sets + unique_attr_sets.append(attr_set) + object_defs = [] + for attr_set in unique_attr_sets: + object_def = ObjectDef(schema=self.server.schema) + object_def += list(attr_set) # converts the set in a list to be added to the object definition + object_defs.append((attr_set, + object_def, + Reader(self, object_def, search_request['base'], search_request['filter'], attributes=attr_set) if self.strategy.sync else Reader(self, object_def, '', '', attributes=attr_set)) + ) # objects_defs contains a tuple with the set, the ObjectDef and a cursor + + entries = [] + for response in search_response: + if response['type'] == 'searchResEntry': + resp_attr_set = set(response['attributes'].keys()) + for object_def in object_defs: + if resp_attr_set <= object_def[0]: # finds the ObjectDef for the attribute set of this entry + entry = object_def[2]._create_entry(response) + entries.append(entry) + break + else: + self.last_error = 'attribute set not found for ' + str(resp_attr_set) + if log_enabled(ERROR): + log(ERROR, self.last_error, self) + raise LDAPObjectError(self.last_error) + + return entries diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/exceptions.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/exceptions.py new file mode 100644 index 0000000..f5d1e86 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/exceptions.py @@ -0,0 +1,608 @@ +""" +""" + +# Created on 2014.05.14 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import sep +from .results import RESULT_OPERATIONS_ERROR, RESULT_PROTOCOL_ERROR, RESULT_TIME_LIMIT_EXCEEDED, RESULT_SIZE_LIMIT_EXCEEDED, \ + RESULT_STRONGER_AUTH_REQUIRED, RESULT_REFERRAL, RESULT_ADMIN_LIMIT_EXCEEDED, RESULT_UNAVAILABLE_CRITICAL_EXTENSION, \ + RESULT_AUTH_METHOD_NOT_SUPPORTED, RESULT_UNDEFINED_ATTRIBUTE_TYPE, RESULT_NO_SUCH_ATTRIBUTE, \ + RESULT_SASL_BIND_IN_PROGRESS, RESULT_CONFIDENTIALITY_REQUIRED, RESULT_INAPPROPRIATE_MATCHING, \ + RESULT_CONSTRAINT_VIOLATION, \ + RESULT_ATTRIBUTE_OR_VALUE_EXISTS, RESULT_INVALID_ATTRIBUTE_SYNTAX, RESULT_NO_SUCH_OBJECT, RESULT_ALIAS_PROBLEM, \ + RESULT_INVALID_DN_SYNTAX, RESULT_ALIAS_DEREFERENCING_PROBLEM, RESULT_INVALID_CREDENTIALS, RESULT_LOOP_DETECTED, \ + RESULT_ENTRY_ALREADY_EXISTS, RESULT_LCUP_SECURITY_VIOLATION, RESULT_CANCELED, RESULT_E_SYNC_REFRESH_REQUIRED, \ + RESULT_NO_SUCH_OPERATION, RESULT_LCUP_INVALID_DATA, RESULT_OBJECT_CLASS_MODS_PROHIBITED, RESULT_NAMING_VIOLATION, \ + RESULT_INSUFFICIENT_ACCESS_RIGHTS, RESULT_OBJECT_CLASS_VIOLATION, RESULT_TOO_LATE, RESULT_CANNOT_CANCEL, \ + RESULT_LCUP_UNSUPPORTED_SCHEME, RESULT_BUSY, RESULT_AFFECT_MULTIPLE_DSAS, RESULT_UNAVAILABLE, \ + RESULT_NOT_ALLOWED_ON_NON_LEAF, \ + RESULT_UNWILLING_TO_PERFORM, RESULT_OTHER, RESULT_LCUP_RELOAD_REQUIRED, RESULT_ASSERTION_FAILED, \ + RESULT_AUTHORIZATION_DENIED, RESULT_LCUP_RESOURCES_EXHAUSTED, RESULT_NOT_ALLOWED_ON_RDN, \ + RESULT_INAPPROPRIATE_AUTHENTICATION +import socket + + +# LDAPException hierarchy +class LDAPException(Exception): + pass + + +class LDAPOperationResult(LDAPException): + def __new__(cls, result=None, description=None, dn=None, message=None, response_type=None, response=None): + if cls is LDAPOperationResult and result and result in exception_table: + exc = super(LDAPOperationResult, exception_table[result]).__new__( + exception_table[result]) # create an exception of the required result error + exc.result = result + exc.description = description + exc.dn = dn + exc.message = message + exc.type = response_type + exc.response = response + else: + exc = super(LDAPOperationResult, cls).__new__(cls) + return exc + + def __init__(self, result=None, description=None, dn=None, message=None, response_type=None, response=None): + self.result = result + self.description = description + self.dn = dn + self.message = message + self.type = response_type + self.response = response + + def __str__(self): + s = [self.__class__.__name__, + str(self.result) if self.result else None, + self.description if self.description else None, + self.dn if self.dn else None, + self.message if self.message else None, + self.type if self.type else None, + self.response if self.response else None] + + return ' - '.join([str(item) for item in s if s is not None]) + + def __repr__(self): + return self.__str__() + + +class LDAPOperationsErrorResult(LDAPOperationResult): + pass + + +class LDAPProtocolErrorResult(LDAPOperationResult): + pass + + +class LDAPTimeLimitExceededResult(LDAPOperationResult): + pass + + +class LDAPSizeLimitExceededResult(LDAPOperationResult): + pass + + +class LDAPAuthMethodNotSupportedResult(LDAPOperationResult): + pass + + +class LDAPStrongerAuthRequiredResult(LDAPOperationResult): + pass + + +class LDAPReferralResult(LDAPOperationResult): + pass + + +class LDAPAdminLimitExceededResult(LDAPOperationResult): + pass + + +class LDAPUnavailableCriticalExtensionResult(LDAPOperationResult): + pass + + +class LDAPConfidentialityRequiredResult(LDAPOperationResult): + pass + + +class LDAPSASLBindInProgressResult(LDAPOperationResult): + pass + + +class LDAPNoSuchAttributeResult(LDAPOperationResult): + pass + + +class LDAPUndefinedAttributeTypeResult(LDAPOperationResult): + pass + + +class LDAPInappropriateMatchingResult(LDAPOperationResult): + pass + + +class LDAPConstraintViolationResult(LDAPOperationResult): + pass + + +class LDAPAttributeOrValueExistsResult(LDAPOperationResult): + pass + + +class LDAPInvalidAttributeSyntaxResult(LDAPOperationResult): + pass + + +class LDAPNoSuchObjectResult(LDAPOperationResult): + pass + + +class LDAPAliasProblemResult(LDAPOperationResult): + pass + + +class LDAPInvalidDNSyntaxResult(LDAPOperationResult): + pass + + +class LDAPAliasDereferencingProblemResult(LDAPOperationResult): + pass + + +class LDAPInappropriateAuthenticationResult(LDAPOperationResult): + pass + + +class LDAPInvalidCredentialsResult(LDAPOperationResult): + pass + + +class LDAPInsufficientAccessRightsResult(LDAPOperationResult): + pass + + +class LDAPBusyResult(LDAPOperationResult): + pass + + +class LDAPUnavailableResult(LDAPOperationResult): + pass + + +class LDAPUnwillingToPerformResult(LDAPOperationResult): + pass + + +class LDAPLoopDetectedResult(LDAPOperationResult): + pass + + +class LDAPNamingViolationResult(LDAPOperationResult): + pass + + +class LDAPObjectClassViolationResult(LDAPOperationResult): + pass + + +class LDAPNotAllowedOnNotLeafResult(LDAPOperationResult): + pass + + +class LDAPNotAllowedOnRDNResult(LDAPOperationResult): + pass + + +class LDAPEntryAlreadyExistsResult(LDAPOperationResult): + pass + + +class LDAPObjectClassModsProhibitedResult(LDAPOperationResult): + pass + + +class LDAPAffectMultipleDSASResult(LDAPOperationResult): + pass + + +class LDAPOtherResult(LDAPOperationResult): + pass + + +class LDAPLCUPResourcesExhaustedResult(LDAPOperationResult): + pass + + +class LDAPLCUPSecurityViolationResult(LDAPOperationResult): + pass + + +class LDAPLCUPInvalidDataResult(LDAPOperationResult): + pass + + +class LDAPLCUPUnsupportedSchemeResult(LDAPOperationResult): + pass + + +class LDAPLCUPReloadRequiredResult(LDAPOperationResult): + pass + + +class LDAPCanceledResult(LDAPOperationResult): + pass + + +class LDAPNoSuchOperationResult(LDAPOperationResult): + pass + + +class LDAPTooLateResult(LDAPOperationResult): + pass + + +class LDAPCannotCancelResult(LDAPOperationResult): + pass + + +class LDAPAssertionFailedResult(LDAPOperationResult): + pass + + +class LDAPAuthorizationDeniedResult(LDAPOperationResult): + pass + + +class LDAPESyncRefreshRequiredResult(LDAPOperationResult): + pass + + +exception_table = {RESULT_OPERATIONS_ERROR: LDAPOperationsErrorResult, + RESULT_PROTOCOL_ERROR: LDAPProtocolErrorResult, + RESULT_TIME_LIMIT_EXCEEDED: LDAPTimeLimitExceededResult, + RESULT_SIZE_LIMIT_EXCEEDED: LDAPSizeLimitExceededResult, + RESULT_AUTH_METHOD_NOT_SUPPORTED: LDAPAuthMethodNotSupportedResult, + RESULT_STRONGER_AUTH_REQUIRED: LDAPStrongerAuthRequiredResult, + RESULT_REFERRAL: LDAPReferralResult, + RESULT_ADMIN_LIMIT_EXCEEDED: LDAPAdminLimitExceededResult, + RESULT_UNAVAILABLE_CRITICAL_EXTENSION: LDAPUnavailableCriticalExtensionResult, + RESULT_CONFIDENTIALITY_REQUIRED: LDAPConfidentialityRequiredResult, + RESULT_SASL_BIND_IN_PROGRESS: LDAPSASLBindInProgressResult, + RESULT_NO_SUCH_ATTRIBUTE: LDAPNoSuchAttributeResult, + RESULT_UNDEFINED_ATTRIBUTE_TYPE: LDAPUndefinedAttributeTypeResult, + RESULT_INAPPROPRIATE_MATCHING: LDAPInappropriateMatchingResult, + RESULT_CONSTRAINT_VIOLATION: LDAPConstraintViolationResult, + RESULT_ATTRIBUTE_OR_VALUE_EXISTS: LDAPAttributeOrValueExistsResult, + RESULT_INVALID_ATTRIBUTE_SYNTAX: LDAPInvalidAttributeSyntaxResult, + RESULT_NO_SUCH_OBJECT: LDAPNoSuchObjectResult, + RESULT_ALIAS_PROBLEM: LDAPAliasProblemResult, + RESULT_INVALID_DN_SYNTAX: LDAPInvalidDNSyntaxResult, + RESULT_ALIAS_DEREFERENCING_PROBLEM: LDAPAliasDereferencingProblemResult, + RESULT_INAPPROPRIATE_AUTHENTICATION: LDAPInappropriateAuthenticationResult, + RESULT_INVALID_CREDENTIALS: LDAPInvalidCredentialsResult, + RESULT_INSUFFICIENT_ACCESS_RIGHTS: LDAPInsufficientAccessRightsResult, + RESULT_BUSY: LDAPBusyResult, + RESULT_UNAVAILABLE: LDAPUnavailableResult, + RESULT_UNWILLING_TO_PERFORM: LDAPUnwillingToPerformResult, + RESULT_LOOP_DETECTED: LDAPLoopDetectedResult, + RESULT_NAMING_VIOLATION: LDAPNamingViolationResult, + RESULT_OBJECT_CLASS_VIOLATION: LDAPObjectClassViolationResult, + RESULT_NOT_ALLOWED_ON_NON_LEAF: LDAPNotAllowedOnNotLeafResult, + RESULT_NOT_ALLOWED_ON_RDN: LDAPNotAllowedOnRDNResult, + RESULT_ENTRY_ALREADY_EXISTS: LDAPEntryAlreadyExistsResult, + RESULT_OBJECT_CLASS_MODS_PROHIBITED: LDAPObjectClassModsProhibitedResult, + RESULT_AFFECT_MULTIPLE_DSAS: LDAPAffectMultipleDSASResult, + RESULT_OTHER: LDAPOtherResult, + RESULT_LCUP_RESOURCES_EXHAUSTED: LDAPLCUPResourcesExhaustedResult, + RESULT_LCUP_SECURITY_VIOLATION: LDAPLCUPSecurityViolationResult, + RESULT_LCUP_INVALID_DATA: LDAPLCUPInvalidDataResult, + RESULT_LCUP_UNSUPPORTED_SCHEME: LDAPLCUPUnsupportedSchemeResult, + RESULT_LCUP_RELOAD_REQUIRED: LDAPLCUPReloadRequiredResult, + RESULT_CANCELED: LDAPCanceledResult, + RESULT_NO_SUCH_OPERATION: LDAPNoSuchOperationResult, + RESULT_TOO_LATE: LDAPTooLateResult, + RESULT_CANNOT_CANCEL: LDAPCannotCancelResult, + RESULT_ASSERTION_FAILED: LDAPAssertionFailedResult, + RESULT_AUTHORIZATION_DENIED: LDAPAuthorizationDeniedResult, + RESULT_E_SYNC_REFRESH_REQUIRED: LDAPESyncRefreshRequiredResult} + + +class LDAPExceptionError(LDAPException): + pass + + +# configuration exceptions +class LDAPConfigurationError(LDAPExceptionError): + pass + + +class LDAPUnknownStrategyError(LDAPConfigurationError): + pass + + +class LDAPUnknownAuthenticationMethodError(LDAPConfigurationError): + pass + + +class LDAPSSLConfigurationError(LDAPConfigurationError): + pass + + +class LDAPDefinitionError(LDAPConfigurationError): + pass + + +class LDAPPackageUnavailableError(LDAPConfigurationError, ImportError): + pass + + +class LDAPConfigurationParameterError(LDAPConfigurationError): + pass + + +# abstract layer exceptions +class LDAPKeyError(LDAPExceptionError, KeyError, AttributeError): + pass + + +class LDAPObjectError(LDAPExceptionError, ValueError): + pass + + +class LDAPAttributeError(LDAPExceptionError, ValueError, TypeError): + pass + + +class LDAPCursorError(LDAPExceptionError): + pass + + +class LDAPCursorAttributeError(LDAPCursorError, AttributeError): + pass + + +class LDAPObjectDereferenceError(LDAPExceptionError): + pass + + +# security exceptions +class LDAPSSLNotSupportedError(LDAPExceptionError, ImportError): + pass + + +class LDAPInvalidTlsSpecificationError(LDAPExceptionError): + pass + + +class LDAPInvalidHashAlgorithmError(LDAPExceptionError, ValueError): + pass + +class LDAPSignatureVerificationFailedError(LDAPExceptionError): + pass + + +# connection exceptions +class LDAPBindError(LDAPExceptionError): + pass + + +class LDAPInvalidServerError(LDAPExceptionError): + pass + + +class LDAPSASLMechanismNotSupportedError(LDAPExceptionError): + pass + + +class LDAPConnectionIsReadOnlyError(LDAPExceptionError): + pass + + +class LDAPChangeError(LDAPExceptionError, ValueError): + pass + + +class LDAPServerPoolError(LDAPExceptionError): + pass + + +class LDAPServerPoolExhaustedError(LDAPExceptionError): + pass + + +class LDAPInvalidPortError(LDAPExceptionError): + pass + + +class LDAPStartTLSError(LDAPExceptionError): + pass + + +class LDAPCertificateError(LDAPExceptionError): + pass + + +class LDAPUserNameNotAllowedError(LDAPExceptionError): + pass + + +class LDAPUserNameIsMandatoryError(LDAPExceptionError): + pass + + +class LDAPPasswordIsMandatoryError(LDAPExceptionError): + pass + + +class LDAPInvalidFilterError(LDAPExceptionError): + pass + + +class LDAPInvalidScopeError(LDAPExceptionError, ValueError): + pass + + +class LDAPInvalidDereferenceAliasesError(LDAPExceptionError, ValueError): + pass + + +class LDAPInvalidValueError(LDAPExceptionError, ValueError): + pass + + +class LDAPControlError(LDAPExceptionError, ValueError): + pass + + +class LDAPExtensionError(LDAPExceptionError, ValueError): + pass + + +class LDAPLDIFError(LDAPExceptionError): + pass + + +class LDAPSchemaError(LDAPExceptionError): + pass + + +class LDAPSASLPrepError(LDAPExceptionError): + pass + + +class LDAPSASLBindInProgressError(LDAPExceptionError): + pass + + +class LDAPMetricsError(LDAPExceptionError): + pass + + +class LDAPObjectClassError(LDAPExceptionError): + pass + + +class LDAPInvalidDnError(LDAPExceptionError): + pass + + +class LDAPResponseTimeoutError(LDAPExceptionError): + pass + + +class LDAPTransactionError(LDAPExceptionError): + pass + + +class LDAPInfoError(LDAPExceptionError): + pass + + +# communication exceptions +class LDAPCommunicationError(LDAPExceptionError): + pass + + +class LDAPSocketOpenError(LDAPCommunicationError): + pass + + +class LDAPSocketCloseError(LDAPCommunicationError): + pass + + +class LDAPSocketReceiveError(LDAPCommunicationError, socket.error): + pass + + +class LDAPSocketSendError(LDAPCommunicationError, socket.error): + pass + + +class LDAPSessionTerminatedByServerError(LDAPCommunicationError): + pass + + +class LDAPUnknownResponseError(LDAPCommunicationError): + pass + + +class LDAPUnknownRequestError(LDAPCommunicationError): + pass + + +class LDAPReferralError(LDAPCommunicationError): + pass + + +# pooling exceptions +class LDAPConnectionPoolNameIsMandatoryError(LDAPExceptionError): + pass + + +class LDAPConnectionPoolNotStartedError(LDAPExceptionError): + pass + + +# restartable strategy +class LDAPMaximumRetriesError(LDAPExceptionError): + def __str__(self): + s = [] + if self.args: + if isinstance(self.args, tuple): + if len(self.args) > 0: + s.append('LDAPMaximumRetriesError: ' + str(self.args[0])) + if len(self.args) > 1: + s.append('Exception history:') + prev_exc = '' + for i, exc in enumerate(self.args[1]): # args[1] contains exception history + # if str(exc[1]) != prev_exc: + # s.append((str(i).rjust(5) + ' ' + str(exc[0]) + ': ' + str(exc[1]) + ' - ' + str(exc[2]))) + # prev_exc = str(exc[1]) + if str(exc) != prev_exc: + s.append((str(i).rjust(5) + ' ' + str(type(exc)) + ': ' + str(exc))) + prev_exc = str(exc) + if len(self.args) > 2: + s.append('Maximum number of retries reached: ' + str(self.args[2])) + else: + s = [LDAPExceptionError.__str__(self)] + + return sep.join(s) + + +# exception factories +def communication_exception_factory(exc_to_raise, exc): + """ + Generates a new exception class of the requested type (subclass of LDAPCommunication) merged with the exception raised by the interpreter + """ + if exc_to_raise.__name__ in [cls.__name__ for cls in LDAPCommunicationError.__subclasses__()]: + return type(exc_to_raise.__name__, (exc_to_raise, type(exc)), dict()) + else: + raise LDAPExceptionError('unable to generate exception type ' + str(exc_to_raise)) + + +def start_tls_exception_factory(exc): + """ + Generates a new exception class of the requested type merged with the exception raised by the interpreter + """ + return type(LDAPStartTLSError.__name__, (LDAPStartTLSError, type(exc)), dict()) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/pooling.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/pooling.py new file mode 100644 index 0000000..24a5b0f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/pooling.py @@ -0,0 +1,329 @@ +""" +""" + +# Created on 2014.03.14 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime, MINYEAR +from os import linesep +from random import randint +from time import sleep + +from .. import FIRST, ROUND_ROBIN, RANDOM, SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from .exceptions import LDAPUnknownStrategyError, LDAPServerPoolError, LDAPServerPoolExhaustedError +from .server import Server +from ..utils.log import log, log_enabled, ERROR, BASIC, NETWORK + +POOLING_STRATEGIES = [FIRST, ROUND_ROBIN, RANDOM] + + +class ServerState(object): + def __init__(self, server, last_checked_time, available): + self.server = server + self.last_checked_time = last_checked_time + self.available = available + + +class ServerPoolState(object): + def __init__(self, server_pool): + self.server_states = [] # each element is a ServerState + self.strategy = server_pool.strategy + self.server_pool = server_pool + self.last_used_server = 0 + self.refresh() + self.initialize_time = datetime.now() + + if log_enabled(BASIC): + log(BASIC, 'instantiated ServerPoolState: <%r>', self) + + def __str__(self): + s = 'servers: ' + linesep + if self.server_states: + for state in self.server_states: + s += str(state.server) + linesep + else: + s += 'None' + linesep + s += 'Pool strategy: ' + str(self.strategy) + linesep + s += ' - Last used server: ' + ('None' if self.last_used_server == -1 else str(self.server_states[self.last_used_server].server)) + + return s + + def refresh(self): + self.server_states = [] + for server in self.server_pool.servers: + self.server_states.append(ServerState(server, datetime(MINYEAR, 1, 1), True)) # server, smallest date ever, supposed available + self.last_used_server = randint(0, len(self.server_states) - 1) + + def get_current_server(self): + return self.server_states[self.last_used_server].server + + def get_server(self): + if self.server_states: + if self.server_pool.strategy == FIRST: + if self.server_pool.active: + # returns the first active server + self.last_used_server = self.find_active_server(starting=0) + else: + # returns always the first server - no pooling + self.last_used_server = 0 + elif self.server_pool.strategy == ROUND_ROBIN: + if self.server_pool.active: + # returns the next active server in a circular range + self.last_used_server = self.find_active_server(self.last_used_server + 1) + else: + # returns the next server in a circular range + self.last_used_server = self.last_used_server + 1 if (self.last_used_server + 1) < len(self.server_states) else 0 + elif self.server_pool.strategy == RANDOM: + if self.server_pool.active: + self.last_used_server = self.find_active_random_server() + else: + # returns a random server in the pool + self.last_used_server = randint(0, len(self.server_states) - 1) + else: + if log_enabled(ERROR): + log(ERROR, 'unknown server pooling strategy <%s>', self.server_pool.strategy) + raise LDAPUnknownStrategyError('unknown server pooling strategy') + if log_enabled(BASIC): + log(BASIC, 'server returned from Server Pool: <%s>', self.last_used_server) + return self.server_states[self.last_used_server].server + else: + if log_enabled(ERROR): + log(ERROR, 'no servers in Server Pool <%s>', self) + raise LDAPServerPoolError('no servers in server pool') + + def find_active_random_server(self): + counter = self.server_pool.active # can be True for "forever" or the number of cycles to try + while counter: + if log_enabled(NETWORK): + log(NETWORK, 'entering loop for finding active server in pool <%s>', self) + temp_list = self.server_states[:] # copy + while temp_list: + # pops a random server from a temp list and checks its + # availability, if not available tries another one + server_state = temp_list.pop(randint(0, len(temp_list) - 1)) + if not server_state.available: # server is offline + if (isinstance(self.server_pool.exhaust, bool) and self.server_pool.exhaust) or (datetime.now() - server_state.last_checked_time).seconds < self.server_pool.exhaust: # keeps server offline + if log_enabled(NETWORK): + log(NETWORK, 'server <%s> excluded from checking because it is offline', server_state.server) + continue + if log_enabled(NETWORK): + log(NETWORK, 'server <%s> reinserted in pool', server_state.server) + server_state.last_checked_time = datetime.now() + if log_enabled(NETWORK): + log(NETWORK, 'checking server <%s> for availability', server_state.server) + if server_state.server.check_availability(): + # returns a random active server in the pool + server_state.available = True + return self.server_states.index(server_state) + else: + server_state.available = False + if not isinstance(self.server_pool.active, bool): + counter -= 1 + if log_enabled(ERROR): + log(ERROR, 'no random active server available in Server Pool <%s> after maximum number of tries', self) + raise LDAPServerPoolExhaustedError('no random active server available in server pool after maximum number of tries') + + def find_active_server(self, starting): + conf_pool_timeout = get_config_parameter('POOLING_LOOP_TIMEOUT') + counter = self.server_pool.active # can be True for "forever" or the number of cycles to try + if starting >= len(self.server_states): + starting = 0 + + while counter: + if log_enabled(NETWORK): + log(NETWORK, 'entering loop number <%s> for finding active server in pool <%s>', counter, self) + index = -1 + pool_size = len(self.server_states) + while index < pool_size - 1: + index += 1 + offset = index + starting if index + starting < pool_size else index + starting - pool_size + server_state = self.server_states[offset] + if not server_state.available: # server is offline + if (isinstance(self.server_pool.exhaust, bool) and self.server_pool.exhaust) or (datetime.now() - server_state.last_checked_time).seconds < self.server_pool.exhaust: # keeps server offline + if log_enabled(NETWORK): + if isinstance(self.server_pool.exhaust, bool): + log(NETWORK, 'server <%s> excluded from checking because is offline', server_state.server) + else: + log(NETWORK, 'server <%s> excluded from checking because is offline for %d seconds', server_state.server, (self.server_pool.exhaust - (datetime.now() - server_state.last_checked_time).seconds)) + continue + if log_enabled(NETWORK): + log(NETWORK, 'server <%s> reinserted in pool', server_state.server) + server_state.last_checked_time = datetime.now() + if log_enabled(NETWORK): + log(NETWORK, 'checking server <%s> for availability', server_state.server) + if server_state.server.check_availability(): + server_state.available = True + return offset + else: + server_state.available = False # sets server offline + + if not isinstance(self.server_pool.active, bool): + counter -= 1 + if log_enabled(NETWORK): + log(NETWORK, 'waiting for %d seconds before retrying pool servers cycle', conf_pool_timeout) + sleep(conf_pool_timeout) + + if log_enabled(ERROR): + log(ERROR, 'no active server available in Server Pool <%s> after maximum number of tries', self) + raise LDAPServerPoolExhaustedError('no active server available in server pool after maximum number of tries') + + def __len__(self): + return len(self.server_states) + + +class ServerPool(object): + def __init__(self, + servers=None, + pool_strategy=ROUND_ROBIN, + active=True, + exhaust=False, + single_state=True): + + if pool_strategy not in POOLING_STRATEGIES: + if log_enabled(ERROR): + log(ERROR, 'unknown pooling strategy <%s>', pool_strategy) + raise LDAPUnknownStrategyError('unknown pooling strategy') + if exhaust and not active: + if log_enabled(ERROR): + log(ERROR, 'cannot instantiate pool with exhaust and not active') + raise LDAPServerPoolError('pools can be exhausted only when checking for active servers') + self.servers = [] + self.pool_states = dict() + self.active = active + self.exhaust = exhaust + self.single = single_state + self._pool_state = None # used for storing the global state of the pool + if isinstance(servers, SEQUENCE_TYPES + (Server, )): + self.add(servers) + elif isinstance(servers, STRING_TYPES): + self.add(Server(servers)) + self.strategy = pool_strategy + + if log_enabled(BASIC): + log(BASIC, 'instantiated ServerPool: <%r>', self) + + def __str__(self): + s = 'servers: ' + linesep + if self.servers: + for server in self.servers: + s += str(server) + linesep + else: + s += 'None' + linesep + s += 'Pool strategy: ' + str(self.strategy) + s += ' - ' + 'active: ' + (str(self.active) if self.active else 'False') + s += ' - ' + 'exhaust pool: ' + (str(self.exhaust) if self.exhaust else 'False') + return s + + def __repr__(self): + r = 'ServerPool(servers=' + if self.servers: + r += '[' + for server in self.servers: + r += server.__repr__() + ', ' + r = r[:-2] + ']' + else: + r += 'None' + r += ', pool_strategy={0.strategy!r}'.format(self) + r += ', active={0.active!r}'.format(self) + r += ', exhaust={0.exhaust!r}'.format(self) + r += ')' + + return r + + def __len__(self): + return len(self.servers) + + def __getitem__(self, item): + return self.servers[item] + + def __iter__(self): + return self.servers.__iter__() + + def add(self, servers): + if isinstance(servers, Server): + if servers not in self.servers: + self.servers.append(servers) + elif isinstance(servers, STRING_TYPES): + self.servers.append(Server(servers)) + elif isinstance(servers, SEQUENCE_TYPES): + for server in servers: + if isinstance(server, Server): + self.servers.append(server) + elif isinstance(server, STRING_TYPES): + self.servers.append(Server(server)) + else: + if log_enabled(ERROR): + log(ERROR, 'element must be a server in Server Pool <%s>', self) + raise LDAPServerPoolError('server in ServerPool must be a Server') + else: + if log_enabled(ERROR): + log(ERROR, 'server must be a Server of a list of Servers when adding to Server Pool <%s>', self) + raise LDAPServerPoolError('server must be a Server or a list of Server') + + if self.single: + if self._pool_state: + self._pool_state.refresh() + else: + for connection in self.pool_states: + # notifies connections using this pool to refresh + self.pool_states[connection].refresh() + + def remove(self, server): + if server in self.servers: + self.servers.remove(server) + else: + if log_enabled(ERROR): + log(ERROR, 'server %s to be removed not in Server Pool <%s>', server, self) + raise LDAPServerPoolError('server not in server pool') + + if self.single: + if self._pool_state: + self._pool_state.refresh() + else: + for connection in self.pool_states: + # notifies connections using this pool to refresh + self.pool_states[connection].refresh() + + def initialize(self, connection): + # registers pool_state in ServerPool object + if self.single: + if not self._pool_state: + self._pool_state = ServerPoolState(self) + self.pool_states[connection] = self._pool_state + else: + self.pool_states[connection] = ServerPoolState(self) + + def get_server(self, connection): + if connection in self.pool_states: + return self.pool_states[connection].get_server() + else: + if log_enabled(ERROR): + log(ERROR, 'connection <%s> not in Server Pool State <%s>', connection, self) + raise LDAPServerPoolError('connection not in ServerPoolState') + + def get_current_server(self, connection): + if connection in self.pool_states: + return self.pool_states[connection].get_current_server() + else: + if log_enabled(ERROR): + log(ERROR, 'connection <%s> not in Server Pool State <%s>', connection, self) + raise LDAPServerPoolError('connection not in ServerPoolState') diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/rdns.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/rdns.py new file mode 100644 index 0000000..b3bbe6a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/rdns.py @@ -0,0 +1,68 @@ +""" Utilities and constants related to reverse dns lookup """ + +# Created on 2020.09.16 +# +# Author: Azaria Zornberg +# +# Copyright 2020 Giovanni Cannata +# Copyright 2020 Azaria Zornberg +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket + + +class ReverseDnsSetting(object): + OFF = 0, + REQUIRE_RESOLVE_ALL_ADDRESSES = 1, + REQUIRE_RESOLVE_IP_ADDRESSES_ONLY = 2, + OPTIONAL_RESOLVE_ALL_ADDRESSES = 3, + OPTIONAL_RESOLVE_IP_ADDRESSES_ONLY = 4, + SUPPORTED_VALUES = {OFF, REQUIRE_RESOLVE_ALL_ADDRESSES, REQUIRE_RESOLVE_IP_ADDRESSES_ONLY, + OPTIONAL_RESOLVE_ALL_ADDRESSES, OPTIONAL_RESOLVE_IP_ADDRESSES_ONLY} + + +def get_hostname_by_addr(addr, success_required=True): + """ Resolve the hostname for an ip address. If success is required, raise an exception if a hostname cannot + be resolved for the address. + Returns the hostname resolved for the address. + If success is not required, returns None for addresses that do not resolve to hostnames. + """ + try: + return socket.gethostbyaddr(addr)[0] + except Exception as ex: + # if we need to succeed, just re-raise + if success_required: + raise + return None + + +def is_ip_addr(addr): + """Returns True if an address is an ipv4 address or an ipv6 address based on format. False otherwise.""" + for addr_type in [socket.AF_INET, socket.AF_INET6]: + try: + socket.inet_pton(addr_type, addr) # not present on python 2.7 on Windows + return True + except AttributeError: # not present on Windows, always valid + if '.' in addr and any([c.isalpha() for c in addr.replace('.', '')]): # not an IPv4 address, probably an hostname + return False + else: # do not check for ipv6 + return True + except OSError: + pass + + return False diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/results.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/results.py new file mode 100644 index 0000000..14f8f73 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/results.py @@ -0,0 +1,137 @@ +""" +""" + +# Created on 2016.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +# result codes +RESULT_SUCCESS = 0 +RESULT_OPERATIONS_ERROR = 1 +RESULT_PROTOCOL_ERROR = 2 +RESULT_TIME_LIMIT_EXCEEDED = 3 +RESULT_SIZE_LIMIT_EXCEEDED = 4 +RESULT_COMPARE_FALSE = 5 +RESULT_COMPARE_TRUE = 6 +RESULT_AUTH_METHOD_NOT_SUPPORTED = 7 +RESULT_STRONGER_AUTH_REQUIRED = 8 +RESULT_RESERVED = 9 +RESULT_REFERRAL = 10 +RESULT_ADMIN_LIMIT_EXCEEDED = 11 +RESULT_UNAVAILABLE_CRITICAL_EXTENSION = 12 +RESULT_CONFIDENTIALITY_REQUIRED = 13 +RESULT_SASL_BIND_IN_PROGRESS = 14 +RESULT_NO_SUCH_ATTRIBUTE = 16 +RESULT_UNDEFINED_ATTRIBUTE_TYPE = 17 +RESULT_INAPPROPRIATE_MATCHING = 18 +RESULT_CONSTRAINT_VIOLATION = 19 +RESULT_ATTRIBUTE_OR_VALUE_EXISTS = 20 +RESULT_INVALID_ATTRIBUTE_SYNTAX = 21 +RESULT_NO_SUCH_OBJECT = 32 +RESULT_ALIAS_PROBLEM = 33 +RESULT_INVALID_DN_SYNTAX = 34 +RESULT_ALIAS_DEREFERENCING_PROBLEM = 36 +RESULT_INAPPROPRIATE_AUTHENTICATION = 48 +RESULT_INVALID_CREDENTIALS = 49 +RESULT_INSUFFICIENT_ACCESS_RIGHTS = 50 +RESULT_BUSY = 51 +RESULT_UNAVAILABLE = 52 +RESULT_UNWILLING_TO_PERFORM = 53 +RESULT_LOOP_DETECTED = 54 +RESULT_NAMING_VIOLATION = 64 +RESULT_OBJECT_CLASS_VIOLATION = 65 +RESULT_NOT_ALLOWED_ON_NON_LEAF = 66 +RESULT_NOT_ALLOWED_ON_RDN = 67 +RESULT_ENTRY_ALREADY_EXISTS = 68 +RESULT_OBJECT_CLASS_MODS_PROHIBITED = 69 +RESULT_AFFECT_MULTIPLE_DSAS = 71 +RESULT_OTHER = 80 +RESULT_LCUP_RESOURCES_EXHAUSTED = 113 +RESULT_LCUP_SECURITY_VIOLATION = 114 +RESULT_LCUP_INVALID_DATA = 115 +RESULT_LCUP_UNSUPPORTED_SCHEME = 116 +RESULT_LCUP_RELOAD_REQUIRED = 117 +RESULT_CANCELED = 118 +RESULT_NO_SUCH_OPERATION = 119 +RESULT_TOO_LATE = 120 +RESULT_CANNOT_CANCEL = 121 +RESULT_ASSERTION_FAILED = 122 +RESULT_AUTHORIZATION_DENIED = 123 +RESULT_E_SYNC_REFRESH_REQUIRED = 4096 + +RESULT_CODES = { + RESULT_SUCCESS: 'success', + RESULT_OPERATIONS_ERROR: 'operationsError', + RESULT_PROTOCOL_ERROR: 'protocolError', + RESULT_TIME_LIMIT_EXCEEDED: 'timeLimitExceeded', + RESULT_SIZE_LIMIT_EXCEEDED: 'sizeLimitExceeded', + RESULT_COMPARE_FALSE: 'compareFalse', + RESULT_COMPARE_TRUE: 'compareTrue', + RESULT_AUTH_METHOD_NOT_SUPPORTED: 'authMethodNotSupported', + RESULT_RESERVED: 'reserved', + RESULT_STRONGER_AUTH_REQUIRED: 'strongerAuthRequired', + RESULT_REFERRAL: 'referral', + RESULT_ADMIN_LIMIT_EXCEEDED: 'adminLimitExceeded', + RESULT_UNAVAILABLE_CRITICAL_EXTENSION: 'unavailableCriticalExtension', + RESULT_CONFIDENTIALITY_REQUIRED: 'confidentialityRequired', + RESULT_SASL_BIND_IN_PROGRESS: 'saslBindInProgress', + RESULT_NO_SUCH_ATTRIBUTE: 'noSuchAttribute', + RESULT_UNDEFINED_ATTRIBUTE_TYPE: 'undefinedAttributeType', + RESULT_INAPPROPRIATE_MATCHING: 'inappropriateMatching', + RESULT_CONSTRAINT_VIOLATION: 'constraintViolation', + RESULT_ATTRIBUTE_OR_VALUE_EXISTS: 'attributeOrValueExists', + RESULT_INVALID_ATTRIBUTE_SYNTAX: 'invalidAttributeSyntax', + RESULT_NO_SUCH_OBJECT: 'noSuchObject', + RESULT_ALIAS_PROBLEM: 'aliasProblem', + RESULT_INVALID_DN_SYNTAX: 'invalidDNSyntax', + RESULT_ALIAS_DEREFERENCING_PROBLEM: 'aliasDereferencingProblem', + RESULT_INAPPROPRIATE_AUTHENTICATION: 'inappropriateAuthentication', + RESULT_INVALID_CREDENTIALS: 'invalidCredentials', + RESULT_INSUFFICIENT_ACCESS_RIGHTS: 'insufficientAccessRights', + RESULT_BUSY: 'busy', + RESULT_UNAVAILABLE: 'unavailable', + RESULT_UNWILLING_TO_PERFORM: 'unwillingToPerform', + RESULT_LOOP_DETECTED: 'loopDetected', + RESULT_NAMING_VIOLATION: 'namingViolation', + RESULT_OBJECT_CLASS_VIOLATION: 'objectClassViolation', + RESULT_NOT_ALLOWED_ON_NON_LEAF: 'notAllowedOnNonLeaf', + RESULT_NOT_ALLOWED_ON_RDN: 'notAllowedOnRDN', + RESULT_ENTRY_ALREADY_EXISTS: 'entryAlreadyExists', + RESULT_OBJECT_CLASS_MODS_PROHIBITED: 'objectClassModsProhibited', + RESULT_AFFECT_MULTIPLE_DSAS: 'affectMultipleDSAs', + RESULT_OTHER: 'other', + RESULT_LCUP_RESOURCES_EXHAUSTED: 'lcupResourcesExhausted', + RESULT_LCUP_SECURITY_VIOLATION: 'lcupSecurityViolation', + RESULT_LCUP_INVALID_DATA: 'lcupInvalidData', + RESULT_LCUP_UNSUPPORTED_SCHEME: 'lcupUnsupportedScheme', + RESULT_LCUP_RELOAD_REQUIRED: 'lcupReloadRequired', + RESULT_CANCELED: 'canceled', + RESULT_NO_SUCH_OPERATION: 'noSuchOperation', + RESULT_TOO_LATE: 'tooLate', + RESULT_CANNOT_CANCEL: 'cannotCancel', + RESULT_ASSERTION_FAILED: 'assertionFailed', + RESULT_AUTHORIZATION_DENIED: 'authorizationDenied', + RESULT_E_SYNC_REFRESH_REQUIRED: 'e-syncRefreshRequired' +} + +# do not raise exception for (in raise_exceptions connection mode) +DO_NOT_RAISE_EXCEPTIONS = [RESULT_SUCCESS, RESULT_COMPARE_FALSE, RESULT_COMPARE_TRUE, RESULT_REFERRAL, RESULT_SASL_BIND_IN_PROGRESS, RESULT_SIZE_LIMIT_EXCEEDED, RESULT_TIME_LIMIT_EXCEEDED] diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/server.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/server.py new file mode 100644 index 0000000..41ff2af --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/server.py @@ -0,0 +1,682 @@ +""" +""" + +# Created on 2014.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket +from threading import Lock +from datetime import datetime, MINYEAR + +from .. import DSA, SCHEMA, ALL, BASE, get_config_parameter, OFFLINE_EDIR_8_8_8, OFFLINE_EDIR_9_1_4, OFFLINE_AD_2012_R2, OFFLINE_SLAPD_2_4, OFFLINE_DS389_1_3_3, SEQUENCE_TYPES, IP_SYSTEM_DEFAULT, IP_V4_ONLY, IP_V6_ONLY, IP_V4_PREFERRED, IP_V6_PREFERRED, STRING_TYPES +from .exceptions import LDAPInvalidServerError, LDAPDefinitionError, LDAPInvalidPortError, LDAPInvalidTlsSpecificationError, LDAPSocketOpenError, LDAPInfoError +from ..protocol.formatters.standard import format_attribute_values +from ..protocol.rfc4511 import LDAP_MAX_INT +from ..protocol.rfc4512 import SchemaInfo, DsaInfo +from .tls import Tls +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, NETWORK +from ..utils.conv import to_unicode +from ..utils.port_validators import check_port, check_port_and_port_list + +try: + from urllib.parse import unquote # Python 3 +except ImportError: + from urllib import unquote # Python 2 + +try: # try to discover if unix sockets are available for LDAP over IPC (ldapi:// scheme) + # noinspection PyUnresolvedReferences + from socket import AF_UNIX + unix_socket_available = True +except ImportError: + unix_socket_available = False + + +class Server(object): + """ + LDAP Server definition class + + Allowed_referral_hosts can be None (default), or a list of tuples of + allowed servers ip address or names to contact while redirecting + search to referrals. + + The second element of the tuple is a boolean to indicate if + authentication to that server is allowed; if False only anonymous + bind will be used. + + Per RFC 4516. Use [('*', False)] to allow any host with anonymous + bind, use [('*', True)] to allow any host with same authentication of + Server. + """ + + _message_counter = 0 + _message_id_lock = Lock() # global lock for message_id shared by all Server objects + + def __init__(self, + host, + port=None, + use_ssl=False, + allowed_referral_hosts=None, + get_info=SCHEMA, + tls=None, + formatter=None, + connect_timeout=None, + mode=IP_V6_PREFERRED, + validator=None): + + self.ipc = False + url_given = False + host = host.strip() + if host.lower().startswith('ldap://'): + self.host = host[7:] + use_ssl = False + url_given = True + elif host.lower().startswith('ldaps://'): + self.host = host[8:] + use_ssl = True + url_given = True + elif host.lower().startswith('ldapi://') and unix_socket_available: + self.ipc = True + use_ssl = False + url_given = True + elif host.lower().startswith('ldapi://') and not unix_socket_available: + raise LDAPSocketOpenError('LDAP over IPC not available - UNIX sockets non present') + else: + self.host = host + + if self.ipc: + if str is bytes: # Python 2 + self.host = unquote(host[7:]).decode('utf-8') + else: # Python 3 + self.host = unquote(host[7:]) # encoding defaults to utf-8 in python3 + self.port = None + elif ':' in self.host and self.host.count(':') == 1: + hostname, _, hostport = self.host.partition(':') + try: + port = int(hostport) or port + except ValueError: + if log_enabled(ERROR): + log(ERROR, 'port <%s> must be an integer', port) + raise LDAPInvalidPortError('port must be an integer') + self.host = hostname + elif url_given and self.host.startswith('['): + hostname, sep, hostport = self.host[1:].partition(']') + if sep != ']' or not self._is_ipv6(hostname): + if log_enabled(ERROR): + log(ERROR, 'invalid IPv6 server address for <%s>', self.host) + raise LDAPInvalidServerError() + if len(hostport): + if not hostport.startswith(':'): + if log_enabled(ERROR): + log(ERROR, 'invalid URL in server name for <%s>', self.host) + raise LDAPInvalidServerError('invalid URL in server name') + if not hostport[1:].isdecimal(): + if log_enabled(ERROR): + log(ERROR, 'port must be an integer for <%s>', self.host) + raise LDAPInvalidPortError('port must be an integer') + port = int(hostport[1:]) + self.host = hostname + elif not url_given and self._is_ipv6(self.host): + pass + elif self.host.count(':') > 1: + if log_enabled(ERROR): + log(ERROR, 'invalid server address for <%s>', self.host) + raise LDAPInvalidServerError() + + if not self.ipc: + self.host.rstrip('/') + if not use_ssl and not port: + port = 389 + elif use_ssl and not port: + port = 636 + + port_err = check_port(port) + if port_err: + if log_enabled(ERROR): + log(ERROR, port_err) + raise LDAPInvalidPortError(port_err) + self.port = port + + if allowed_referral_hosts is None: # defaults to any server with authentication + allowed_referral_hosts = [('*', True)] + + if isinstance(allowed_referral_hosts, SEQUENCE_TYPES): + self.allowed_referral_hosts = [] + for referral_host in allowed_referral_hosts: + if isinstance(referral_host, tuple): + if isinstance(referral_host[1], bool): + self.allowed_referral_hosts.append(referral_host) + elif isinstance(allowed_referral_hosts, tuple): + if isinstance(allowed_referral_hosts[1], bool): + self.allowed_referral_hosts = [allowed_referral_hosts] + else: + self.allowed_referral_hosts = [] + + self.ssl = True if use_ssl else False + if tls and not isinstance(tls, Tls): + if log_enabled(ERROR): + log(ERROR, 'invalid tls specification: <%s>', tls) + raise LDAPInvalidTlsSpecificationError('invalid Tls object') + + self.tls = Tls() if self.ssl and not tls else tls + + if not self.ipc: + if self._is_ipv6(self.host): + self.name = ('ldaps' if self.ssl else 'ldap') + '://[' + self.host + ']:' + str(self.port) + else: + self.name = ('ldaps' if self.ssl else 'ldap') + '://' + self.host + ':' + str(self.port) + else: + self.name = host + + self.get_info = get_info + self._dsa_info = None + self._schema_info = None + self.dit_lock = Lock() + self.custom_formatter = formatter + self.custom_validator = validator + self._address_info = [] # property self.address_info resolved at open time (or when check_availability is called) + self._address_info_resolved_time = datetime(MINYEAR, 1, 1) # smallest date ever + self.current_address = None + self.connect_timeout = connect_timeout + self.mode = mode + + self.get_info_from_server(None) # load offline schema if needed + + if log_enabled(BASIC): + log(BASIC, 'instantiated Server: <%r>', self) + + @staticmethod + def _is_ipv6(host): + try: + socket.inet_pton(socket.AF_INET6, host) + except (socket.error, AttributeError, ValueError): + return False + return True + + def __str__(self): + if self.host: + s = self.name + (' - ssl' if self.ssl else ' - cleartext') + (' - unix socket' if self.ipc else '') + else: + s = object.__str__(self) + return s + + def __repr__(self): + r = 'Server(host={0.host!r}, port={0.port!r}, use_ssl={0.ssl!r}'.format(self) + r += '' if not self.allowed_referral_hosts else ', allowed_referral_hosts={0.allowed_referral_hosts!r}'.format(self) + r += '' if self.tls is None else ', tls={0.tls!r}'.format(self) + r += '' if not self.get_info else ', get_info={0.get_info!r}'.format(self) + r += '' if not self.connect_timeout else ', connect_timeout={0.connect_timeout!r}'.format(self) + r += '' if not self.mode else ', mode={0.mode!r}'.format(self) + r += ')' + + return r + + @property + def address_info(self): + conf_refresh_interval = get_config_parameter('ADDRESS_INFO_REFRESH_TIME') + if not self._address_info or (datetime.now() - self._address_info_resolved_time).seconds > conf_refresh_interval: + # converts addresses tuple to list and adds a 6th parameter for availability (None = not checked, True = available, False=not available) and a 7th parameter for the checking time + addresses = None + try: + if self.ipc: + addresses = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, None, self.host, None)] + else: + if self.mode == IP_V4_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) + elif self.mode == IP_V6_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) + else: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) + except (socket.gaierror, AttributeError): + pass + + if not addresses: # if addresses not found or raised an exception (for example for bad flags) tries again without flags + try: + if self.mode == IP_V4_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) + elif self.mode == IP_V6_ONLY: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP) + else: + addresses = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP) + except socket.gaierror: + pass + + if addresses: + self._address_info = [list(address) + [None, None] for address in addresses] + self._address_info_resolved_time = datetime.now() + else: + self._address_info = [] + self._address_info_resolved_time = datetime(MINYEAR, 1, 1) # smallest date + + if log_enabled(BASIC): + for address in self._address_info: + log(BASIC, 'address for <%s> resolved as <%r>', self, address[:-2]) + return self._address_info + + def update_availability(self, address, available): + cont = 0 + while cont < len(self._address_info): + if self.address_info[cont] == address: + self._address_info[cont][5] = True if available else False + self._address_info[cont][6] = datetime.now() + break + cont += 1 + + def reset_availability(self): + for address in self._address_info: + address[5] = None + address[6] = None + + def check_availability(self, source_address=None, source_port=None, source_port_list=None): + """ + Tries to open, connect and close a socket to specified address and port to check availability. + Timeout in seconds is specified in CHECK_AVAILABITY_TIMEOUT if not specified in + the Server object. + If specified, use a specific address, port, or list of possible ports, when attempting to check availability. + NOTE: This will only consider multiple ports from the source port list if the first ones we try to bind to are + already in use. This will not attempt using different ports in the list if the server is unavailable, + as that could result in the runtime of check_availability significantly exceeding the connection timeout. + """ + source_port_err = check_port_and_port_list(source_port, source_port_list) + if source_port_err: + if log_enabled(ERROR): + log(ERROR, source_port_err) + raise LDAPInvalidPortError(source_port_err) + + # using an empty string to bind a socket means "use the default as if this wasn't provided" because socket + # binding requires that you pass something for the ip if you want to pass a specific port + bind_address = source_address if source_address is not None else '' + # using 0 as the source port to bind a socket means "use the default behavior of picking a random port from + # all ports as if this wasn't provided" because socket binding requires that you pass something for the port + # if you want to pass a specific ip + candidate_bind_ports = [0] + + # if we have either a source port or source port list, convert that into our candidate list + if source_port is not None: + candidate_bind_ports = [source_port] + elif source_port_list is not None: + candidate_bind_ports = source_port_list[:] + + conf_availability_timeout = get_config_parameter('CHECK_AVAILABILITY_TIMEOUT') + available = False + self.reset_availability() + for address in self.candidate_addresses(): + available = True + try: + temp_socket = socket.socket(*address[:3]) + + # Go through our candidate bind ports and try to bind our socket to our source address with them. + # if no source address or ports were specified, this will have the same success/fail result as if we + # tried to connect to the remote server without binding locally first. + # This is actually a little bit better, as it lets us distinguish the case of "issue binding the socket + # locally" from "remote server is unavailable" with more clarity, though this will only really be an + # issue when no source address/port is specified if the system checking server availability is running + # as a very unprivileged user. + last_bind_exc = None + socket_bind_succeeded = False + for bind_port in candidate_bind_ports: + try: + temp_socket.bind((bind_address, bind_port)) + socket_bind_succeeded = True + break + except Exception as bind_ex: + last_bind_exc = bind_ex + if log_enabled(NETWORK): + log(NETWORK, 'Unable to bind to local address <%s> with source port <%s> due to <%s>', + bind_address, bind_port, bind_ex) + if not socket_bind_succeeded: + if log_enabled(ERROR): + log(ERROR, 'Unable to locally bind to local address <%s> with any of the source ports <%s> due to <%s>', + bind_address, candidate_bind_ports, last_bind_exc) + raise LDAPSocketOpenError('Unable to bind socket locally to address {} with any of the source ports {} due to {}' + .format(bind_address, candidate_bind_ports, last_bind_exc)) + + if self.connect_timeout: + temp_socket.settimeout(self.connect_timeout) + else: + temp_socket.settimeout(conf_availability_timeout) # set timeout for checking availability to default + try: + temp_socket.connect(address[4]) + except socket.error: + available = False + finally: + try: + temp_socket.shutdown(socket.SHUT_RDWR) + except socket.error: + available = False + finally: + temp_socket.close() + except socket.gaierror: + available = False + + if available: + if log_enabled(BASIC): + log(BASIC, 'server <%s> available at <%r>', self, address) + self.update_availability(address, True) + break # if an available address is found exits immediately + else: + self.update_availability(address, False) + if log_enabled(ERROR): + log(ERROR, 'server <%s> not available at <%r>', self, address) + + return available + + @staticmethod + def next_message_id(): + """ + LDAP messageId is unique for all connections to same server + """ + with Server._message_id_lock: + Server._message_counter += 1 + if Server._message_counter >= LDAP_MAX_INT: + Server._message_counter = 1 + if log_enabled(PROTOCOL): + log(PROTOCOL, 'new message id <%d> generated', Server._message_counter) + + return Server._message_counter + + def _get_dsa_info(self, connection): + """ + Retrieve DSE operational attribute as per RFC4512 (5.1). + """ + if connection.strategy.no_real_dsa: # do not try for mock strategies + return + + if not connection.strategy.pooled: # in pooled strategies get_dsa_info is performed by the worker threads + result = connection.search(search_base='', + search_filter='(objectClass=*)', + search_scope=BASE, + attributes=['altServer', # requests specific dsa info attributes + 'namingContexts', + 'supportedControl', + 'supportedExtension', + 'supportedFeatures', + 'supportedCapabilities', + 'supportedLdapVersion', + 'supportedSASLMechanisms', + 'vendorName', + 'vendorVersion', + 'subschemaSubentry', + '*', + '+'], # requests all remaining attributes (other), + get_operational_attributes=True) + + if connection.strategy.thread_safe: + status, result, response, _ = result + else: + status = result + result = connection.result + response = connection.response + + with self.dit_lock: + if connection.strategy.sync: # sync request + self._dsa_info = DsaInfo(response[0]['attributes'], response[0]['raw_attributes']) if status else self._dsa_info + elif status: # asynchronous request, must check if attributes in response + results, _ = connection.get_response(status) + if len(results) == 1 and 'attributes' in results[0] and 'raw_attributes' in results[0]: + self._dsa_info = DsaInfo(results[0]['attributes'], results[0]['raw_attributes']) + + if log_enabled(BASIC): + log(BASIC, 'DSA info read for <%s> via <%s>', self, connection) + + def _get_schema_info(self, connection, entry=''): + """ + Retrieve schema from subschemaSubentry DSE attribute, per RFC + 4512 (4.4 and 5.1); entry = '' means DSE. + """ + if connection.strategy.no_real_dsa: # do not try for mock strategies + return + + schema_entry = None + if self._dsa_info and entry == '': # subschemaSubentry already present in dsaInfo + if isinstance(self._dsa_info.schema_entry, SEQUENCE_TYPES): + schema_entry = self._dsa_info.schema_entry[0] if self._dsa_info.schema_entry else None + else: + schema_entry = self._dsa_info.schema_entry if self._dsa_info.schema_entry else None + else: + result = connection.search(entry, '(objectClass=*)', BASE, attributes=['subschemaSubentry'], get_operational_attributes=True) + if connection.strategy.thread_safe: + status, result, response, _ = result + else: + status = result + result = connection.result + response = connection.response + if connection.strategy.sync: # sync request + if status and 'subschemaSubentry' in response[0]['raw_attributes']: + if len(response[0]['raw_attributes']['subschemaSubentry']) > 0: + schema_entry = response[0]['raw_attributes']['subschemaSubentry'][0] + else: # asynchronous request, must check if subschemaSubentry in attributes + results, _ = connection.get_response(status) + if len(results) == 1 and 'raw_attributes' in results[0] and 'subschemaSubentry' in results[0]['attributes']: + if len(results[0]['raw_attributes']['subschemaSubentry']) > 0: + schema_entry = results[0]['raw_attributes']['subschemaSubentry'][0] + + if schema_entry and not connection.strategy.pooled: # in pooled strategies get_schema_info is performed by the worker threads + if isinstance(schema_entry, bytes) and str is not bytes: # Python 3 + schema_entry = to_unicode(schema_entry, from_server=True) + result = connection.search(schema_entry, + search_filter='(objectClass=subschema)', + search_scope=BASE, + attributes=['objectClasses', # requests specific subschema attributes + 'attributeTypes', + 'ldapSyntaxes', + 'matchingRules', + 'matchingRuleUse', + 'dITContentRules', + 'dITStructureRules', + 'nameForms', + 'createTimestamp', + 'modifyTimestamp', + '*'], # requests all remaining attributes (other) + get_operational_attributes=True + ) + if connection.strategy.thread_safe: + status, result, response, _ = result + else: + status = result + result = connection.result + response = connection.response + with self.dit_lock: + self._schema_info = None + if status: + if connection.strategy.sync: # sync request + self._schema_info = SchemaInfo(schema_entry, response[0]['attributes'], response[0]['raw_attributes']) + else: # asynchronous request, must check if attributes in response + results, result = connection.get_response(status) + if len(results) == 1 and 'attributes' in results[0] and 'raw_attributes' in results[0]: + self._schema_info = SchemaInfo(schema_entry, results[0]['attributes'], results[0]['raw_attributes']) + if self._schema_info and not self._schema_info.is_valid(): # flaky servers can return an empty schema, checks if it is so and set schema to None + self._schema_info = None + if self._schema_info: # if schema is valid tries to apply formatter to the "other" dict with raw values for schema and info + for attribute in self._schema_info.other: + self._schema_info.other[attribute] = format_attribute_values(self._schema_info, attribute, self._schema_info.raw[attribute], self.custom_formatter) + if self._dsa_info: # try to apply formatter to the "other" dict with dsa info raw values + for attribute in self._dsa_info.other: + self._dsa_info.other[attribute] = format_attribute_values(self._schema_info, attribute, self._dsa_info.raw[attribute], self.custom_formatter) + if log_enabled(BASIC): + log(BASIC, 'schema read for <%s> via <%s>', self, connection) + + def get_info_from_server(self, connection): + """ + reads info from DSE and from subschema + """ + if connection and not connection.closed: + if self.get_info in [DSA, ALL]: + self._get_dsa_info(connection) + if self.get_info in [SCHEMA, ALL]: + self._get_schema_info(connection) + elif self.get_info == OFFLINE_EDIR_8_8_8: + from ..protocol.schemas.edir888 import edir_8_8_8_schema, edir_8_8_8_dsa_info + self.attach_schema_info(SchemaInfo.from_json(edir_8_8_8_schema)) + self.attach_dsa_info(DsaInfo.from_json(edir_8_8_8_dsa_info)) + elif self.get_info == OFFLINE_EDIR_9_1_4: + from ..protocol.schemas.edir914 import edir_9_1_4_schema, edir_9_1_4_dsa_info + self.attach_schema_info(SchemaInfo.from_json(edir_9_1_4_schema)) + self.attach_dsa_info(DsaInfo.from_json(edir_9_1_4_dsa_info)) + elif self.get_info == OFFLINE_AD_2012_R2: + from ..protocol.schemas.ad2012R2 import ad_2012_r2_schema, ad_2012_r2_dsa_info + self.attach_schema_info(SchemaInfo.from_json(ad_2012_r2_schema)) + self.attach_dsa_info(DsaInfo.from_json(ad_2012_r2_dsa_info)) + elif self.get_info == OFFLINE_SLAPD_2_4: + from ..protocol.schemas.slapd24 import slapd_2_4_schema, slapd_2_4_dsa_info + self.attach_schema_info(SchemaInfo.from_json(slapd_2_4_schema)) + self.attach_dsa_info(DsaInfo.from_json(slapd_2_4_dsa_info)) + elif self.get_info == OFFLINE_DS389_1_3_3: + from ..protocol.schemas.ds389 import ds389_1_3_3_schema, ds389_1_3_3_dsa_info + self.attach_schema_info(SchemaInfo.from_json(ds389_1_3_3_schema)) + self.attach_dsa_info(DsaInfo.from_json(ds389_1_3_3_dsa_info)) + + def attach_dsa_info(self, dsa_info=None): + if isinstance(dsa_info, DsaInfo): + self._dsa_info = dsa_info + if log_enabled(BASIC): + log(BASIC, 'attached DSA info to Server <%s>', self) + + def attach_schema_info(self, dsa_schema=None): + if isinstance(dsa_schema, SchemaInfo): + self._schema_info = dsa_schema + if log_enabled(BASIC): + log(BASIC, 'attached schema info to Server <%s>', self) + + @property + def info(self): + return self._dsa_info + + @property + def schema(self): + return self._schema_info + + @staticmethod + def from_definition(host, dsa_info, dsa_schema, port=None, use_ssl=False, formatter=None, validator=None): + """ + Define a dummy server with preloaded schema and info + :param host: host name + :param dsa_info: DsaInfo preloaded object or a json formatted string or a file name + :param dsa_schema: SchemaInfo preloaded object or a json formatted string or a file name + :param port: fake port + :param use_ssl: use_ssl + :param formatter: custom formatters + :return: Server object + """ + if isinstance(host, SEQUENCE_TYPES): + dummy = Server(host=host[0], port=port, use_ssl=use_ssl, formatter=formatter, validator=validator, get_info=ALL) # for ServerPool object + else: + dummy = Server(host=host, port=port, use_ssl=use_ssl, formatter=formatter, validator=validator, get_info=ALL) + if isinstance(dsa_info, DsaInfo): + dummy._dsa_info = dsa_info + elif isinstance(dsa_info, STRING_TYPES): + try: + dummy._dsa_info = DsaInfo.from_json(dsa_info) # tries to use dsa_info as a json configuration string + except Exception: + dummy._dsa_info = DsaInfo.from_file(dsa_info) # tries to use dsa_info as a file name + + if not dummy.info: + if log_enabled(ERROR): + log(ERROR, 'invalid DSA info for %s', host) + raise LDAPDefinitionError('invalid dsa info') + + if isinstance(dsa_schema, SchemaInfo): + dummy._schema_info = dsa_schema + elif isinstance(dsa_schema, STRING_TYPES): + try: + dummy._schema_info = SchemaInfo.from_json(dsa_schema) + except Exception: + dummy._schema_info = SchemaInfo.from_file(dsa_schema) + + if not dummy.schema: + if log_enabled(ERROR): + log(ERROR, 'invalid schema info for %s', host) + raise LDAPDefinitionError('invalid schema info') + + if log_enabled(BASIC): + log(BASIC, 'created server <%s> from definition', dummy) + + return dummy + + def candidate_addresses(self): + conf_reset_availability_timeout = get_config_parameter('RESET_AVAILABILITY_TIMEOUT') + if self.ipc: + candidates = self.address_info + if log_enabled(BASIC): + log(BASIC, 'candidate address for <%s>: <%s> with mode UNIX_SOCKET', self, self.name) + else: + # checks reset availability timeout + for address in self.address_info: + if address[6] and ((datetime.now() - address[6]).seconds > conf_reset_availability_timeout): + address[5] = None + address[6] = None + + # selects server address based on server mode and availability (in address[5]) + addresses = self.address_info[:] # copy to avoid refreshing while searching candidates + candidates = [] + if addresses: + if self.mode == IP_SYSTEM_DEFAULT: + candidates.append(addresses[0]) + elif self.mode == IP_V4_ONLY: + candidates = [address for address in addresses if address[0] == socket.AF_INET and (address[5] or address[5] is None)] + elif self.mode == IP_V6_ONLY: + candidates = [address for address in addresses if address[0] == socket.AF_INET6 and (address[5] or address[5] is None)] + elif self.mode == IP_V4_PREFERRED: + candidates = [address for address in addresses if address[0] == socket.AF_INET and (address[5] or address[5] is None)] + candidates += [address for address in addresses if address[0] == socket.AF_INET6 and (address[5] or address[5] is None)] + elif self.mode == IP_V6_PREFERRED: + candidates = [address for address in addresses if address[0] == socket.AF_INET6 and (address[5] or address[5] is None)] + candidates += [address for address in addresses if address[0] == socket.AF_INET and (address[5] or address[5] is None)] + else: + if log_enabled(ERROR): + log(ERROR, 'invalid server mode for <%s>', self) + raise LDAPInvalidServerError('invalid server mode') + + if log_enabled(BASIC): + for candidate in candidates: + log(BASIC, 'obtained candidate address for <%s>: <%r> with mode %s', self, candidate[:-2], self.mode) + return candidates + + def _check_info_property(self, kind, name): + if not self._dsa_info: + raise LDAPInfoError('server info not loaded') + + if kind == 'control': + properties = self.info.supported_controls + elif kind == 'extension': + properties = self.info.supported_extensions + elif kind == 'feature': + properties = self.info.supported_features + else: + raise LDAPInfoError('invalid info category') + + for prop in properties: + if name == prop[0] or (prop[2] and name.lower() == prop[2].lower()): # checks oid and description + return True + + return False + + def has_control(self, control): + return self._check_info_property('control', control) + + def has_extension(self, extension): + return self._check_info_property('extension', extension) + + def has_feature(self, feature): + return self._check_info_property('feature', feature) + + + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/timezone.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/timezone.py new file mode 100644 index 0000000..0c24a77 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/timezone.py @@ -0,0 +1,56 @@ +""" +""" + +# Created on 2015.01.07 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import timedelta, tzinfo + + +# from python standard library docs +class OffsetTzInfo(tzinfo): + """Fixed offset in minutes east from UTC""" + + def __init__(self, offset, name): + self.offset = offset + self.name = name + self._offset = timedelta(minutes=offset) + + def __str__(self): + return self.name + + def __repr__(self): + + return 'OffsetTzInfo(offset={0.offset!r}, name={0.name!r})'.format(self) + + def utcoffset(self, dt): + return self._offset + + def tzname(self, dt): + return self.name + + # noinspection PyMethodMayBeStatic + def dst(self, dt): + return timedelta(0) + + def __getinitargs__(self): # for pickling/unpickling + return self.offset, self.name diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/tls.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/tls.py new file mode 100644 index 0000000..ca8592b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/tls.py @@ -0,0 +1,327 @@ +""" +""" + +# Created on 2013.08.05 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .exceptions import LDAPSSLNotSupportedError, LDAPSSLConfigurationError, LDAPCertificateError, start_tls_exception_factory, LDAPStartTLSError +from .. import SEQUENCE_TYPES +from ..utils.log import log, log_enabled, ERROR, BASIC, NETWORK + +try: + # noinspection PyUnresolvedReferences + import ssl +except ImportError: + if log_enabled(ERROR): + log(ERROR, 'SSL not supported in this Python interpreter') + raise LDAPSSLNotSupportedError('SSL not supported in this Python interpreter') + +try: + from ssl import match_hostname, CertificateError # backport for python2 missing ssl functionalities +except ImportError: + from ..utils.tls_backport import CertificateError + from ..utils.tls_backport import match_hostname + if log_enabled(BASIC): + log(BASIC, 'using tls_backport') + +try: # try to use SSLContext + # noinspection PyUnresolvedReferences + from ssl import create_default_context, Purpose # defined in Python 3.4 and Python 2.7.9 + use_ssl_context = True +except ImportError: + use_ssl_context = False + if log_enabled(BASIC): + log(BASIC, 'SSLContext unavailable') + +from os import path + + +# noinspection PyProtectedMember +class Tls(object): + """ + tls/ssl configuration for Server object + Starting from python 2.7.9 and python 3.4 uses the SSLContext object + that tries to read the CAs defined at system level + ca_certs_path and ca_certs_data are valid only when using SSLContext + local_private_key_password is valid only when using SSLContext + ssl_options is valid only when using SSLContext + sni is the server name for Server Name Indication (when available) + """ + + def __init__(self, + local_private_key_file=None, + local_certificate_file=None, + validate=ssl.CERT_NONE, + version=None, + ssl_options=None, + ca_certs_file=None, + valid_names=None, + ca_certs_path=None, + ca_certs_data=None, + local_private_key_password=None, + ciphers=None, + sni=None): + if ssl_options is None: + ssl_options = [] + self.ssl_options = ssl_options + if validate in [ssl.CERT_NONE, ssl.CERT_OPTIONAL, ssl.CERT_REQUIRED]: + self.validate = validate + elif validate: + if log_enabled(ERROR): + log(ERROR, 'invalid validate parameter <%s>', validate) + raise LDAPSSLConfigurationError('invalid validate parameter') + if ca_certs_file and path.exists(ca_certs_file): + self.ca_certs_file = ca_certs_file + elif ca_certs_file: + if log_enabled(ERROR): + log(ERROR, 'invalid CA public key file <%s>', ca_certs_file) + raise LDAPSSLConfigurationError('invalid CA public key file') + else: + self.ca_certs_file = None + + if ca_certs_path and use_ssl_context and path.exists(ca_certs_path): + self.ca_certs_path = ca_certs_path + elif ca_certs_path and not use_ssl_context: + if log_enabled(ERROR): + log(ERROR, 'cannot use CA public keys path, SSLContext not available') + raise LDAPSSLNotSupportedError('cannot use CA public keys path, SSLContext not available') + elif ca_certs_path: + if log_enabled(ERROR): + log(ERROR, 'invalid CA public keys path <%s>', ca_certs_path) + raise LDAPSSLConfigurationError('invalid CA public keys path') + else: + self.ca_certs_path = None + + if ca_certs_data and use_ssl_context: + self.ca_certs_data = ca_certs_data + elif ca_certs_data: + if log_enabled(ERROR): + log(ERROR, 'cannot use CA data, SSLContext not available') + raise LDAPSSLNotSupportedError('cannot use CA data, SSLContext not available') + else: + self.ca_certs_data = None + + if local_private_key_password and use_ssl_context: + self.private_key_password = local_private_key_password + elif local_private_key_password: + if log_enabled(ERROR): + log(ERROR, 'cannot use local private key password, SSLContext not available') + raise LDAPSSLNotSupportedError('cannot use local private key password, SSLContext is not available') + else: + self.private_key_password = None + + self.version = version + self.private_key_file = local_private_key_file + self.certificate_file = local_certificate_file + self.valid_names = valid_names + self.ciphers = ciphers + self.sni = sni + + if log_enabled(BASIC): + log(BASIC, 'instantiated Tls: <%r>' % self) + + def __str__(self): + s = [ + 'protocol: ' + str(self.version), + 'client private key: ' + ('present ' if self.private_key_file else 'not present'), + 'client certificate: ' + ('present ' if self.certificate_file else 'not present'), + 'private key password: ' + ('present ' if self.private_key_password else 'not present'), + 'CA certificates file: ' + ('present ' if self.ca_certs_file else 'not present'), + 'CA certificates path: ' + ('present ' if self.ca_certs_path else 'not present'), + 'CA certificates data: ' + ('present ' if self.ca_certs_data else 'not present'), + 'verify mode: ' + str(self.validate), + 'valid names: ' + str(self.valid_names), + 'ciphers: ' + str(self.ciphers), + 'sni: ' + str(self.sni) + ] + return ' - '.join(s) + + def __repr__(self): + r = '' if self.private_key_file is None else ', local_private_key_file={0.private_key_file!r}'.format(self) + r += '' if self.certificate_file is None else ', local_certificate_file={0.certificate_file!r}'.format(self) + r += '' if self.validate is None else ', validate={0.validate!r}'.format(self) + r += '' if self.version is None else ', version={0.version!r}'.format(self) + r += '' if self.ca_certs_file is None else ', ca_certs_file={0.ca_certs_file!r}'.format(self) + r += '' if self.ca_certs_path is None else ', ca_certs_path={0.ca_certs_path!r}'.format(self) + r += '' if self.ca_certs_data is None else ', ca_certs_data={0.ca_certs_data!r}'.format(self) + r += '' if self.ciphers is None else ', ciphers={0.ciphers!r}'.format(self) + r += '' if self.sni is None else ', sni={0.sni!r}'.format(self) + r = 'Tls(' + r[2:] + ')' + return r + + def wrap_socket(self, connection, do_handshake=False): + """ + Adds TLS to the connection socket + """ + if use_ssl_context: + if self.version is None: # uses the default ssl context for reasonable security + ssl_context = create_default_context(purpose=Purpose.SERVER_AUTH, + cafile=self.ca_certs_file, + capath=self.ca_certs_path, + cadata=self.ca_certs_data) + else: # code from create_default_context in the Python standard library 3.5.1, creates a ssl context with the specificd protocol version + ssl_context = ssl.SSLContext(self.version) + if self.ca_certs_file or self.ca_certs_path or self.ca_certs_data: + ssl_context.load_verify_locations(self.ca_certs_file, self.ca_certs_path, self.ca_certs_data) + elif self.validate != ssl.CERT_NONE: + ssl_context.load_default_certs(Purpose.SERVER_AUTH) + + if self.certificate_file: + ssl_context.load_cert_chain(self.certificate_file, keyfile=self.private_key_file, password=self.private_key_password) + ssl_context.check_hostname = False + ssl_context.verify_mode = self.validate + for option in self.ssl_options: + ssl_context.options |= option + + if self.ciphers: + try: + ssl_context.set_ciphers(self.ciphers) + except ssl.SSLError: + pass + + if self.sni: + wrapped_socket = ssl_context.wrap_socket(connection.socket, server_side=False, do_handshake_on_connect=do_handshake, server_hostname=self.sni) + else: + wrapped_socket = ssl_context.wrap_socket(connection.socket, server_side=False, do_handshake_on_connect=do_handshake) + if log_enabled(NETWORK): + log(NETWORK, 'socket wrapped with SSL using SSLContext for <%s>', connection) + else: + if self.version is None and hasattr(ssl, 'PROTOCOL_SSLv23'): + self.version = ssl.PROTOCOL_SSLv23 + if self.ciphers: + try: + + wrapped_socket = ssl.wrap_socket(connection.socket, + keyfile=self.private_key_file, + certfile=self.certificate_file, + server_side=False, + cert_reqs=self.validate, + ssl_version=self.version, + ca_certs=self.ca_certs_file, + do_handshake_on_connect=do_handshake, + ciphers=self.ciphers) + except ssl.SSLError: + raise + except TypeError: # in python2.6 no ciphers argument is present, failback to self.ciphers=None + self.ciphers = None + + if not self.ciphers: + wrapped_socket = ssl.wrap_socket(connection.socket, + keyfile=self.private_key_file, + certfile=self.certificate_file, + server_side=False, + cert_reqs=self.validate, + ssl_version=self.version, + ca_certs=self.ca_certs_file, + do_handshake_on_connect=do_handshake) + if log_enabled(NETWORK): + log(NETWORK, 'socket wrapped with SSL for <%s>', connection) + + if do_handshake and (self.validate == ssl.CERT_REQUIRED or self.validate == ssl.CERT_OPTIONAL): + check_hostname(wrapped_socket, connection.server.host, self.valid_names) + + connection.socket = wrapped_socket + return + + def start_tls(self, connection): + if connection.server.ssl: # ssl already established at server level + return False + + if (connection.tls_started and not connection._executing_deferred) or connection.strategy._outstanding or connection.sasl_in_progress: + # Per RFC 4513 (3.1.1) + if log_enabled(ERROR): + log(ERROR, "can't start tls because operations are in progress for <%s>", self) + return False + connection.starting_tls = True + if log_enabled(BASIC): + log(BASIC, 'starting tls for <%s>', connection) + if not connection.strategy.sync: + connection._awaiting_for_async_start_tls = True # some flaky servers (OpenLDAP) doesn't return the extended response name in response + result = connection.extended('1.3.6.1.4.1.1466.20037') + if not connection.strategy.sync: + # asynchronous - _start_tls must be executed by the strategy + response = connection.get_response(result) + if response != (None, None): + if log_enabled(BASIC): + log(BASIC, 'tls started for <%s>', connection) + return True + else: + if log_enabled(BASIC): + log(BASIC, 'tls not started for <%s>', connection) + return False + else: + if connection.result['description'] not in ['success']: + # startTLS failed + connection.last_error = 'startTLS failed - ' + str(connection.result['description']) + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', connection.last_error, connection) + raise LDAPStartTLSError(connection.last_error) + if log_enabled(BASIC): + log(BASIC, 'tls started for <%s>', connection) + return self._start_tls(connection) + + def _start_tls(self, connection): + try: + self.wrap_socket(connection, do_handshake=True) + except Exception as e: + connection.last_error = 'wrap socket error: ' + str(e) + if log_enabled(ERROR): + log(ERROR, 'error <%s> wrapping socket for TLS in <%s>', connection.last_error, connection) + raise start_tls_exception_factory(e)(connection.last_error) + finally: + connection.starting_tls = False + + if connection.usage: + connection._usage.wrapped_sockets += 1 + connection.tls_started = True + return True + + +def check_hostname(sock, server_name, additional_names): + server_certificate = sock.getpeercert() + if log_enabled(NETWORK): + log(NETWORK, 'certificate found for %s: %s', sock, server_certificate) + if additional_names: + host_names = [server_name] + (additional_names if isinstance(additional_names, SEQUENCE_TYPES) else [additional_names]) + else: + host_names = [server_name] + + for host_name in host_names: + if not host_name: + continue + elif host_name == '*': + if log_enabled(NETWORK): + log(NETWORK, 'certificate matches * wildcard') + return # valid + + try: + match_hostname(server_certificate, host_name) # raise CertificateError if certificate doesn't match server name + if log_enabled(NETWORK): + log(NETWORK, 'certificate matches host name <%s>', host_name) + return # valid + except CertificateError as e: + if log_enabled(NETWORK): + log(NETWORK, str(e)) + + if log_enabled(ERROR): + log(ERROR, "hostname doesn't match certificate") + raise LDAPCertificateError("certificate %s doesn't match any name in %s " % (server_certificate, str(host_names))) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/usage.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/usage.py new file mode 100644 index 0000000..7748c76 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/core/usage.py @@ -0,0 +1,229 @@ +""" +""" + +# Created on 2014.03.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime, timedelta +from os import linesep + +from .exceptions import LDAPMetricsError +from ..utils.log import log, log_enabled, ERROR, BASIC + + +class ConnectionUsage(object): + """ + Collect statistics on connection usage + """ + + def reset(self): + self.open_sockets = 0 + self.closed_sockets = 0 + self.wrapped_sockets = 0 + self.bytes_transmitted = 0 + self.bytes_received = 0 + self.messages_transmitted = 0 + self.messages_received = 0 + self.operations = 0 + self.abandon_operations = 0 + self.add_operations = 0 + self.bind_operations = 0 + self.compare_operations = 0 + self.delete_operations = 0 + self.extended_operations = 0 + self.modify_operations = 0 + self.modify_dn_operations = 0 + self.search_operations = 0 + self.unbind_operations = 0 + self.referrals_received = 0 + self.referrals_followed = 0 + self.referrals_connections = 0 + self.restartable_failures = 0 + self.restartable_successes = 0 + self.servers_from_pool = 0 + if log_enabled(BASIC): + log(BASIC, 'reset usage metrics') + + def __init__(self): + self.initial_connection_start_time = None + self.open_socket_start_time = None + self.connection_stop_time = None + self.last_transmitted_time = None + self.last_received_time = None + self.open_sockets = 0 + self.closed_sockets = 0 + self.wrapped_sockets = 0 + self.bytes_transmitted = 0 + self.bytes_received = 0 + self.messages_transmitted = 0 + self.messages_received = 0 + self.operations = 0 + self.abandon_operations = 0 + self.add_operations = 0 + self.bind_operations = 0 + self.compare_operations = 0 + self.delete_operations = 0 + self.extended_operations = 0 + self.modify_operations = 0 + self.modify_dn_operations = 0 + self.search_operations = 0 + self.unbind_operations = 0 + self.referrals_received = 0 + self.referrals_followed = 0 + self.referrals_connections = 0 + self.restartable_failures = 0 + self.restartable_successes = 0 + self.servers_from_pool = 0 + + if log_enabled(BASIC): + log(BASIC, 'instantiated Usage object') + + def __repr__(self): + r = 'Connection Usage:' + linesep + r += ' Time: [elapsed: ' + str(self.elapsed_time) + ']' + linesep + r += ' Initial start time: ' + (str(self.initial_connection_start_time.isoformat()) if self.initial_connection_start_time else '') + linesep + r += ' Open socket time: ' + (str(self.open_socket_start_time.isoformat()) if self.open_socket_start_time else '') + linesep + r += ' Last transmitted time: ' + (str(self.last_transmitted_time.isoformat()) if self.last_transmitted_time else '') + linesep + r += ' Last received time: ' + (str(self.last_received_time.isoformat()) if self.last_received_time else '') + linesep + r += ' Close socket time: ' + (str(self.connection_stop_time.isoformat()) if self.connection_stop_time else '') + linesep + r += ' Server:' + linesep + r += ' Servers from pool: ' + str(self.servers_from_pool) + linesep + r += ' Sockets open: ' + str(self.open_sockets) + linesep + r += ' Sockets closed: ' + str(self.closed_sockets) + linesep + r += ' Sockets wrapped: ' + str(self.wrapped_sockets) + linesep + r += ' Bytes: ' + str(self.bytes_transmitted + self.bytes_received) + linesep + r += ' Transmitted: ' + str(self.bytes_transmitted) + linesep + r += ' Received: ' + str(self.bytes_received) + linesep + r += ' Messages: ' + str(self.messages_transmitted + self.messages_received) + linesep + r += ' Transmitted: ' + str(self.messages_transmitted) + linesep + r += ' Received: ' + str(self.messages_received) + linesep + r += ' Operations: ' + str(self.operations) + linesep + r += ' Abandon: ' + str(self.abandon_operations) + linesep + r += ' Bind: ' + str(self.bind_operations) + linesep + r += ' Add: ' + str(self.add_operations) + linesep + r += ' Compare: ' + str(self.compare_operations) + linesep + r += ' Delete: ' + str(self.delete_operations) + linesep + r += ' Extended: ' + str(self.extended_operations) + linesep + r += ' Modify: ' + str(self.modify_operations) + linesep + r += ' ModifyDn: ' + str(self.modify_dn_operations) + linesep + r += ' Search: ' + str(self.search_operations) + linesep + r += ' Unbind: ' + str(self.unbind_operations) + linesep + r += ' Referrals: ' + linesep + r += ' Received: ' + str(self.referrals_received) + linesep + r += ' Followed: ' + str(self.referrals_followed) + linesep + r += ' Connections: ' + str(self.referrals_connections) + linesep + r += ' Restartable tries: ' + str(self.restartable_failures + self.restartable_successes) + linesep + r += ' Failed restarts: ' + str(self.restartable_failures) + linesep + r += ' Successful restarts: ' + str(self.restartable_successes) + linesep + return r + + def __str__(self): + return self.__repr__() + + def __iadd__(self, other): + if not isinstance(other, ConnectionUsage): + raise LDAPMetricsError('unable to add to ConnectionUsage') + + self.open_sockets += other.open_sockets + self.closed_sockets += other.closed_sockets + self.wrapped_sockets += other.wrapped_sockets + self.bytes_transmitted += other.bytes_transmitted + self.bytes_received += other.bytes_received + self.messages_transmitted += other.messages_transmitted + self.messages_received += other.messages_received + self.operations += other.operations + self.abandon_operations += other.abandon_operations + self.add_operations += other.add_operations + self.bind_operations += other.bind_operations + self.compare_operations += other.compare_operations + self.delete_operations += other.delete_operations + self.extended_operations += other.extended_operations + self.modify_operations += other.modify_operations + self.modify_dn_operations += other.modify_dn_operations + self.search_operations += other.search_operations + self.unbind_operations += other.unbind_operations + self.referrals_received += other.referrals_received + self.referrals_followed += other.referrals_followed + self.referrals_connections += other.referrals_connections + self.restartable_failures += other.restartable_failures + self.restartable_successes += other.restartable_successes + self.servers_from_pool += other.servers_from_pool + return self + + def update_transmitted_message(self, message, length): + self.last_transmitted_time = datetime.now() + self.bytes_transmitted += length + self.operations += 1 + self.messages_transmitted += 1 + if message['type'] == 'abandonRequest': + self.abandon_operations += 1 + elif message['type'] == 'addRequest': + self.add_operations += 1 + elif message['type'] == 'bindRequest': + self.bind_operations += 1 + elif message['type'] == 'compareRequest': + self.compare_operations += 1 + elif message['type'] == 'delRequest': + self.delete_operations += 1 + elif message['type'] == 'extendedReq': + self.extended_operations += 1 + elif message['type'] == 'modifyRequest': + self.modify_operations += 1 + elif message['type'] == 'modDNRequest': + self.modify_dn_operations += 1 + elif message['type'] == 'searchRequest': + self.search_operations += 1 + elif message['type'] == 'unbindRequest': + self.unbind_operations += 1 + else: + if log_enabled(ERROR): + log(ERROR, 'unable to collect usage for unknown message type <%s>', message['type']) + raise LDAPMetricsError('unable to collect usage for unknown message type') + + def update_received_message(self, length): + self.last_received_time = datetime.now() + self.bytes_received += length + self.messages_received += 1 + + def start(self, reset=True): + if reset: + self.reset() + self.open_socket_start_time = datetime.now() + self.connection_stop_time = None + if not self.initial_connection_start_time: + self.initial_connection_start_time = self.open_socket_start_time + + if log_enabled(BASIC): + log(BASIC, 'start collecting usage metrics') + + def stop(self): + if self.open_socket_start_time: + self.connection_stop_time = datetime.now() + if log_enabled(BASIC): + log(BASIC, 'stop collecting usage metrics') + + @property + def elapsed_time(self): + if self.connection_stop_time: + return self.connection_stop_time - self.open_socket_start_time + else: + return (datetime.now() - self.open_socket_start_time) if self.open_socket_start_time else timedelta(0) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__init__.py new file mode 100644 index 0000000..b359be5 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__init__.py @@ -0,0 +1,334 @@ +""" +""" + +# Created on 2014.04.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep + +from .. import SUBTREE, DEREF_ALWAYS, ALL_ATTRIBUTES, DEREF_NEVER +from .microsoft.dirSync import DirSync +from .microsoft.modifyPassword import ad_modify_password +from .microsoft.unlockAccount import ad_unlock_account +from .microsoft.addMembersToGroups import ad_add_members_to_groups +from .microsoft.removeMembersFromGroups import ad_remove_members_from_groups +from .microsoft.persistentSearch import ADPersistentSearch +from .novell.partition_entry_count import PartitionEntryCount +from .novell.replicaInfo import ReplicaInfo +from .novell.listReplicas import ListReplicas +from .novell.getBindDn import GetBindDn +from .novell.nmasGetUniversalPassword import NmasGetUniversalPassword +from .novell.nmasSetUniversalPassword import NmasSetUniversalPassword +from .novell.startTransaction import StartTransaction +from .novell.endTransaction import EndTransaction +from .novell.addMembersToGroups import edir_add_members_to_groups +from .novell.removeMembersFromGroups import edir_remove_members_from_groups +from .novell.checkGroupsMemberships import edir_check_groups_memberships +from .standard.whoAmI import WhoAmI +from .standard.modifyPassword import ModifyPassword +from .standard.PagedSearch import paged_search_generator, paged_search_accumulator +from .standard.PersistentSearch import PersistentSearch + + +class ExtendedOperationContainer(object): + def __init__(self, connection): + self._connection = connection + + def __repr__(self): + return linesep.join([' ' + element for element in dir(self) if element[0] != '_']) + + def __str__(self): + return self.__repr__() + + +class StandardExtendedOperations(ExtendedOperationContainer): + def who_am_i(self, controls=None): + return WhoAmI(self._connection, + controls).send() + + def modify_password(self, + user=None, + old_password=None, + new_password=None, + hash_algorithm=None, + salt=None, + controls=None): + + return ModifyPassword(self._connection, + user, + old_password, + new_password, + hash_algorithm, + salt, + controls).send() + + def paged_search(self, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=100, + paged_criticality=False, + generator=True): + + if generator: + return paged_search_generator(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality) + else: + return paged_search_accumulator(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality) + + def persistent_search(self, + search_base='', + search_filter='(objectclass=*)', + search_scope=SUBTREE, + dereference_aliases=DEREF_NEVER, + attributes=ALL_ATTRIBUTES, + size_limit=0, + time_limit=0, + controls=None, + changes_only=True, + show_additions=True, + show_deletions=True, + show_modifications=True, + show_dn_modifications=True, + notifications=True, + streaming=True, + callback=None + ): + events_type = 0 + if show_additions: + events_type += 1 + if show_deletions: + events_type += 2 + if show_modifications: + events_type += 4 + if show_dn_modifications: + events_type += 8 + + if callback: + streaming = False + return PersistentSearch(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + controls, + changes_only, + events_type, + notifications, + streaming, + callback) + + def funnel_search(self, + search_base='', + search_filter='', + search_scope=SUBTREE, + dereference_aliases=DEREF_NEVER, + attributes=ALL_ATTRIBUTES, + size_limit=0, + time_limit=0, + controls=None, + streaming=False, + callback=None + ): + return PersistentSearch(self._connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + controls, + None, + None, + None, + streaming, + callback) + + +class NovellExtendedOperations(ExtendedOperationContainer): + def get_bind_dn(self, controls=None): + return GetBindDn(self._connection, + controls).send() + + def get_universal_password(self, user, controls=None): + return NmasGetUniversalPassword(self._connection, + user, + controls).send() + + def set_universal_password(self, user, new_password=None, controls=None): + return NmasSetUniversalPassword(self._connection, + user, + new_password, + controls).send() + + def list_replicas(self, server_dn, controls=None): + return ListReplicas(self._connection, + server_dn, + controls).send() + + def partition_entry_count(self, partition_dn, controls=None): + return PartitionEntryCount(self._connection, + partition_dn, + controls).send() + + def replica_info(self, server_dn, partition_dn, controls=None): + return ReplicaInfo(self._connection, + server_dn, + partition_dn, + controls).send() + + def start_transaction(self, controls=None): + return StartTransaction(self._connection, + controls).send() + + def end_transaction(self, commit=True, controls=None): # attach the groupingControl to commit, None to abort transaction + return EndTransaction(self._connection, + commit, + controls).send() + + def add_members_to_groups(self, members, groups, fix=True, transaction=True): + return edir_add_members_to_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix, + transaction=transaction) + + def remove_members_from_groups(self, members, groups, fix=True, transaction=True): + return edir_remove_members_from_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix, + transaction=transaction) + + def check_groups_memberships(self, members, groups, fix=False, transaction=True): + return edir_check_groups_memberships(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix, + transaction=transaction) + + +class MicrosoftExtendedOperations(ExtendedOperationContainer): + def dir_sync(self, + sync_base, + sync_filter='(objectclass=*)', + attributes=ALL_ATTRIBUTES, + cookie=None, + object_security=False, + ancestors_first=True, + public_data_only=False, + incremental_values=True, + max_length=2147483647, + hex_guid=False): + return DirSync(self._connection, + sync_base=sync_base, + sync_filter=sync_filter, + attributes=attributes, + cookie=cookie, + object_security=object_security, + ancestors_first=ancestors_first, + public_data_only=public_data_only, + incremental_values=incremental_values, + max_length=max_length, + hex_guid=hex_guid) + + def modify_password(self, user, new_password, old_password=None, controls=None): + return ad_modify_password(self._connection, + user, + new_password, + old_password, + controls) + + def unlock_account(self, user): + return ad_unlock_account(self._connection, + user) + + def add_members_to_groups(self, members, groups, fix=True): + return ad_add_members_to_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix) + + def remove_members_from_groups(self, members, groups, fix=True): + return ad_remove_members_from_groups(self._connection, + members_dn=members, + groups_dn=groups, + fix=fix) + + def persistent_search(self, + search_base='', + search_scope=SUBTREE, + attributes=ALL_ATTRIBUTES, + streaming=True, + callback=None + ): + + if callback: + streaming = False + return ADPersistentSearch(self._connection, + search_base, + search_scope, + attributes, + streaming, + callback) + + +class ExtendedOperationsRoot(ExtendedOperationContainer): + def __init__(self, connection): + ExtendedOperationContainer.__init__(self, connection) # calls super + self.standard = StandardExtendedOperations(self._connection) + self.novell = NovellExtendedOperations(self._connection) + self.microsoft = MicrosoftExtendedOperations(self._connection) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d56db75e4fcad2d2ba0063b3ad32d452aae86cfe GIT binary patch literal 9061 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 MFQsDTy~_Ik0L6`Y761SM literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__pycache__/operation.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/__pycache__/operation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b13e43ce612dab84997b1a74500b9849b6fa34da GIT binary patch literal 2521 zcmb7GPjB2r6rZuZUaxnvNz;)25d?!!rIkpciXs(Mp_VoUp(<2O3zAi^ww_7qjbm?S zyj8Q>Txi9OTW=tg+(2A<;A8L!eC5=yz=_`*?{3nh9Pnn|ym{}ju%=ir7 z&wohyVwSPLX)yU5FxS!aH4wo&*~6=T};v%y_Q(?lc-Ikshqwy=c#oQJk>MC~~X9pQ>P`kI&(o@hYh3STrKsf(7F zLGKBUZOxTuj9Vea*L|tF1>CR41dg5 zsyYs<=0JXD>MXi{K3Oex`m6nA3&VklPg$z87W z_ew8{k}N5rD8NE`5rlE~4Zq>VQ=wRyOpQ5B!&e(O6Oz9$7_lDfadqGHRu7@rZXAtz z2nvm#emK$hoLlU>g?&Eaf?uH7wQWmXxyyF1e9H<~SkL$m2y%}d)Jcctp*0TeeFPDn z{9aT4NZdhdWF7K{*1o;(WWiWBqkbJ(4;_-B*%{4cz4pE{asYugATT>}4mpS4gE;~N z`ZHDEn+GiH^;dMr;bn7=lnX(Y7eSH*w>EABX`+iD-wgDi-_KPcMKCqfowFupVKaU# z<86ZoL{&@mM5@wBvduhPn9hri=BXz9Da!NGGg4%NnjslQzw~s0q>x*Cz{Oq`hpjDH z96_{MJXW$RBHi7TszLU%6^xHeX8U=6kYWiE5u984*b1tRNu8RSCx^6?(jl0ZJTl7} z=v8FFC^f*f3{D3ij9=pOyv<$9vlh9}=PjSNEf2`@xrg6yam}FdSZc4(0#hszrl=V# z(G`qS(|GLgYFC8*qb;bVi9OW?#)t2n_Hp9Gv9W|Pd7x(8{Rw8owNC&cFzR`7UV*aU zTYS5&zJd;bR<{dBSkTxP*f}Pgb7WN`o}iim;Ft%fs_!9pr;z>)qxuD=UP6azge3T- zr~}MKYGmF|7T^m2k8Je zYznDkmGr5y4eek#DC;{?>+Y5eQNpVFwvG}OPD|J~RI@rf^r+Zvpw_;1|~Tsr{V~!SSC-T==c?qY}|L1A#!uSU`)Ntu^Rvb_J*Us^OGw=+&bjja1 z1J9rKHGa(S$l|X-4-jD@ib_9g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vBza+OnzaXjpvA`HgrdE`s=B4Q8W+oTq7w4yy=*P!r=4F<|$LkeT U-r}&y%}*)KNwou+{TYZE03tIb+yDRo literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/addMembersToGroups.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff8cf2fc9a7ba2c4d1fef2037c9ea591896279f7 GIT binary patch literal 2716 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/modifyPassword.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e625d264441b8cc1510a2d42c9907e97b36c30c2 GIT binary patch literal 1381 zcmY*Z&uimG6xK+xB+K%T?z#)vh7tl>a3L|v(o)K@G_}37;KnA-LOU!KTFuz&M8B9B zH*t_JO|OOCdr6L^_x=_A3+CEW|A8KQ>YK6SY$fLNn{VFJd-L9hzpU4N1D;=hr}W#v zF#b}TyT=0K3t0Sn0AgT+AYvvcHL;mm*h+0|BgI)sC3Ucqy4X!U>}k$Us;Q5CZC8?7 z8sI?NPEt=BxB<3LJW~A$;U;k>MyDo`|F=rmv1H?$QUB|g--RcG@$jfOkoC>JKNt>9 z2h!hckNSOZwvv1%YXBk5qBjX8(i@+QPDj1bu!CgdWH5O(JPjwWdcDD90*uR}DGf;m zrZ4hvk{;(N$2O5@C64S`B@jaEpQ!aDcZ$HFd6*qf!LZ3}FR zpwfI~+*F8pi&hml$$+u8j8hsnP6_Q2Zt2X>)D&J>QNJ^Dj!OI1TDjTdtxt7xhVIUw z4*#siZ@?oc-COk9TzL?&tNA+nqjX=}ih<>2kn60ma!Z%kJBDbUo9s_gnW($8enD)P zIK)lfOCPMN$Pf=j`x>!-#QUO6ywWX=YZz-;UB?1ecML#ZV@+eQW03mKl^+pl!04LC zSN8rBzJFC+i0Q%8PY)7`{Y_uT7eqRY@_i`4eVE@7 zdu#W-=TG>Hy=l(0A!~&4n9U0nB2AJ>H>I3MGb(MdENG{~K)o<01x*Dl09=P}6?w*K zsGMGQ9^qR2md58{7C|^uvz8VYOjh131rRkwI5bm|kWQMD`E?gT zsEhc`V2>gBzh8AlT6BwfaWK!gh?3->IR9iez5Hz1O-NKc+aSFZG$Y+~93zQH)q16YfVGd(45?MyPQ3=px7 ng@*p1m7x>r-n;`JKoQb=4%b^G^o5c*S4y;Z+Nces!fX8ps_JQ0 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/persistentSearch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..660890c617a1f2fbc4b83b2871535e717ab732dd GIT binary patch literal 2532 zcmZuzOK;pZ5GM6r?XK+@X<{cqx^SOr5&O^vC<3QQn%I4yF!E}W>Y{2z+SXbt$t1V% zF618SoC*~E0lhfKqCcj0U30c%_t@A8P{Ag-2N$W+1t6-ge8WIsxZT!|t}(BQ10xjR7e7BEgi z3O6+H1}{ix;<=%>*aCBy`+|lxTVy_KgXFL!)?rCv8JrbIHAWzMJp27i~x5k1Grn6z`e=>-ctSv z*~1lWhI5_DuE@Y1kf>WZLa2qxIiW&S&Q!aYcR>FW>}KlS$m!Bcd?^ALTRW4@`N4b5 z$$L5HO!nfu7t3*;?295VMzSZB;PEic_j-V3&JzXLPZmEc`U8;fWwDgEKME!*Nt|W< zI63I0vX>XChvT@P@!&%3fr(i0y>V@!VPOLpVLRF9$w8FILoS5_n%bY+uYJ(Uc#lUZ ztF3-4d2P$2D0%J2N{O^TQt&H8xb~(mENf>s%@h}P>+HlZIXy)q;rYOjiiHYXI1JBr zMH`K@r{1D>>P!cEL$L_+Vj0;*V1E#?3f({7Y^Y(mQKsdMGzWWGcB4GFxwm`t*?1#k zarw!Vb97d=F-#Lt$YNJ*%pJ7Be7zjkUKFKys-oz9uq@Yr5znKZ;R88z_W7m*nhtyx z=qFd-^t|<%orIzdXxO)avCxC{{|tgWppGL$OCEt z`9N((e+9RTv?UnRffaS0fm1ysj|c=kI+w8%*y1wm7IvpdHV-3KK-b_2`Gy2t(Ln`1 zKxp@iQI1cY=1ky`Lti^#lojw~PGd)Oas35k3&`}-psD)W9M@Uk&mAbB;u0>$hiljs zl->fi4J2`r0M3@-QQzoL9}vc`LnkZepsd~JNrIt`4SP%|8siBFfC@QcsbtVEHSpk+i(YQ9avyAxb;x+U+^Gy zR8f8h6B0v%&;`KDr%TXZ2lDCU^0~+r<@Qd3Xko)13yntZD-iUJ&?`5mk|{UG%Tw7p zwIMwkFOA2<0;Hhy+?tji@VVzixlK}?;xM`ST6$}|XO@`aBpD4yS*$Rn@gJd9$X=TF z0JISgJdK(5zP z#f(*`#RrCXP+6!ybeMH)9y-rRGuGhQJKMFT#w8CI8sHvrxdlaZ`~<=pgSA2D9hBZh zhJe77j@3MDgp0t0G3Mt3uZXafDE^Kjt4cr z3+R);*xu3PVfw@(5=FHiMZl literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/__pycache__/removeMembersFromGroups.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6151a386868aabe145fff0b439f1b448b817eea1 GIT binary patch literal 2650 zcmb7FTW=dh6rNeHckQ*4xJfAu*HIrRMrr~=MJNgtZR0?tHcgXo>8jPT*%{m0?8Ti~ z=Tfa-NJX0mr1A_8%?lFZjbFg;*e4_;r2d6Iac0JL+#-QkX+|?=XU_S)bDJwuQx1af z$6pz1G!XhzZbn}T7N5cpt1waIB8sUI;n;AExa5|w+?OIVF1zK}a;?~Q?YQDrl-!J} zvEw?hu2PHI53yULl}*%i3hX?Sikn6;dwu2d`n6=&k3zbVv^YM$xWBnt5xMkqr$&hVij8aeLZ0fxPy_9Qo8Z{+Bn!LLa2 z58>nrI)pQ{q;`hd8Pptc9qRHK~Kt8B}1d!A+Z1=E0#mhWI_JgJ$Pd z!167oR$ies_*0)pI~M=rWJj%elo%a!gc38yM~F^I)Q^!weT1^9Lo{$6p*E(|Ag>I$ z)$-aC%+F=hd97{a4z-q1?(j9hJCj?vb8L(_Ji+4n1Pj2Nyro&deLCh*1s>K*3`%^B z&J4=5K`ZnWo$Z)MI5*+e&spOU20U{LkNx!2vBD}@uA}>FU!lBQN03IR{m%`A90K1` z&*y$jf;353Ad_Z^_+&fnCzMQx&}G4nAnlZEQ-tjU zAeID-_&`PN!lX0OIC-D@p+?jaU-cuwv~n%f-b^C~_cW(1-j~GuM1Unfd&%6MFNo*|0TZI#j}&&Lb9iHHy$k2M zey_(8rk$~&oGnOSKvXUay~tUl8v!^biqbs^Q3mTWM0$6Rk(H1`SW|vLct2udN#7>Y z-8y)5GJ5BS-XngN@o>AJF-K7ipb4lCatfI+Hera8bW!4yU@i3E1D|^OmN!ainXsPr z;KFj01`yLruo&I`e{>a}F=Ji>t8PUpe}OTVZIw^K^bw39xYY+U@9N46B43D4-fI?? z2H7;+ISLihh5!f<%kR;6@9iYIUfhELeVES)L zIevL3G{|Lw!3)(G)%GZU8o=0}>r%fC_EuqW^%xcg1((E7WPXQ@5y=-#rmsRoV4)D5 zg%?J?Vt9loH`>MoD(#Jub^_ih@GgLw({^-M@l=ZyFX8$I3=DBKXA373D$^mDT)wn! zO?5Oc@d0IF3Fh;l%We3><>TvCL>l_rOI7kAw-eDQ!vFO38&)izp<Hr| zi?ZsBMOmHE*4~y{vFF-B*H1c3xDBn$%hF-lY5y7g6*$RXmy--#@#eqQrBo|qWYLU+ zEkh0qPvdFBG^VkM&lnZlfH4hH%c$eJ@s9dq;aP0qI-ICu2TnNZgx*{DH8{)9gU+=k zUIic6o=4Nb^W2#rOzlatZuXYgt)KueR2PU+OqA9pxSva$@$ Uht7LR=BJQ>HP1HiSzNdO1}g}BsSaI!8fu(zNb8;WP_jvAiyKMyL(>Kmvh6w#MKTZz;=N_1R z0>BVO3^OOkg+m=|e3FyGrEcL-ukfjFIX4fAkcQUx@>bENZSY$xVBvdAJIo)Wep}=A zFH^jab?@ou!Q+Q7;{ENtovq<^pJ<&}XN?3@gH%DV~63xN*La z1%WvCjVJFxgx`=a_|RFn3sPROd?21Tkh(#Z~ceo+2ukJ2|eWXX# zOdVte*Z7w91(&m29S8@;gC(5Xd9bxNs<}v1R+anq&$m~rQ(|oyzP52)Zmvx#VIAFJ zT&5zcO^S9{se^(`nM}EM)x73?PnfqMA_H9mJpkH;T6I-Q9^0T5+DTvY^e8S9$QJO1 zkoJp;Ws|uug3wSZxD}tywJYakN~0-P@o5d(QLhD0SZqXGwlm7n6_I4nfgh*bUQg09 zX(jmjKSFdMPIv~4-ogdw`?{T0Wyw=B5)EdO3wRki1X77Am$rk(u}%Jp#05zD{b-Q`QMS^wnw4t3p6jzP z$C8YbC3_9(%QXOmeH`M;PKZ~)dX7&b>=GYG!1nMBM_huKKHlv|I*4OdrE#p$a(}Iv z%5u35AB3Ip-^etwD_Ke_h22}Y3}&Sj!dA6I{s$MKlMXjPqFK&2&HIr?W_LBh=ixpP F`2&L&4A1}o literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/addMembersToGroups.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/addMembersToGroups.py new file mode 100644 index 0000000..fb6528a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/addMembersToGroups.py @@ -0,0 +1,98 @@ +""" +""" + +# Created on 2016.12.26 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ... import SEQUENCE_TYPES, MODIFY_ADD, BASE, DEREF_NEVER +from ...core.exceptions import LDAPInvalidDnError, LDAPOperationsErrorResult +from ...utils.dn import safe_dn + + +def ad_add_members_to_groups(connection, + members_dn, + groups_dn, + fix=True, + raise_error=False): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :param fix: checks for group existence and already assigned members + :param raise_error: If the operation fails it raises an error instead of returning False + :return: a boolean where True means that the operation was successful and False means an error has happened + Establishes users-groups relations following the Active Directory rules: users are added to the member attribute of groups. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + """ + + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if connection.check_names: # builds new lists with sanitized dn + members_dn = [safe_dn(member_dn) for member_dn in members_dn] + groups_dn = [safe_dn(group_dn) for group_dn in groups_dn] + + error = False + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member']) + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_members = [element.lower() for element in existing_members] + else: + existing_members = [] + + changes = dict() + member_to_add = [element for element in members_dn if element.lower() not in existing_members] + if member_to_add: + changes['member'] = (MODIFY_ADD, member_to_add) + if changes: + result = connection.modify(group, changes) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + result_error_params = ['result', 'description', 'dn', 'message'] + if raise_error: + raise LDAPOperationsErrorResult([(k, v) for k, v in result.items() if k in result_error_params]) + break + + return not error # returns True if no error is raised in the LDAP operations diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/dirSync.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/dirSync.py new file mode 100644 index 0000000..e5dd8ae --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/dirSync.py @@ -0,0 +1,94 @@ +""" +""" + +# Created on 2015.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...core.exceptions import LDAPExtensionError +from ...protocol.microsoft import dir_sync_control, extended_dn_control, show_deleted_control +from ... import SUBTREE, DEREF_NEVER +from ...utils.dn import safe_dn + + +class DirSync(object): + def __init__(self, + connection, + sync_base, + sync_filter, + attributes, + cookie, + object_security, + ancestors_first, + public_data_only, + incremental_values, + max_length, + hex_guid + ): + self.connection = connection + if self.connection.check_names and sync_base: + self. base = safe_dn(sync_base) + else: + self.base = sync_base + self.filter = sync_filter + self.attributes = attributes + self.cookie = cookie + self.object_security = object_security + self.ancestors_first = ancestors_first + self.public_data_only = public_data_only + self.incremental_values = incremental_values + self.max_length = max_length + self.hex_guid = hex_guid + self.more_results = True + + def loop(self): + result = self.connection.search(search_base=self.base, + search_filter=self.filter, + search_scope=SUBTREE, + attributes=self.attributes, + dereference_aliases=DEREF_NEVER, + controls=[dir_sync_control(criticality=True, + object_security=self.object_security, + ancestors_first=self.ancestors_first, + public_data_only=self.public_data_only, + incremental_values=self.incremental_values, + max_length=self.max_length, cookie=self.cookie), + extended_dn_control(criticality=False, hex_format=self.hex_guid), + show_deleted_control(criticality=False)] + ) + if not self.connection.strategy.sync: + response, result = self.connection.get_response(result) + else: + if self.connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = self.connection.response + result = self.connection.result + + if result['description'] == 'success' and 'controls' in result and '1.2.840.113556.1.4.841' in result['controls']: + self.more_results = result['controls']['1.2.840.113556.1.4.841']['value']['more_results'] + self.cookie = result['controls']['1.2.840.113556.1.4.841']['value']['cookie'] + return response + elif 'controls' in result: + raise LDAPExtensionError('Missing DirSync control in response from server') + else: + raise LDAPExtensionError('error %r in DirSync' % result) + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/modifyPassword.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/modifyPassword.py new file mode 100644 index 0000000..e304caf --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/modifyPassword.py @@ -0,0 +1,75 @@ +""" +""" + +# Created on 2015.11.27 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +from ... import MODIFY_REPLACE, MODIFY_DELETE, MODIFY_ADD +from ...utils.log import log, log_enabled, PROTOCOL +from ...core.results import RESULT_SUCCESS +from ...utils.dn import safe_dn +from ...utils.conv import to_unicode + + +def ad_modify_password(connection, user_dn, new_password, old_password, controls=None): + # old password must be None to reset password with sufficient privileges + if connection.check_names: + user_dn = safe_dn(user_dn) + if str is bytes: # python2, converts to unicode + new_password = to_unicode(new_password) + if old_password: + old_password = to_unicode(old_password) + + encoded_new_password = ('"%s"' % new_password).encode('utf-16-le') + + if old_password: # normal users must specify old and new password + encoded_old_password = ('"%s"' % old_password).encode('utf-16-le') + result = connection.modify(user_dn, + {'unicodePwd': [(MODIFY_DELETE, [encoded_old_password]), + (MODIFY_ADD, [encoded_new_password])]}, + controls) + else: # admin users can reset password without sending the old one + result = connection.modify(user_dn, + {'unicodePwd': [(MODIFY_REPLACE, [encoded_new_password])]}, + controls) + + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + + # change successful, returns True + if result['result'] == RESULT_SUCCESS: + return True + + # change was not successful, raises exception if raise_exception = True in connection or returns the operation result, error code is in result['result'] + if connection.raise_exceptions: + from ...core.exceptions import LDAPOperationResult + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + return False diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/persistentSearch.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/persistentSearch.py new file mode 100644 index 0000000..455bedc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/persistentSearch.py @@ -0,0 +1,117 @@ +""" +""" + +# Created on 2016.07.08 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from queue import Empty +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Empty + +from ...core.exceptions import LDAPExtensionError +from ...utils.dn import safe_dn +from ...protocol.microsoft import persistent_search_control + + +class ADPersistentSearch(object): + def __init__(self, + connection, + search_base, + search_scope, + attributes, + streaming, + callback + ): + if connection.strategy.sync: + raise LDAPExtensionError('Persistent Search needs an asynchronous streaming connection') + + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + self.connection = connection + self.message_id = None + self.base = search_base + self.scope = search_scope + self.attributes = attributes + self.controls = [persistent_search_control()] + + # this is the only filter permitted by AD persistent search + self.filter = '(objectClass=*)' + + self.connection.strategy.streaming = streaming + if callback and callable(callback): + self.connection.strategy.callback = callback + elif callback: + raise LDAPExtensionError('callback is not callable') + + self.start() + + def start(self): + if self.message_id: # persistent search already started + return + + if not self.connection.bound: + self.connection.bind() + + with self.connection.strategy.async_lock: + self.message_id = self.connection.search(search_base=self.base, + search_filter=self.filter, + search_scope=self.scope, + attributes=self.attributes, + controls=self.controls) + self.connection.strategy.persistent_search_message_id = self.message_id + + def stop(self, unbind=True): + self.connection.abandon(self.message_id) + if unbind: + self.connection.unbind() + if self.message_id in self.connection.strategy._responses: + del self.connection.strategy._responses[self.message_id] + if hasattr(self.connection.strategy, '_requests') and self.message_id in self.connection.strategy._requests: # asynchronous strategy has a dict of request that could be returned by get_response() + del self.connection.strategy._requests[self.message_id] + self.connection.strategy.persistent_search_message_id = None + self.message_id = None + + def next(self, block=False, timeout=None): + if not self.connection.strategy.streaming and not self.connection.strategy.callback: + try: + return self.connection.strategy.events.get(block, timeout) + except Empty: + return None + + raise LDAPExtensionError('Persistent search is not accumulating events in queue') + + def funnel(self, block=False, timeout=None): + done = False + while not done: + try: + entry = self.connection.strategy.events.get(block, timeout) + except Empty: + yield None + if entry['type'] == 'searchResEntry': + yield entry + else: + done = True + + yield entry diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py new file mode 100644 index 0000000..86b799a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/removeMembersFromGroups.py @@ -0,0 +1,99 @@ +""" +""" + +# Created on 2016.12.26 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...core.exceptions import LDAPInvalidDnError, LDAPOperationsErrorResult +from ... import SEQUENCE_TYPES, MODIFY_DELETE, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def ad_remove_members_from_groups(connection, + members_dn, + groups_dn, + fix, + raise_error=False): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to remove from groups + :param groups_dn: the list of groups where members are to be removed + :param fix: checks for group existence and existing members + :param raise_error: If the operation fails it raises an error instead of returning False + :return: a boolean where True means that the operation was successful and False means an error has happened + Removes users-groups relations following the Activwe Directory rules: users are removed from groups' member attribute + + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if connection.check_names: # builds new lists with sanitized dn + members_dn = [safe_dn(member_dn) for member_dn in members_dn] + groups_dn = [safe_dn(group_dn) for group_dn in groups_dn] + + error = False + + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + else: + existing_members = members_dn + + existing_members = [element.lower() for element in existing_members] + changes = dict() + member_to_remove = [element for element in members_dn if element.lower() in existing_members] + if member_to_remove: + changes['member'] = (MODIFY_DELETE, member_to_remove) + if changes: + result = connection.modify(group, changes) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + result_error_params = ['result', 'description', 'dn', 'message'] + if raise_error: + raise LDAPOperationsErrorResult([(k, v) for k, v in result.items() if k in result_error_params]) + break + + return not error diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/unlockAccount.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/unlockAccount.py new file mode 100644 index 0000000..b1c65b8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/microsoft/unlockAccount.py @@ -0,0 +1,57 @@ +""" +""" + +# Created on 2016.11.01 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +from ... import MODIFY_REPLACE +from ...utils.log import log, log_enabled, PROTOCOL +from ...core.results import RESULT_SUCCESS +from ...utils.dn import safe_dn + + +def ad_unlock_account(connection, user_dn, controls=None): + if connection.check_names: + user_dn = safe_dn(user_dn) + result = connection.modify(user_dn, {'lockoutTime': [(MODIFY_REPLACE, ['0'])]}, controls) + + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + + # change successful, returns True + if result['result'] == RESULT_SUCCESS: + return True + + # change was not successful, raises exception if raise_exception = True in connection or returns the operation result, error code is in result['result'] + if connection.raise_exceptions: + from ...core.exceptions import LDAPOperationResult + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + return result diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51479573608f6d0e0309ce4abbb961167d59287d GIT binary patch literal 150 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vWza+OnzaXjpvA`HgrdE`s=B4Q8<(H-A;pEzH(3HgT_OnwF)-a(V9W5gkhG9#b^!!f9OE(C>v>6n9} zQyf^1H7GeHEjNSmV8L0ybCFq(iBn;vP0}f+wDMH}mO3Fg6$+7nw1(5^~QF`+YJl zp_LCVBy@w^ZH^a`((^)WCJT?~3rfk}Iu z@t*a(^n#3wiFIVi^&@)lnX-FC?>-+dCWRv^_Mufy7Fi))h%3xw#lFF;r^Rs<^2K{q z`DH?$FD2C%^dn=uG_Ho<)bg76S5p1R9M{HGNNb_euIn|8F|=9fJYnVg#u1g(cp26g zR>&jzE6U7diB&MSc%Iz1;C*#AX6AVk8h!FfffZ*`t+h29vtq7AS(Pn4CLb3zU>R#_ zdW5}UM8mSOgGS@#BQmZ(DeO>IhelZ;_lS-gPbegfImvR;Ks z_5bPA|Lb@&!)0Z+=kbj*+Zl1Y<`1=&Omole3WZWGYd+&oi^T-tMfJ0MUfM=Y$YcaN28G0?@eWP zw0#e=^9u%iu+4=;wOY61U2X@yjO}R0&gFI-*&bu+UtdI{p`2fvNlq=z#P)+-F8I`r zhi4es=E@vr^JaGZgLS*N%X{~wy%P!B53vi0IC$9O5NFvNjxoyD%Pi@lnus^Ja z8iF6pTaASmN^b%M{_lG+)V$DEMc$s9&Q=K?k3^1I6maNe8`u&fwF?-73oq8OL_;nz z{|`KA%TW(;%AHZ5!@1@Kayw1st>WUP z&&dn&dt=YsB!5&d8AXuFMaM{u)$gSx9`FGG6iZm5yRWaW#e?D6&>vp%LnKKMTpHg0 zL4W7qhlgtc^M>EgdwziP!PdfPp9jGj=*cPGihisQ>gw?D>&j(yoO{t=c;!PCmkQD% z4_7(!g^ML_My7P*$juO6y&Ob6WX=^lOqTv{d(@lgP*H=gjv?x5Uk%kwcPN(Cu!-&t zS{~FXCoMJi7CH@NdjjOgTC`8i6DMA3j&3}!U-Mtu~450owI4hm-^(RJPB1& zoJD;(x}i5fp|bQX!i4&sNUf|2I965$oMjXY5xaAjTWU$}iQcZTpf5_wTv=j1=KaIe zl!sx@srGs73NDAZb-A+`?+WfQSAD~z7Q~|=nLv^+an7U4>x9f#{E}gR{N`vAGWzktVd0g{}w5TVXrQFX%{UqDD zdUoziaZWi`cY;_^oyu@s1JetyF2on1B>#erG%D0GR5Ph*SQI_2(57lyV$v$4HEPjw zMwvFyY8YEa4f40?+n8x6JLqtYcPcuu@jO z=~<%<|E3|njrebN7SodJvZ&{}PQ4cizRC}JT;HxT%O|4qTqo3go{nNakgK3j<+`>t dSFxsLD=l9}4&s&Qin`vU(luAA^c<}g{tNffDlY&4 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/checkGroupsMemberships.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/checkGroupsMemberships.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08751ca2dea8cf8e2bc044aba9403e4690b185df GIT binary patch literal 4923 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
fuIV8!z0b?`qr-GOP|p42Bt+O&1Z7-k<0( z1hYNW577Dy6%OPzW!sJ&`y9k#641a8$APcWyNE(F5JFa|5PYj2(70NED=iE8?OIoD zl~#G&Pp)AqnOTYAw>>GYw|!E!7>klF_dCR?774@DD|mN1K1%MBnZpq3A5uu&{rbIVC~55 zF2qY%rVEVXYeW$BfWwV}d)8kf*aM0nNHAGE+KZEC@zKE`PU0llKTMv3uy+_IgF(EX z{Qr2bjEYrhjkK-V<%}6iL^fqC_OFsxR0)@o+0E-^~>})>`Tw)*Ikb z0a3FisO6TDYQ{6mTmbNR0zYpn^Kch$;>CkMmHlHo={3rTRNWw?Y!Nb*bjBITZ9*<* z8Fy_XM7tNEH}58Qh-h~M4X*^b!7}c7L^ukoKNA?o4MM2Q2}!q&2HQ_5GEI`KsY#%~_!{OiXo0)I)baQh+p#AZWlwXB}{EL%| z=7aJCy7?A_Ae;y)n4&Yr8AaVw-puE|(|y&O1w3$iPldCHN0fX+L?FU5B0|Yl9`B22 zpTzx^4*v7NVock2p1-oP5>kBENS)iVu3&NF2id5y$X}Gk!ZdiX_x1OC6VO7FPh}>m z0xqu`T6zNAddHtr)jdGg!diFYBv*5(F-^Rmn<~vrBMbiS`buuC zE`Oa{3BmJ?RMWqS-hk6@o{j9R88u~dx2%lKmAcy;Jvf-YdUQHcB5&@UOX;#Rs_GM| z)JRLq9ZQMUw~rCpAhIJU3!0c z6vjiQZ(DE4R`fNqK8_ITo(nad#DT_~w^5drRcW(~Zxp}D;>ZQa=m7Rym~id z=Jd{z91?x2qa*5jWJN0`fJlc>KRe_{Qhn?b%Z>*6DFyyP{jB$XCKdY$=8j|kDtde-cY(Inar z$YOlO)uwLdDz`ENYR#2Rc2r&D%It!2aap71vB$TBENZA|JnD$s2HmB$|MIkv&$X^~ zOkGy4L1}MZe+Kb%31IXNBw=y;ZKz`82GRlxC(GJFmd$E0SEvuO?0BB5Zbxr|VV7e4 zA!=9>mxLn#{0qq^&<*klI2{fGjcb#5(1uwi>H>(j)fGrmU;MosGx^O%*S0Qdm2{QU xRp{1wRZoli57N}Jlt*)0DwBw+V=lgN35$b84x zu4^0H)B0cZk{pYk`geHksehrT4k_D611w5`!{Lw`&3yBXzFS!tAQ->>A;g~vLVvl< z`3OO|4O8C*!4X9qb5h}&P=cKvR6!lmu#RX{$29h~uShIFK0rV z$9Xjq_S5CJblXTRx@+%Gf4sBH?%%!hfNej0#2#-y-2Gu^3ZL%jd`~bg3y9=mxUg=+ z)SrP6h+@c?xQtH`4S2#s9-U$u@|gF)67c}?>D$Z8LMbq~al@?y=JznYZ;t1PAx=PI zLly|uz=VDUuds_b0^i~Eq}*_;OU4&r3lxK1K^f+F9=r}PtouZLXo5Le z;9rRe=V(9Tc!K6oB+$qN=no|crncuo1!~d=km53pmE(;~7%OFI7^9bp7os@ukZRR~ zGZj1GB2Png$z2{mbW#+K@;01lp=<&cqnb*43_G#nURww8In1-nR|#ZJ2KeOTrJ0`x z@*n;|XLqU3L4lNzIx>*{K6LRFv~U_QeS*$xJ!cU{Do9WYimd{#Mq$k@wSUUetReZ`khec&|L zA8!a>U{{%|FtuX|kh(YMD`%Ug1KVSaHwAENz3Y~&Isa37($Te6HKr+=D(l+Fx3KS7 o&pDdROj+rS%Z`W6?Hix>(YP3FGU?*~*8QfmyB1y^0x-kiU!kdx0ssI2 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/nmasSetUniversalPassword.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/nmasSetUniversalPassword.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a72be1d796505054545d1e79ed2b6bc2c64a8587 GIT binary patch literal 1492 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/replicaInfo.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/replicaInfo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f91d00f5a94245569754956b4d9ac89cfb247dc GIT binary patch literal 2059 zcma)7UvJz*5Z|?ZKA-P$xg0?tDx$oAbP~DrS|CA+pp*nu2_2}F3apSU$GdkpS^w#J z9g@@Kh2#~f@4U2+h;QUqp7IrVVrJb-j!LDqwX@^d+1Z)j&W!J`toQ_;KmHQpixoot z#*fA00CNvUkptm`5l*=!X+jyL$lKCNY-R)R@P>4f25T7Jm2T2x&BS9Kd^fo#TZzwn zv(}RBq{BLf_vK2`WnD_XA-v5ymxOnOe_^v#zVe6+x)t@W;9xSKmB&LZbess_n-5Yg zrb1oW^;-Yi{V%^iIMpI8;w(K-DpLcia#6ZJuHJblav4YAgLINT6i-S~=*OWf#g$d> zUNbwn;NRs!g&Hj25nMzW7Yf-ToQQy@5qh$C@Z@_iiVuMZ!YF`aAvl+W+1x`oE-7=k z%bOr+a2vvDRqZ8LA__b4!5Llo3P!O3gwr_*2)BSzZCwzUZEgc~H~}-xc=rCC;po%h z?#H)>qv2?DcW3k&Fn4x_quU_a`TynJs*{IG#~3I?HE6Jos!<8jFcEA;i6YO^LYPnG zfkPF@3~s>*0>}E-DxuaYJ}fofic<(V`ID$M*zwQ(ZJp%Xd7N*>X`w?YxANmprjyg% zvu(-4{O$`X@Y48pnw4fC_gjk0tSPZ8k)-5}JZuI15Le+kB6tu&4rr~wbo zI1HToz|83pQ5$nh^);Pa7xdhk+iC-N8+cn=&j8vvojcDVjpqRRk;Ca8nS&HKYY);M zK)1(Ls}Sl$D8Nj0!7KpRj(!o*vB9ZO9gr!kq{<6|IE{4>s8yqTW0w@73*jkeDcml1+)E+i7=I5oFioo!FnMI)tZmKip zCP}bBYcu*R7gb{-!)Y;luS~;3DK>SsS@){VqC6}#bTBcyRi?*j_G@}0+EgM5AuH4A zpu>9g1|BTxShXQrD)&Xt!=_)^ajGj96iTTTCREicbu>{~g1$mLNv@hk5zeey2d9z9 zO>Vm&9M~r3S?k)RMMLE;<$1N5XL%{XX>aah@pN(lN O&bu88UI4L!ul+A?A_N2g literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/startTransaction.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/__pycache__/startTransaction.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20d36dcfe9961f897cf68f8ea3d31e3ddb87ba90 GIT binary patch literal 1717 zcmaKsOK;pZ5P(U&R=e5t1K1>W>$W}>P=IKoxQ$c5D1thvfuh&~jnM}$geua8Vy&c5 z+#qXgPWCmwAeZ)7^dIrsQ-44&J#~iiu3tqcaQG63oR2f}^800v6agujoud7E-cLgfD_KA_D20x~wZY z&q)*-+WXrDZ4ou=&t7X;3Msy?rAl>Pm62;c+EX&sa$i-``e0VeALPraZ1j(5F_mWX z#$r=fWh2|wq1}|1M|)MNRaMwoIA`$dG%p0t+Sv>aUlzQ{6R1rLLJ~&7NC%BPBg_>& z;R*kYGEW4e12et|MHkvYxM0dHv-Vu4N*}1SY|;$xpHWbQ1zQK|9@J(FgrIZ6TS>KZ zN?_z_&$hlGpv@VdY(9*WNAcs&AH+$VB-=a5m(Y2*6DJS0<0J}LU$rcFnNB1dDA^is zhYFv{z?`MUUm-5#!yN0TO_}hfmKmV%8d)6vLDVf+`FDS$C-tb#>-%}x=(H&A*T-KR z9lm}%8xr@lxx`n% zmaSb{Y6HW!?htv#%}dSJgv=_4I=*lq6F_fTXw$`jd!|&SB5Da;V_{b7s-6}Qp12ow z+yl!Rn?C4}I#7Ym)(tw>HZ37xfGi<>3xnA`O-{)h1Y}XoArNXK3jO`pmlnrHxbQam7jiks|0ccZ06dkK~ z0q;E2Zo_2cSZM6_;!IG2ho1j}F?Zotrr$`te1Zhl8gw@T7z4m~2T^`}1LfsC5gkVz z^lVHAoSPo!lS)hr?Dsi;IZcapMGf#|^ka1g#a$E^x3N9z>i8I+LbX90(lF?GVMpQY zIO>@W=c39uXKQUnh^s}~wlT(5YgOqgtBSZy6*eW=9Ax3K_2v39)DWfB|9{sp;cjcs QSLi7APTmK7aI(JpA7D?cv;Y7A literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/addMembersToGroups.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/addMembersToGroups.py new file mode 100644 index 0000000..b832b9a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/addMembersToGroups.py @@ -0,0 +1,167 @@ +""" +""" + +# Created on 2016.04.16 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from ...core.exceptions import LDAPInvalidDnError +from ... import SEQUENCE_TYPES, MODIFY_ADD, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def edir_add_members_to_groups(connection, + members_dn, + groups_dn, + fix, + transaction): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :param fix: checks for inconsistences in the users-groups relation and fixes them + :param transaction: activates an LDAP transaction + :return: a boolean where True means that the operation was successful and False means an error has happened + Establishes users-groups relations following the eDirectory rules: groups are added to securityEquals and groupMembership + attributes in the member object while members are added to member and equivalentToMe attributes in the group object. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + transaction_control = None + error = False + + if connection.check_names: # builds new lists with sanitized dn + safe_members_dn = [] + safe_groups_dn = [] + for member_dn in members_dn: + safe_members_dn.append(safe_dn(member_dn)) + for group_dn in groups_dn: + safe_groups_dn.append(safe_dn(group_dn)) + + members_dn = safe_members_dn + groups_dn = safe_groups_dn + + if transaction: + transaction_control = connection.extend.novell.start_transaction() + + if not error: + for member in members_dn: + if fix: # checks for existance of member and for already assigned groups + result = connection.search(member, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['securityEquals', 'groupMembership']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': + raise LDAPInvalidDnError(member + ' not found') + + existing_security_equals = response[0]['attributes']['securityEquals'] if 'securityEquals' in response[0]['attributes'] else [] + existing_group_membership = response[0]['attributes']['groupMembership'] if 'groupMembership' in response[0]['attributes'] else [] + existing_security_equals = [element.lower() for element in existing_security_equals] + existing_group_membership = [element.lower() for element in existing_group_membership] + else: + existing_security_equals = [] + existing_group_membership = [] + changes = dict() + security_equals_to_add = [element for element in groups_dn if element.lower() not in existing_security_equals] + group_membership_to_add = [element for element in groups_dn if element.lower() not in existing_group_membership] + if security_equals_to_add: + changes['securityEquals'] = (MODIFY_ADD, security_equals_to_add) + if group_membership_to_add: + changes['groupMembership'] = (MODIFY_ADD, group_membership_to_add) + if changes: + result = connection.modify(member, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if not error: + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member', 'equivalentToMe']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_equivalent_to_me = response[0]['attributes']['equivalentToMe'] if 'equivalentToMe' in response[0]['attributes'] else [] + existing_members = [element.lower() for element in existing_members] + existing_equivalent_to_me = [element.lower() for element in existing_equivalent_to_me] + else: + existing_members = [] + existing_equivalent_to_me = [] + + changes = dict() + member_to_add = [element for element in members_dn if element.lower() not in existing_members] + equivalent_to_me_to_add = [element for element in members_dn if element.lower() not in existing_equivalent_to_me] + if member_to_add: + changes['member'] = (MODIFY_ADD, member_to_add) + if equivalent_to_me_to_add: + changes['equivalentToMe'] = (MODIFY_ADD, equivalent_to_me_to_add) + if changes: + result = connection.modify(group, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if transaction: + if error: # aborts transaction in case of error in the modify operations + result = connection.extend.novell.end_transaction(commit=False, controls=[transaction_control]) + else: + result = connection.extend.novell.end_transaction(commit=True, controls=[transaction_control]) + + if result['description'] != 'success': + error = True + + return not error # returns True if no error is raised in the LDAP operations diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/checkGroupsMemberships.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/checkGroupsMemberships.py new file mode 100644 index 0000000..0f65b5d --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/checkGroupsMemberships.py @@ -0,0 +1,180 @@ +""" +""" + +# Created on 2016.05.14 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + + +from .addMembersToGroups import edir_add_members_to_groups +from ...core.exceptions import LDAPInvalidDnError +from ... import SEQUENCE_TYPES, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def _check_members_have_memberships(connection, + members_dn, + groups_dn): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :return: two booleans. The first when True means that all members have membership in all groups, The second when True means that + there are inconsistences in the securityEquals attribute + Checks user's group membership. + Raises LDAPInvalidDNError if member is not found in the DIT. + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + partial = False # True when a member has groupMembership but doesn't have securityEquals + for member in members_dn: + result = connection.search(member, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['groupMembership', 'securityEquals']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': # member not found in DIT + raise LDAPInvalidDnError(member + ' not found') + + existing_security_equals = response[0]['attributes']['securityEquals'] if 'securityEquals' in response[0]['attributes'] else [] + existing_group_membership = response[0]['attributes']['groupMembership'] if 'groupMembership' in response[0]['attributes'] else [] + existing_security_equals = [element.lower() for element in existing_security_equals] + existing_group_membership = [element.lower() for element in existing_group_membership] + + for group in groups_dn: + if group.lower() not in existing_group_membership: + return False, False + if group.lower() not in existing_security_equals: + partial = True + + return True, partial + + +def _check_groups_contain_members(connection, + groups_dn, + members_dn): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to add to groups + :param groups_dn: the list of groups where members are to be added + :return: two booleans. The first when True means that all members have membership in all groups, The second when True means that + there are inconsistences in the EquivalentToMe attribute + Checks if groups have members in their 'member' attribute. + Raises LDAPInvalidDNError if member is not found in the DIT. + """ + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + partial = False # True when a group has member but doesn't have equivalentToMe + for group in groups_dn: + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member', 'equivalentToMe']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + result = connection.result + response = connection.response + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_equivalent_to_me = response[0]['attributes']['equivalentToMe'] if 'equivalentToMe' in response[0]['attributes'] else [] + existing_members = [element.lower() for element in existing_members] + existing_equivalent_to_me = [element.lower() for element in existing_equivalent_to_me] + for member in members_dn: + if member.lower() not in existing_members: + return False, False + if member.lower() not in existing_equivalent_to_me: + partial = True + + return True, partial + + +def edir_check_groups_memberships(connection, + members_dn, + groups_dn, + fix, + transaction): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to check + :param groups_dn: the list of groups to check + :param fix: checks for inconsistences in the users-groups relation and fixes them + :param transaction: activates an LDAP transaction when fixing + :return: a boolean where True means that the operation was successful and False means an error has happened + Checks and fixes users-groups relations following the eDirectory rules: groups are checked against 'groupMembership' + attribute in the member object while members are checked against 'member' attribute in the group object. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + """ + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if connection.check_names: # builds new lists with sanitized dn + safe_members_dn = [] + safe_groups_dn = [] + for member_dn in members_dn: + safe_members_dn.append(safe_dn(member_dn)) + for group_dn in groups_dn: + safe_groups_dn.append(safe_dn(group_dn)) + + members_dn = safe_members_dn + groups_dn = safe_groups_dn + + try: + members_have_memberships, partial_member_security = _check_members_have_memberships(connection, members_dn, groups_dn) + groups_contain_members, partial_group_security = _check_groups_contain_members(connection, groups_dn, members_dn) + except LDAPInvalidDnError: + return False + + if not members_have_memberships and not groups_contain_members: + return False + + if fix: # fix any inconsistences + if (members_have_memberships and not groups_contain_members) \ + or (groups_contain_members and not members_have_memberships) \ + or partial_group_security \ + or partial_member_security: + + for member in members_dn: + for group in groups_dn: + edir_add_members_to_groups(connection, member, group, True, transaction) + + return True diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/endTransaction.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/endTransaction.py new file mode 100644 index 0000000..18bc041 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/endTransaction.py @@ -0,0 +1,58 @@ +""" +""" + +# Created on 2016.04.14 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import EndGroupTypeRequestValue, EndGroupTypeResponseValue, Sequence +from ...utils.asn1 import decoder + + +class EndTransaction(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.103.2' + self.response_name = '2.16.840.1.113719.1.27.103.2' + self.request_value = EndGroupTypeRequestValue() + self.asn1_spec = EndGroupTypeResponseValue() + + def __init__(self, connection, commit=True, controls=None): + if controls and len(controls) == 1: + group_cookie = decoder.decode(controls[0][2], asn1Spec=Sequence())[0][0] # get the cookie from the built groupingControl + else: + group_cookie = None + controls = None + + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if group_cookie: + self.request_value['endGroupCookie'] = group_cookie # transactionGroupingType + if not commit: + self.request_value['endGroupValue'] = '' # an empty endGroupValue means abort transaction + + def populate_result(self): + try: + self.result['value'] = self.decoded_response['endGroupValue'] + except TypeError: + self.result['value'] = None + + def set_response(self): + self.response_value = self.result diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/getBindDn.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/getBindDn.py new file mode 100644 index 0000000..492bcdd --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/getBindDn.py @@ -0,0 +1,41 @@ +""" +""" + +# Created on 2014.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...protocol.novell import Identity +from ...extend.operation import ExtendedOperation + + +class GetBindDn(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.31' + self.response_name = '2.16.840.1.113719.1.27.100.32' + self.response_attribute = 'identity' + self.asn1_spec = Identity() + + def populate_result(self): + try: + self.result['identity'] = str(self.decoded_response) if self.decoded_response else None + except TypeError: + self.result['identity'] = None diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/listReplicas.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/listReplicas.py new file mode 100644 index 0000000..8ccf2ff --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/listReplicas.py @@ -0,0 +1,50 @@ +""" +""" + +# Created on 2014.07.03 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import ReplicaList +from ...protocol.rfc4511 import LDAPDN +from ...utils.dn import safe_dn + + +class ListReplicas(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.19' + self.response_name = '2.16.840.1.113719.1.27.100.20' + self.request_value = LDAPDN() + self.asn1_spec = ReplicaList() + self.response_attribute = 'replicas' + + def __init__(self, connection, server_dn, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if connection.check_names: + server_dn = safe_dn(server_dn) + self.request_value = LDAPDN(server_dn) + + def populate_result(self): + try: + self.result['replicas'] = [str(replica) for replica in self.decoded_response] if self.decoded_response else None + except TypeError: + self.result['replicas'] = None diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py new file mode 100644 index 0000000..291ae92 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasGetUniversalPassword.py @@ -0,0 +1,56 @@ +""" +""" + +# Created on 2014.07.03 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import NmasGetUniversalPasswordRequestValue, NmasGetUniversalPasswordResponseValue, NMAS_LDAP_EXT_VERSION +from ...utils.dn import safe_dn + + +class NmasGetUniversalPassword(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.39.42.100.13' + self.response_name = '2.16.840.1.113719.1.39.42.100.14' + self.request_value = NmasGetUniversalPasswordRequestValue() + self.asn1_spec = NmasGetUniversalPasswordResponseValue() + self.response_attribute = 'password' + + def __init__(self, connection, user, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + + if connection.check_names: + user = safe_dn(user) + + self.request_value['nmasver'] = NMAS_LDAP_EXT_VERSION + self.request_value['reqdn'] = user + + def populate_result(self): + if self.decoded_response: + self.result['nmasver'] = int(self.decoded_response['nmasver']) + self.result['error'] = int(self.decoded_response['err']) + try: + + self.result['password'] = str(self.decoded_response['passwd']) if self.decoded_response['passwd'].hasValue() else None + except TypeError: + self.result['password'] = None diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py new file mode 100644 index 0000000..dadab59 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/nmasSetUniversalPassword.py @@ -0,0 +1,52 @@ +""" +""" + +# Created on 2014.07.03 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import NmasSetUniversalPasswordRequestValue, NmasSetUniversalPasswordResponseValue, NMAS_LDAP_EXT_VERSION +from ...utils.dn import safe_dn + + +class NmasSetUniversalPassword(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.39.42.100.11' + self.response_name = '2.16.840.1.113719.1.39.42.100.12' + self.request_value = NmasSetUniversalPasswordRequestValue() + self.asn1_spec = NmasSetUniversalPasswordResponseValue() + self.response_attribute = 'password' + + def __init__(self, connection, user, new_password, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if connection.check_names and user: + user = safe_dn(user) + + self.request_value['nmasver'] = NMAS_LDAP_EXT_VERSION + if user: + self.request_value['reqdn'] = user + if new_password: + self.request_value['new_passwd'] = new_password + + def populate_result(self): + self.result['nmasver'] = int(self.decoded_response['nmasver']) + self.result['error'] = int(self.decoded_response['err']) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/partition_entry_count.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/partition_entry_count.py new file mode 100644 index 0000000..3d46c7a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/partition_entry_count.py @@ -0,0 +1,57 @@ +""" +""" + +# Created on 2014.08.05 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import Integer + +from ...core.exceptions import LDAPExtensionError +from ..operation import ExtendedOperation +from ...protocol.rfc4511 import LDAPDN +from ...utils.asn1 import decoder +from ...utils.dn import safe_dn + + +class PartitionEntryCount(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.13' + self.response_name = '2.16.840.1.113719.1.27.100.14' + self.request_value = LDAPDN() + self.response_attribute = 'entry_count' + + def __init__(self, connection, partition_dn, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if connection.check_names: + partition_dn = safe_dn(partition_dn) + self.request_value = LDAPDN(partition_dn) + + def populate_result(self): + substrate = self.decoded_response + try: + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['entry_count'] = int(decoded) + except Exception: + raise LDAPExtensionError('unable to decode substrate') + + if substrate: + raise LDAPExtensionError('unknown substrate remaining') diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/removeMembersFromGroups.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/removeMembersFromGroups.py new file mode 100644 index 0000000..5736079 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/removeMembersFromGroups.py @@ -0,0 +1,170 @@ +""" +""" + +# Created on 2016.04.17 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from ...core.exceptions import LDAPInvalidDnError +from ... import SEQUENCE_TYPES, MODIFY_DELETE, BASE, DEREF_NEVER +from ...utils.dn import safe_dn + + +def edir_remove_members_from_groups(connection, + members_dn, + groups_dn, + fix, + transaction): + """ + :param connection: a bound Connection object + :param members_dn: the list of members to remove from groups + :param groups_dn: the list of groups where members are to be removed + :param fix: checks for inconsistences in the users-groups relation and fixes them + :param transaction: activates an LDAP transaction + :return: a boolean where True means that the operation was successful and False means an error has happened + Removes users-groups relations following the eDirectory rules: groups are removed from securityEquals and groupMembership + attributes in the member object while members are removed from member and equivalentToMe attributes in the group object. + Raises LDAPInvalidDnError if members or groups are not found in the DIT. + + """ + if not isinstance(members_dn, SEQUENCE_TYPES): + members_dn = [members_dn] + + if not isinstance(groups_dn, SEQUENCE_TYPES): + groups_dn = [groups_dn] + + if connection.check_names: # builds new lists with sanitized dn + safe_members_dn = [] + safe_groups_dn = [] + for member_dn in members_dn: + safe_members_dn.append(safe_dn(member_dn)) + for group_dn in groups_dn: + safe_groups_dn.append(safe_dn(group_dn)) + + members_dn = safe_members_dn + groups_dn = safe_groups_dn + + transaction_control = None + error = False + + if transaction: + transaction_control = connection.extend.novell.start_transaction() + + if not error: + for member in members_dn: + if fix: # checks for existance of member and for already assigned groups + result = connection.search(member, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['securityEquals', 'groupMembership']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(member + ' not found') + + existing_security_equals = response[0]['attributes']['securityEquals'] if 'securityEquals' in response[0]['attributes'] else [] + existing_group_membership = response[0]['attributes']['groupMembership'] if 'groupMembership' in response[0]['attributes'] else [] + else: + existing_security_equals = groups_dn + existing_group_membership = groups_dn + existing_security_equals = [element.lower() for element in existing_security_equals] + existing_group_membership = [element.lower() for element in existing_group_membership] + + changes = dict() + security_equals_to_remove = [element for element in groups_dn if element.lower() in existing_security_equals] + group_membership_to_remove = [element for element in groups_dn if element.lower() in existing_group_membership] + if security_equals_to_remove: + changes['securityEquals'] = (MODIFY_DELETE, security_equals_to_remove) + if group_membership_to_remove: + changes['groupMembership'] = (MODIFY_DELETE, group_membership_to_remove) + if changes: + result = connection.modify(member, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if not error: + for group in groups_dn: + if fix: # checks for existance of group and for already assigned members + result = connection.search(group, '(objectclass=*)', BASE, dereference_aliases=DEREF_NEVER, attributes=['member', 'equivalentToMe']) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if not result['description'] == 'success': + raise LDAPInvalidDnError(group + ' not found') + + existing_members = response[0]['attributes']['member'] if 'member' in response[0]['attributes'] else [] + existing_equivalent_to_me = response[0]['attributes']['equivalentToMe'] if 'equivalentToMe' in response[0]['attributes'] else [] + else: + existing_members = members_dn + existing_equivalent_to_me = members_dn + + existing_members = [element.lower() for element in existing_members] + existing_equivalent_to_me = [element.lower() for element in existing_equivalent_to_me] + + changes = dict() + member_to_remove = [element for element in members_dn if element.lower() in existing_members] + equivalent_to_me_to_remove = [element for element in members_dn if element.lower() in existing_equivalent_to_me] + if member_to_remove: + changes['member'] = (MODIFY_DELETE, member_to_remove) + if equivalent_to_me_to_remove: + changes['equivalentToMe'] = (MODIFY_DELETE, equivalent_to_me_to_remove) + if changes: + result = connection.modify(group, changes, controls=[transaction_control] if transaction else None) + if not connection.strategy.sync: + _, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, _, _ = result + else: + result = connection.result + if result['description'] != 'success': + error = True + break + + if transaction: + if error: # aborts transaction in case of error in the modify operations + result = connection.extend.novell.end_transaction(commit=False, controls=[transaction_control]) + else: + result = connection.extend.novell.end_transaction(commit=True, controls=[transaction_control]) + + if result['description'] != 'success': + error = True + + return not error # return True if no error is raised in the LDAP operations diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/replicaInfo.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/replicaInfo.py new file mode 100644 index 0000000..057f934 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/replicaInfo.py @@ -0,0 +1,79 @@ +""" +""" + +# Created on 2014.08.07 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime + +from pyasn1.type.univ import Integer + +from ...core.exceptions import LDAPExtensionError +from ...protocol.novell import LDAPDN, ReplicaInfoRequestValue +from ..operation import ExtendedOperation +from ...utils.asn1 import decoder +from ...utils.dn import safe_dn + + +class ReplicaInfo(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.100.17' + self.response_name = '2.16.840.1.113719.1.27.100.18' + # self.asn1_spec = ReplicaInfoResponseValue() + self.request_value = ReplicaInfoRequestValue() + self.response_attribute = 'partition_dn' + + def __init__(self, connection, server_dn, partition_dn, controls=None): + if connection.check_names: + if server_dn: + server_dn = safe_dn(server_dn) + if partition_dn: + partition_dn = safe_dn(partition_dn) + + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + self.request_value['server_dn'] = server_dn + self.request_value['partition_dn'] = partition_dn + + def populate_result(self): + substrate = self.decoded_response + try: + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['partition_id'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['replica_state'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['modification_time'] = datetime.utcfromtimestamp(int(decoded)) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['purge_time'] = datetime.utcfromtimestamp(int(decoded)) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['local_partition_id'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=LDAPDN()) + self.result['partition_dn'] = str(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['replica_type'] = int(decoded) + decoded, substrate = decoder.decode(substrate, asn1Spec=Integer()) + self.result['flags'] = int(decoded) + except Exception: + raise LDAPExtensionError('unable to decode substrate') + + if substrate: + raise LDAPExtensionError('unknown substrate remaining') diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/startTransaction.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/startTransaction.py new file mode 100644 index 0000000..6179cb0 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/novell/startTransaction.py @@ -0,0 +1,56 @@ +""" +""" + +# Created on 2016.04.14 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...extend.operation import ExtendedOperation +from ...protocol.novell import CreateGroupTypeRequestValue, CreateGroupTypeResponseValue, GroupingControlValue +from ...protocol.controls import build_control + + +class StartTransaction(ExtendedOperation): + def config(self): + self.request_name = '2.16.840.1.113719.1.27.103.1' + self.response_name = '2.16.840.1.113719.1.27.103.1' + self.request_value = CreateGroupTypeRequestValue() + self.asn1_spec = CreateGroupTypeResponseValue() + + def __init__(self, connection, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + self.request_value['createGroupType'] = '2.16.840.1.113719.1.27.103.7' # transactionGroupingType + + def populate_result(self): + self.result['cookie'] = int(self.decoded_response['createGroupCookie']) + try: + self.result['value'] = self.decoded_response['createGroupValue'] + except TypeError: + self.result['value'] = None + + def set_response(self): + try: + grouping_cookie_value = GroupingControlValue() + grouping_cookie_value['groupingCookie'] = self.result['cookie'] + self.response_value = build_control('2.16.840.1.113719.1.27.103.7', True, grouping_cookie_value, encode_control_value=True) # groupingControl + except TypeError: + self.response_value = None + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/operation.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/operation.py new file mode 100644 index 0000000..fcfdad4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/operation.py @@ -0,0 +1,98 @@ +""" +""" + +# Created on 2014.07.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..core.results import RESULT_SUCCESS +from ..core.exceptions import LDAPExtensionError +from ..utils.asn1 import decoder + + +class ExtendedOperation(object): + def __init__(self, connection, controls=None): + self.connection = connection + self.decoded_response = None + self.result = None + self.asn1_spec = None # if None the response_value is returned without encoding + self.request_name = None + self.response_name = None + self.request_value = None + self.response_value = None + self.response_attribute = None + self.controls = controls + self.config() + + def send(self): + if self.connection.check_names and self.connection.server.info is not None and self.connection.server.info.supported_extensions is not None: # checks if extension is supported + for request_name in self.connection.server.info.supported_extensions: + if request_name[0] == self.request_name: + break + else: + raise LDAPExtensionError('extension not in DSA list of supported extensions') + + resp = self.connection.extended(self.request_name, self.request_value, self.controls) + if not self.connection.strategy.sync: + _, result = self.connection.get_response(resp) + else: + if self.connection.strategy.thread_safe: + _, result, _, _ = resp + else: + result = self.connection.result + self.result = result + self.decode_response(result) + self.populate_result() + self.set_response() + return self.response_value + + def populate_result(self): + pass + + def decode_response(self, response=None): + if not response: + response = self.result + if not response: + return None + if response['result'] not in [RESULT_SUCCESS]: + if self.connection.raise_exceptions: + raise LDAPExtensionError('extended operation error: ' + response['description'] + ' - ' + response['message']) + else: + return None + if not self.response_name or response['responseName'] == self.response_name: + if response['responseValue']: + if self.asn1_spec is not None: + decoded, unprocessed = decoder.decode(response['responseValue'], asn1Spec=self.asn1_spec) + if unprocessed: + raise LDAPExtensionError('error decoding extended response value') + self.decoded_response = decoded + else: + self.decoded_response = response['responseValue'] + else: + raise LDAPExtensionError('invalid response name received') + + def set_response(self): + self.response_value = self.result[self.response_attribute] if self.result and self.response_attribute in self.result else None + if not self.connection.strategy.thread_safe: + self.connection.response = self.response_value + + def config(self): + pass diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PagedSearch.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PagedSearch.py new file mode 100644 index 0000000..a0f986e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PagedSearch.py @@ -0,0 +1,146 @@ +""" +""" + +# Created on 2014.07.08 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ... import SUBTREE, DEREF_ALWAYS +from ...utils.dn import safe_dn +from ...core.results import DO_NOT_RAISE_EXCEPTIONS, RESULT_SIZE_LIMIT_EXCEEDED +from ...core.exceptions import LDAPOperationResult +from ...utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, NETWORK, EXTENDED + + +def paged_search_generator(connection, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=100, + paged_criticality=False): + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + responses = [] + original_connection = None + original_auto_referrals = connection.auto_referrals + connection.auto_referrals = False # disable auto referrals because it cannot handle paged searches + cookie = True # performs search operation at least one time + cachekey = None # for referrals cache + while cookie: + result = connection.search(search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality, + None if cookie is True else cookie) + + if not connection.strategy.sync: + response, result = connection.get_response(result) + else: + if connection.strategy.thread_safe: + _, result, response, _ = result + else: + response = connection.response + result = connection.result + + if result['referrals'] and original_auto_referrals: # if rererrals are returned start over the loop with a new connection to the referral + if not original_connection: + original_connection = connection + _, connection, cachekey = connection.strategy.create_referral_connection(result['referrals']) # change connection to a valid referrals + continue + + responses.extend(response) + try: + cookie = result['controls']['1.2.840.113556.1.4.319']['value']['cookie'] + except KeyError: + cookie = None + + if connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'paged search operation result <%s> for <%s>', result, connection) + if result['result'] == RESULT_SIZE_LIMIT_EXCEEDED: + while responses: + yield responses.pop() + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + while responses: + yield responses.pop() + + if original_connection: + connection = original_connection + if connection.use_referral_cache and cachekey: + connection.strategy.referral_cache[cachekey] = connection + else: + connection.unbind() + + connection.auto_referrals = original_auto_referrals + connection.response = None + + +def paged_search_accumulator(connection, + search_base, + search_filter, + search_scope=SUBTREE, + dereference_aliases=DEREF_ALWAYS, + attributes=None, + size_limit=0, + time_limit=0, + types_only=False, + get_operational_attributes=False, + controls=None, + paged_size=100, + paged_criticality=False): + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + responses = [] + for response in paged_search_generator(connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + get_operational_attributes, + controls, + paged_size, + paged_criticality): + responses.append(response) + + connection.response = responses + return responses diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PersistentSearch.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PersistentSearch.py new file mode 100644 index 0000000..b25ec68 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/PersistentSearch.py @@ -0,0 +1,137 @@ +""" +""" + +# Created on 2016.07.08 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from queue import Empty +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Empty + +from ...core.exceptions import LDAPExtensionError +from ...protocol.persistentSearch import persistent_search_control +from ... import SEQUENCE_TYPES +from ...utils.dn import safe_dn + + +class PersistentSearch(object): + def __init__(self, + connection, + search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + controls, + changes_only, + events_type, + notifications, + streaming, + callback + ): + if connection.strategy.sync: + raise LDAPExtensionError('Persistent Search needs an asynchronous streaming connection') + + if connection.check_names and search_base: + search_base = safe_dn(search_base) + + self.connection = connection + self.changes_only = changes_only + self.notifications = notifications + self.message_id = None + self.base = search_base + self.filter = search_filter + self.scope = search_scope + self.dereference_aliases = dereference_aliases + self.attributes = attributes + self.size_limit = size_limit + self.time_limit = time_limit + self.connection.strategy.streaming = streaming + if callback and callable(callback): + self.connection.strategy.callback = callback + elif callback: + raise LDAPExtensionError('callback is not callable') + + if not isinstance(controls, SEQUENCE_TYPES): + self.controls = [] + else: + self.controls = controls + + if events_type and changes_only and notifications: + self.controls.append(persistent_search_control(events_type, changes_only, notifications)) + self.start() + + def start(self): + if self.message_id: # persistent search already started + return + + if not self.connection.bound: + self.connection.bind() + + with self.connection.strategy.async_lock: + self.message_id = self.connection.search(search_base=self.base, + search_filter=self.filter, + search_scope=self.scope, + dereference_aliases=self.dereference_aliases, + attributes=self.attributes, + size_limit=self.size_limit, + time_limit=self.time_limit, + controls=self.controls) + self.connection.strategy.persistent_search_message_id = self.message_id + + def stop(self, unbind=True): + self.connection.abandon(self.message_id) + if unbind: + self.connection.unbind() + if self.message_id in self.connection.strategy._responses: + del self.connection.strategy._responses[self.message_id] + if hasattr(self.connection.strategy, '_requests') and self.message_id in self.connection.strategy._requests: # asynchronous strategy has a dict of request that could be returned by get_response() + del self.connection.strategy._requests[self.message_id] + self.connection.strategy.persistent_search_message_id = None + self.message_id = None + + def next(self, block=False, timeout=None): + if not self.connection.strategy.streaming and not self.connection.strategy.callback: + try: + return self.connection.strategy.events.get(block, timeout) + except Empty: + return None + + raise LDAPExtensionError('Persistent search is not accumulating events in queue') + + def funnel(self, block=False, timeout=None): + done = False + while not done: + try: + entry = self.connection.strategy.events.get(block, timeout) + except Empty: + yield None + if entry['type'] == 'searchResEntry': + yield entry + else: + done = True + + yield entry diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/PagedSearch.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/PagedSearch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98ab1e460498a0fb3d5eabf4e31471434de6bd61 GIT binary patch literal 2382 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 Su*uC&Da}c>0~!4ph#3I&BPCV< literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/modifyPassword.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/modifyPassword.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..598e730aa17e1bffb3cd5271f408b2537c38861d GIT binary patch literal 1983 zcmZ8iOK;pZ5GM6ntyX>pZS1rSl0yq@(X8XR4SFzwyqu(fyD@C14_*jGq;1)Hh2%C~ zLji(ruD$e-LwiY&MgKs53$H!(FZ9$QwRRFq%i)k5j>zwunY}wR6Crqh|BLg#XAt_w z3{D>pl-tl`4T2$p7-mk63x_z^=x**79`UU1<$e*6py-f}9s7A$bV=9hK^_%7(zALe zkBb>HWA!kfE#}A^Mh_9|vgj3J5%(r8nPfe{&nHYeXM(r?(96;xKD?VhZ`_l z*f>_aWSl*&xkyx2m3>DqZ6#7ZXWv#V+Z%85XCp4vcS%0tdinhoSy!dxb_sk12Z=o3 z478=6l00LH;#6iuopV|nhm|mE9hvNL%1TgYw>Ng4Z0^#XC-?4c?Chj)!m}p;?KU*| z83>LD2Gksb+ABm{7BY|duQ2ggz&bGFGZ*gJ)wAuH?J41NDTdAFF}(xr9yECc1j7xY zNZ|>B-chdYJ?6m3X9#?`!;_1vgSElU!Rp{k({5Z}gKiamIxhM1w^s^CELx0cnG{_3 z;9k$1P5}}lF3fF6H<9Hkl{HWGqTnrdG*L=qPe+Oa9-id+-k(U!gY|z8S5#52)LDHk zE2T>E{91kV)&Ab`*W;C(CH2}=a?9TeSd=UgY^AWIodPhZ$2v%>axdFAILZ(N!T}E9 zJ^A2$um-K&FttWtXL@rP3)*W?6nX=&HMr^g;bPP{;`0U{I^v3Q8)t%FI1Rve=rO#G z8dq#8zj0MCapYaqXB}Jn<`7c-De}1%MA0UIXwSg;F)X3XdG|vhnN= zZylA3s@uShCYZEdV9rwI4@o?dTztcLsWLU*CEY4#ZKRSeaMh~)NSHL#A*ETFDN0E% zJ>cn)Wlf4MtO>|lq@zq)$jg*#|LIt9DGU_CWRU29=!as?8UkV^PfgZn&zyk7@Zqz_ z5HT2$S(6ns$@eRfse^)eGRc(=VXG2VE-l%uSTO!CfcOHMybJ>2S?pQ5BIqOgw*5Sg zos)~_2t2*mS=gJ9H$}-Z_y&~mB?SS0h#6i+6X5dDFa~UVkII)GQr=M{e#4M0z%HyY zXBjCUSa`q;;#1pliy2O)BhZ4wj(E*{7MMcy0>fVG+3dDnI@3O!_T6b8EhE1VApqS$XNXx<$A8J>QQd0WqaLQU@sRzAnf2v z5CZTzF=T9vPcEOM{M^=lFtkrUFkx=W5v4k!6sp1q$}rV2rO!r5-mVDq5gT#hs?ki{ zc}LiI?7`fp(4;A0P&R^SQJA@5e?fOBWmO7Z+uR`YZ7~{Dr~f53;mCX~DpjRbJ`j89 z+Vz_^Y>8}ZVmwk=E(h&DhfOZBcxEmWnGcMx`A5RmmX$VFNo;X$A(Jg5=3wt!z~0B) YLWk=u0=G;YNi**)#egTIQTzJ;13=CC9RL6T literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/whoAmI.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/__pycache__/whoAmI.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f898987cd4a9d19fa65a0593f268d857e3eb816 GIT binary patch literal 860 zcmZ8f&2G~`5T3OiC$$m?Jy0Q`!hwsC>NE`?geoYY3b=#=NCjV3CcA0f`e(blrcKma z`xZO_;*EUe#4B)O#%WMsrJ0?bo!@WfRj(HSo^L;-%v%6I>9IT>3VTRq8<~I@1QSli zawm2e$!_N6UhFY=1Hu!nD-bQ|T)J^f_#Yr_*DUzuqG!nJTl?o$7D9^mO6tU>Wr51T zmb@y`Nh#z6&Hf$-r9C8b7ny{ZVQPm`UqS2&S9o}1I!xi${=rfCGJiK=XiA4}@_&tF z`p5*k01m=Ij&ab(9nUw0(I|Qn4WmayJKH0?hN!FCNo9}bsR*68tL14Wjpap>%XnQ& zqsqcao>;5XFO`+pfM;Yj{SLZ=d49hb*jx=%sG{*yAQOoiU31w0 zF+ht#Bw7s4n))L(tNlq?Ow+^rR5>9J%xCl7qQ7YI_fMOYwP|yV!ff*bjzOXsk31QoX11KJPVBM2Izh#IJqaV=Eh_Bjx#@8pDGlJxdwU1FlFYe=Ta6p1D5ztgy z?c=k`Y`ykzrsTfXr4E^H<4*&|f~}F^O;xHYORS^-=. + +from ... import HASHED_NONE +from ...extend.operation import ExtendedOperation +from ...protocol.rfc3062 import PasswdModifyRequestValue, PasswdModifyResponseValue +from ...utils.hashed import hashed +from ...protocol.sasl.sasl import validate_simple_password +from ...utils.dn import safe_dn +from ...core.results import RESULT_SUCCESS + +# implements RFC3062 + + +class ModifyPassword(ExtendedOperation): + def config(self): + self.request_name = '1.3.6.1.4.1.4203.1.11.1' + self.request_value = PasswdModifyRequestValue() + self.asn1_spec = PasswdModifyResponseValue() + self.response_attribute = 'new_password' + + def __init__(self, connection, user=None, old_password=None, new_password=None, hash_algorithm=None, salt=None, controls=None): + ExtendedOperation.__init__(self, connection, controls) # calls super __init__() + if user: + if connection.check_names: + user = safe_dn(user) + self.request_value['userIdentity'] = user + if old_password: + if not isinstance(old_password, bytes): # bytes are returned raw, as per RFC (4.2) + old_password = validate_simple_password(old_password, True) + self.request_value['oldPasswd'] = old_password + if new_password: + if not isinstance(new_password, bytes): # bytes are returned raw, as per RFC (4.2) + new_password = validate_simple_password(new_password, True) + if hash_algorithm is None or hash_algorithm == HASHED_NONE: + self.request_value['newPasswd'] = new_password + else: + self.request_value['newPasswd'] = hashed(hash_algorithm, new_password, salt) + + def populate_result(self): + try: + self.result[self.response_attribute] = str(self.decoded_response['genPasswd']) + except TypeError: # optional field can be absent, so returns True if operation is successful else False + if self.result['result'] == RESULT_SUCCESS: + self.result[self.response_attribute] = True + else: # change was not successful, raises exception if raise_exception = True in connection or returns the operation result, error code is in result['result'] + self.result[self.response_attribute] = False + if self.connection.raise_exceptions: + from ...core.exceptions import LDAPOperationResult + raise LDAPOperationResult(result=self.result['result'], description=self.result['description'], dn=self.result['dn'], message=self.result['message'], response_type=self.result['type']) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/whoAmI.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/whoAmI.py new file mode 100644 index 0000000..a6c08a8 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/extend/standard/whoAmI.py @@ -0,0 +1,40 @@ +""" +""" + +# Created on 2014.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# implements RFC4532 +from ...extend.operation import ExtendedOperation +from ...utils.conv import to_unicode + + +class WhoAmI(ExtendedOperation): + def config(self): + self.request_name = '1.3.6.1.4.1.4203.1.11.3' + self.response_attribute = 'authzid' + + def populate_result(self): + try: + self.result['authzid'] = to_unicode(self.decoded_response) if self.decoded_response else None + except TypeError: + self.result['authzid'] = self.decoded_response if self.decoded_response else None diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b68b775b181da5a2dcc30b8602589ed4795585c GIT binary patch literal 146 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vSza+OnzaXjpvA`Hg<`<+EC6;97=jq4CXXa&=#K-FuRNmsS$<0qG N%}KQb8TuKB82}9zBN+ey literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/abandon.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/abandon.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fe66705f160fb38d7cfb894fead74111ab3364a GIT binary patch literal 518 zcmYk3y-ve05P3!VV+ zMqZhC1t!jES~%&>KHvH7^ZBaR>mZQ#PsWso(3f@A;=twtR2_h!C_xlcr@*C?IHjAo z7*UscZz%C-i~6v(Xz+ld(BRIuy&5@Y>+&(JD6j6>^NcBN+ILK;bjogTG7K43Y^Do( z4XXNJG}3s1mUxL@@d86ZJdPY`QzQUF)xK9i>Ez{P9v3tfhmGZe$yDdOiqjR{P|VGCvnQMA9+b2r0mLqrA*>r_%f4amfKXr8~-}l*~q$Gcvf;cE7-X$t?aqC+jm3%7g9%Z4*&oF literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/add.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/add.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d1bae4040a3a9fb93dd57d98bc04f34995a067f GIT binary patch literal 1604 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/compare.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/compare.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6038842c469868e2bd1011b52dd13a1752f3204 GIT binary patch literal 1454 zcmZ8hOK;pZ5GJM7W3>;j9k;em^|3m{M$j543ZsZ)Bd2x|q(Be62#iQ?)aX@`Yt(>p z+Fbh!nnQw|g8n03d+J~4sWa3*j0)IK!x>VXZ|0kQHkl*@oSbxJ8zEC_NBoXwrpZK+8(8iuc`KFTrAB92XfuDFM?e4{s4Br4 zU&Bwo05D`l-bRLYbVa*J&`V-Go!ut*~nLQV>^RhX(8AYkiN zfDi+uL+gp!4!4)s!1aKQ_!0=qI)}2bP{W-SXG4f#%NnI7_=Pzk@pNTqz^}pYr zo2or;i}rC*Ys1U(ar@?Car^ss_vfYH?Kf*|TB$fT<~;A)de+|C{k5HKqo?pmJp~|1 zNXPWlLySH3C3td*et1w(NX|9lYcLGyK*A?b)VCDcL4=2P2ckY9fP)hvg7>~Fup^=H z2DOiH0Fe6scX(<9e(P(aQcpd?jY!@x?%@lJA8qnq*JPul3kYhgH-YRE8d7x(_BMay zfo*d6KLul#zo9Gg!TU%)_&uYK6y&t#<1Apbq9yp3sbNx4D-SAnysKQlVN<$G*tafSLJ#O6RbSz!{Q3NOdSIh0 z6HT6FY}TsAGNfxO;>nX<|GVkH&h#VVn9R27JJXV@{IzR7 yo9^7Nidr~IPKU0UF0BWw96u+D__AumvXnodOf~9ja6F@@poDQmD51$-9Q_As25>C^ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/delete.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/delete.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac997a343cb8125ba37c2e1295257b4983d8ea37 GIT binary patch literal 908 zcmZ8fOOMkq5VoCX({|NGJTKfh2v1i&dwWer0VG0cd- zC84Brs8hPs#n$Htuk@)8*k#@)L<8ot0M?L&Yy|6wMXyjiHaPlWpNt(7Ex9=7?>Ag& z<3C?MeYs3bbk5aA=(C#f7@I@MS6s?Ws8rXfD3s1I+_l5L;lMnDsb*j_()a@H@D6{( z7Z_6EBqq`xkuI2+7{V$O$S&bmBuC)=^=P5XX3-SQQBf(K331fCJ6W$jJlrk>%bNSW zts5>gUDVZraltj8H(N97U^>L^!h_1@LS#bZ7}kNUWj(N+z=mOsEZf2|C5iEPrR5gB z>?kc`EJHZcGVF{kkGa_=?7v_oVMVU*K}=aW5S9mE|4ABvqm}3sfKAEp9Z0M34qcKf zbm?@SE392Wq>WkRw8#VGTEx6B9uV~t8p)wRbW~W-^k-y+dWou5u zeeq(?_}witW?bd6Xsnddax+2MA0O?HtJpVA0dhbmB6_gqI>}1TUS|S2#RUCcP9Z9N zFd!PFQcYbc{=a0m2FbekUb7hPskY~Fgs;Jju)G1jB#umwrmW7>l+GGi>pHK+T(0s5 zC&$Nsx~b{NC)^P9nh8ym|B9%=5h8`^}6$YcxU&pPzpd z;_4a8`hy1Jj|1fsH1!h%w<3!(ZYM0YBb$-#Bu?r^E_9byl1l1Dp3%L;PlG5(t5G!# zqcE*SHDmXadfJE@Mh}vibT*nbdNr9#=c9S(%e=T5&aTB%a_nE^Ki>*uH-B{!WOM2%WL<#TIek;d)W?#!KW%)zpF)hWEcMW=AEst zzPR7Hb?^3_t)`pL-r3h8!suCIN1{jJuk(! zkTOnGNB28PPiYuEk##W{S_tD_)}v9oOGwhkMXR9QLQ~Hnv^BDxI+_iw5gR(3ZCFDl zuWEb9v@^1yxw|9!J?-yS<))eA>tNf)yv^a*-@MI=LLBWnOuBpoPk- z)WyK&KvL#SHyVfRWPmkllt0jULRd!Ctluec%l*>xt0m83<=;2fbUIiY^afYV?AY`n2{cKH?(F^+9lAxnuNYW}Q%*kgl``W8 zg?{KE;|FFnJjmG9Y(z+T<-8Y#Zsxtvelarh{E@}|mp-rw+EFMchYc4;thHhMPl)^g1{5?lNY9yEGjT%-83`%SeAB?U`e#M z5%ct(&jSS^k#;ZEqBG8HyzjeMp=eLEZ}~3z$!_V?Pwu%tF);UB!7!Ykf^S2-AR89l zV;rno#m&cEj2+}d45M@9asLPM2c^Aw${udu?7?3v`+C_oHmv;wad7s&N1WT%ci%p> zhc-9scWwELb}=%nFIGQ(R(faP{T+KS-pTJ%+*!;-+{e#w7N%>Bix3v`*dm)_EBFTVwHI(vQd?x9vuMlr zG3Vb4{W&~Eq4#eN3H0j*bW?D^dKCnj3?|3mkS(&VkvMgCUix238z=;pDSFcgiV%q}*+_dGF|EH(~0H=2QmI%wDiG1wD8zJG0)ve^TQYwr&AKuyL~BI#f_v)EiqH}b-&wBT5`Ml z;kEVk>04_q9`n8)o7L@SAdfcXkHS6OOH_+?V4mQyfhHA*&}(KM0&|y`BWlWLk~xNq p!N@!(?rmYmI2$tp(7qz<#F%WR67Lp|!i>%xoS z^{AJ48l_d*)c(bp;|;jn+rW=z5iY znqD8hxP7pH^wnfNrP1itOfGg>uZlalF`B4uZH9}nTd<(G0s;jNws3&k*ul+8ui~r5 z6=9KEUY2F2p&~Idxo;% zVEAO-GKJ)P8HRh9f2_T9rnUGKEVVidd{zq0Xqv?GDU1mn0D_SDXQ2NVnhPCOXm`Ol z9oiJVG2Ws#W*zKX3=EtFTUo#~NWg|ZU?n7AzqTO(XGj9RxOB)8O`?Om5Hg9km=Mtc zgBv}PfDPIo5^sJX!PV;2vs8ngy2V_efS$xZgxH8bcNaZJnF*9e|5r%+fXN|{g+A4{ zlu+)h&9A~JUjhN7f~^DqU9k6yc5YF$dVF5B?_r*({%BCOW%!_WpX;^E;qZR%qH@EK z7I7FVRPl=I0&`mneF1V^Rni^tLKbn6-r)Q37q@TTJRwd^)&;-bqwOrQ1p;sE0qCn# zPOTXi`Af!Sg@~H26>&e%+iL(;M_t8yD(4C^6r}kgK zp*;=d)8T@$4X=toaKZ?u z+{tO-FsE>tTX@VXeC8Jc3yKzNQCxTPcF|!S&_f>Z)+J?K-sYW4!g{>Rd+-gpe?a;( zhIW5C5Vs$gxxI>KN9TiRC_apY(k6H_c=dJ=nc1Pp6P2+ttF}OBazQ?OnvTf@ z9ebQ^677ts)g92?v14_2lZ;*YLVIJ^+8)>*l;TIm7p0cxCMd<3a1SLN~M!LU#U+wj*mV)J73FrQa_%^3Sa|dt8%SqurF8ZbFnUvx@4E$mt7Sh+CXfg&iECZlcbF2mca~C!EddtA5(~jI}^eg9@ z$Q|noD;KnMIN|2-qR#FbJa6hy~Eh@}JTth$3@%mg+~atlA(5?b=7)0sXJiv3<7mZBTBNPA>=+ zcI7r;TvOl<;SCr*Xci1RXN!h{@n{4Q>&hE8vrdud^hEGM#M)C@vjv_d$7Q8-mhK6q zl4Ak%37Wr5j|-K`tj7LIY#r-Ne^jPbO#B1mX24pkjLjYk9VLa}79wz(*m4P0CEN=H z4i)UK>Z(-YU+nJP#;$Rhg7+MLRrZDf=oTCJ?qfLTFoHXv700|v{@-IVN%)4JtM9Xt+Y~J&ZF3}UaVtyPYuo1bCgeKG#TH&Y3fbh{eL%w=^tRV- F{RX~3LG%Cs literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/search.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/search.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abf2b6c11b4815298ef171f0d4a80a684ecb9430 GIT binary patch literal 16250 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/unbind.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/__pycache__/unbind.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1f673ec249fafe0bd9e2244f1aa3369cfc9591c GIT binary patch literal 339 zcmYjM!Ait15S^smRu&6;^q?Qm!){r0K|w_Hz6ZriFQGPBDW*+KQ*c2~`WJqI_(!>V z^6tr#ldOsZ?`1MGFK=>|Wn;j2c@yF@0(keA-=LVBBKln<4kd8HsU$5eDFGhw_!-KG zk1iok92tN3@tnBqs=IDFej)A#(c2n}AqcX^IimNT7M|b{9suQJnG=KVUY?qb@D. + +from ..protocol.rfc4511 import AbandonRequest, MessageID + + +def abandon_operation(msg_id): + # AbandonRequest ::= [APPLICATION 16] MessageID + request = AbandonRequest(MessageID(msg_id)) + return request + + +def abandon_request_to_dict(request): + return {'messageId': str(request)} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/add.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/add.py new file mode 100644 index 0000000..d0b95b4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/add.py @@ -0,0 +1,72 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SEQUENCE_TYPES +from ..protocol.rfc4511 import AddRequest, LDAPDN, AttributeList, Attribute, AttributeDescription, ResultCode, Vals +from ..protocol.convert import referrals_to_list, attributes_to_dict, validate_attribute_value, prepare_for_sending + + +def add_operation(dn, + attributes, + auto_encode, + schema=None, + validator=None, + check_names=False): + # AddRequest ::= [APPLICATION 8] SEQUENCE { + # entry LDAPDN, + # attributes AttributeList } + # + # attributes is a dictionary in the form 'attribute': ['val1', 'val2', 'valN'] + attribute_list = AttributeList() + for pos, attribute in enumerate(attributes): + attribute_list[pos] = Attribute() + attribute_list[pos]['type'] = AttributeDescription(attribute) + vals = Vals() # changed from ValsAtLeast1() for allowing empty member value in groups + if isinstance(attributes[attribute], SEQUENCE_TYPES): + for index, value in enumerate(attributes[attribute]): + vals.setComponentByPosition(index, prepare_for_sending(validate_attribute_value(schema, attribute, value, auto_encode, validator, check_names))) + else: + vals.setComponentByPosition(0, prepare_for_sending(validate_attribute_value(schema, attribute, attributes[attribute], auto_encode, validator, check_names))) + + attribute_list[pos]['vals'] = vals + + request = AddRequest() + request['entry'] = LDAPDN(dn) + request['attributes'] = attribute_list + + return request + + +def add_request_to_dict(request): + return {'entry': str(request['entry']), + 'attributes': attributes_to_dict(request['attributes'])} + + +def add_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/bind.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/bind.py new file mode 100644 index 0000000..43ad1fb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/bind.py @@ -0,0 +1,160 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SIMPLE, ANONYMOUS, SASL, STRING_TYPES +from ..core.results import RESULT_CODES +from ..core.exceptions import LDAPUserNameIsMandatoryError, LDAPPasswordIsMandatoryError, LDAPUnknownAuthenticationMethodError, LDAPUserNameNotAllowedError +from ..protocol.sasl.sasl import validate_simple_password +from ..protocol.rfc4511 import Version, AuthenticationChoice, Simple, BindRequest, ResultCode, SaslCredentials, BindResponse, \ + LDAPDN, LDAPString, Referral, ServerSaslCreds, SicilyPackageDiscovery, SicilyNegotiate, SicilyResponse +from ..protocol.convert import authentication_choice_to_dict, referrals_to_list +from ..utils.conv import to_unicode, to_raw + +# noinspection PyUnresolvedReferences +def bind_operation(version, + authentication, + name='', + password=None, + sasl_mechanism=None, + sasl_credentials=None, + auto_encode=False): + # BindRequest ::= [APPLICATION 0] SEQUENCE { + # version INTEGER (1 .. 127), + # name LDAPDN, + # authentication AuthenticationChoice } + request = BindRequest() + request['version'] = Version(version) + if name is None: + name = '' + if isinstance(name, STRING_TYPES): + request['name'] = to_unicode(name) if auto_encode else name + if authentication == SIMPLE: + if not name: + raise LDAPUserNameIsMandatoryError('user name is mandatory in simple bind') + if password: + request['authentication'] = AuthenticationChoice().setComponentByName('simple', Simple(validate_simple_password(password))) + else: + raise LDAPPasswordIsMandatoryError('password is mandatory in simple bind') + elif authentication == SASL: + sasl_creds = SaslCredentials() + sasl_creds['mechanism'] = sasl_mechanism + if sasl_credentials is not None: + sasl_creds['credentials'] = sasl_credentials + # else: + # sasl_creds['credentials'] = None + request['authentication'] = AuthenticationChoice().setComponentByName('sasl', sasl_creds) + elif authentication == ANONYMOUS: + if name: + raise LDAPUserNameNotAllowedError('user name not allowed in anonymous bind') + request['name'] = '' + request['authentication'] = AuthenticationChoice().setComponentByName('simple', Simple('')) + elif authentication == 'SICILY_PACKAGE_DISCOVERY': # https://msdn.microsoft.com/en-us/library/cc223501.aspx + request['name'] = '' + request['authentication'] = AuthenticationChoice().setComponentByName('sicilyPackageDiscovery', SicilyPackageDiscovery('')) + elif authentication == 'SICILY_NEGOTIATE_NTLM': # https://msdn.microsoft.com/en-us/library/cc223501.aspx + request['name'] = 'NTLM' + request['authentication'] = AuthenticationChoice().setComponentByName('sicilyNegotiate', SicilyNegotiate(name.create_negotiate_message())) # ntlm client in self.name + elif authentication == 'SICILY_RESPONSE_NTLM': # https://msdn.microsoft.com/en-us/library/cc223501.aspx + name.parse_challenge_message(password) # server_creds returned by server in password + server_creds = name.create_authenticate_message() + if server_creds: + request['name'] = '' + request['authentication'] = AuthenticationChoice().setComponentByName('sicilyResponse', SicilyResponse(server_creds)) + else: + request = None + else: + raise LDAPUnknownAuthenticationMethodError('unknown authentication method') + + return request + + +def bind_request_to_dict(request): + return {'version': int(request['version']), + 'name': str(request['name']), + 'authentication': authentication_choice_to_dict(request['authentication'])} + + +def bind_response_operation(result_code, + matched_dn='', + diagnostic_message='', + referral=None, + server_sasl_credentials=None): + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + response = BindResponse() + response['resultCode'] = ResultCode(result_code) + response['matchedDN'] = LDAPDN(matched_dn) + response['diagnosticMessage'] = LDAPString(diagnostic_message) + if referral: + response['referral'] = Referral(referral) + + if server_sasl_credentials: + response['serverSaslCreds'] = ServerSaslCreds(server_sasl_credentials) + + return response + + +def bind_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral']) if response['referral'] is not None and response['referral'].hasValue() else [], + 'saslCreds': bytes(response['serverSaslCreds']) if response['serverSaslCreds'] is not None and response['serverSaslCreds'].hasValue() else None} + + +def sicily_bind_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'server_creds': bytes(response['matchedDN']), + 'error_message': str(response['diagnosticMessage'])} + + +def bind_response_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['dn'] = to_unicode(response[1][3], from_server=True) # matchedDN + response_dict['message'] = to_unicode(response[2][3], from_server=True) # diagnosticMessage + response_dict['referrals'] = None # referrals + response_dict['saslCreds'] = None # saslCreds + for r in response[3:]: + if r[2] == 3: # referrals + response_dict['referrals'] = referrals_to_list(r[3]) # referrals + else: + response_dict['saslCreds'] = bytes(r[3]) # saslCreds + + return response_dict + + +def sicily_bind_response_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['server_creds'] = bytes(response[1][3]) # server_creds + response_dict['error_message'] = to_unicode(response[2][3], from_server=True) # error_message + + return response_dict diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/compare.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/compare.py new file mode 100644 index 0000000..2232f61 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/compare.py @@ -0,0 +1,64 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.convert import validate_attribute_value, prepare_for_sending +from ..protocol.rfc4511 import CompareRequest, AttributeValueAssertion, AttributeDescription, LDAPDN, AssertionValue, ResultCode +from ..operation.search import ava_to_dict +from ..operation.bind import referrals_to_list + + +def compare_operation(dn, + attribute, + value, + auto_encode, + schema=None, + validator=None, + check_names=False): + # CompareRequest ::= [APPLICATION 14] SEQUENCE { + # entry LDAPDN, + # ava AttributeValueAssertion } + ava = AttributeValueAssertion() + ava['attributeDesc'] = AttributeDescription(attribute) + ava['assertionValue'] = AssertionValue(prepare_for_sending(validate_attribute_value(schema, attribute, value, auto_encode, validator, check_names=check_names))) + + request = CompareRequest() + request['entry'] = LDAPDN(dn) + request['ava'] = ava + + return request + + +def compare_request_to_dict(request): + ava = ava_to_dict(request['ava']) + return {'entry': str(request['entry']), + 'attribute': ava['attribute'], + 'value': ava['value']} + + +def compare_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/delete.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/delete.py new file mode 100644 index 0000000..2db40f4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/delete.py @@ -0,0 +1,46 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.rfc4511 import DelRequest, LDAPDN, ResultCode +from ..operation.bind import referrals_to_list + + +def delete_operation(dn): + # DelRequest ::= [APPLICATION 10] LDAPDN + request = DelRequest(LDAPDN(dn)) + + return request + + +def delete_request_to_dict(request): + return {'entry': str(request)} + + +def delete_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/extended.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/extended.py new file mode 100644 index 0000000..4b1ebc7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/extended.py @@ -0,0 +1,109 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString +from pyasn1.type.base import Asn1Item + +from ..core.results import RESULT_CODES +from ..protocol.rfc4511 import ExtendedRequest, RequestName, ResultCode, RequestValue +from ..protocol.convert import referrals_to_list +from ..utils.asn1 import encode +from ..utils.conv import to_unicode + +# ExtendedRequest ::= [APPLICATION 23] SEQUENCE { +# requestName [0] LDAPOID, +# requestValue [1] OCTET STRING OPTIONAL } + + +def extended_operation(request_name, + request_value=None, + no_encode=None): + request = ExtendedRequest() + request['requestName'] = RequestName(request_name) + if request_value and isinstance(request_value, Asn1Item): + request['requestValue'] = RequestValue(encode(request_value)) + elif str is not bytes and isinstance(request_value, (bytes, bytearray)): # in Python 3 doesn't try to encode a byte value + request['requestValue'] = request_value + elif request_value and no_encode: # doesn't encode the value + request['requestValue'] = request_value + elif request_value: # tries to encode as a octet string + request['requestValue'] = RequestValue(encode(OctetString(str(request_value)))) + + # elif request_value is not None: + # raise LDAPExtensionError('unable to encode value for extended operation') + return request + + +def extended_request_to_dict(request): + # return {'name': str(request['requestName']), 'value': bytes(request['requestValue']) if request['requestValue'] else None} + return {'name': str(request['requestName']), 'value': bytes(request['requestValue']) if 'requestValue' in request and request['requestValue'] is not None and request['requestValue'].hasValue() else None} + +def extended_response_to_dict(response): + return {'result': int(response['resultCode']), + 'dn': str(response['matchedDN']), + 'message': str(response['diagnosticMessage']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'referrals': referrals_to_list(response['referral']), + 'responseName': str(response['responseName']) if response['responseName'] is not None and response['responseName'].hasValue() else str(), + 'responseValue': bytes(response['responseValue']) if response['responseValue'] is not None and response['responseValue'].hasValue() else bytes()} + + +def intermediate_response_to_dict(response): + return {'responseName': str(response['responseName']), + 'responseValue': bytes(response['responseValue']) if response['responseValue'] else bytes()} + + +def extended_response_to_dict_fast(response): + response_dict = dict() + response_dict['result'] = int(response[0][3]) # resultCode + response_dict['description'] = RESULT_CODES[response_dict['result']] + response_dict['dn'] = to_unicode(response[1][3], from_server=True) # matchedDN + response_dict['message'] = to_unicode(response[2][3], from_server=True) # diagnosticMessage + response_dict['referrals'] = None # referrals + response_dict['responseName'] = None # referrals + response_dict['responseValue'] = None # responseValue + + for r in response[3:]: + if r[2] == 3: # referrals + response_dict['referrals'] = referrals_to_list(r[3]) # referrals + elif r[2] == 10: # responseName + response_dict['responseName'] = to_unicode(r[3], from_server=True) + response_dict['responseValue'] = b'' # responseValue could be empty + + else: # responseValue (11) + response_dict['responseValue'] = bytes(r[3]) + + return response_dict + + +def intermediate_response_to_dict_fast(response): + response_dict = dict() + for r in response: + if r[2] == 0: # responseName + response_dict['responseName'] = to_unicode(r[3], from_server=True) + else: # responseValue (1) + response_dict['responseValue'] = bytes(r[3]) + + return response_dict diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modify.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modify.py new file mode 100644 index 0000000..31867e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modify.py @@ -0,0 +1,96 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SEQUENCE_TYPES, MODIFY_ADD, MODIFY_DELETE, MODIFY_REPLACE, MODIFY_INCREMENT +from ..protocol.rfc4511 import ModifyRequest, LDAPDN, Changes, Change, Operation, PartialAttribute, AttributeDescription, Vals, ResultCode +from ..operation.bind import referrals_to_list +from ..protocol.convert import changes_to_list, validate_attribute_value, prepare_for_sending + +# ModifyRequest ::= [APPLICATION 6] SEQUENCE { +# object LDAPDN, +# changes SEQUENCE OF change SEQUENCE { +# operation ENUMERATED { +# add (0), +# delete (1), +# replace (2), +# ... }, +# modification PartialAttribute } } + +change_table = {MODIFY_ADD: 0, # accepts actual values too + MODIFY_DELETE: 1, + MODIFY_REPLACE: 2, + MODIFY_INCREMENT: 3, + 0: 0, + 1: 1, + 2: 2, + 3: 3} + + +def modify_operation(dn, + changes, + auto_encode, + schema=None, + validator=None, + check_names=False): + # changes is a dictionary in the form {'attribute': [(operation, [val1, ...]), ...], ...} + # operation is 0 (add), 1 (delete), 2 (replace), 3 (increment) + # increment as per RFC4525 + + change_list = Changes() + pos = 0 + for attribute in changes: + for change_operation in changes[attribute]: + partial_attribute = PartialAttribute() + partial_attribute['type'] = AttributeDescription(attribute) + partial_attribute['vals'] = Vals() + if isinstance(change_operation[1], SEQUENCE_TYPES): + for index, value in enumerate(change_operation[1]): + partial_attribute['vals'].setComponentByPosition(index, prepare_for_sending(validate_attribute_value(schema, attribute, value, auto_encode, validator, check_names=check_names))) + else: + partial_attribute['vals'].setComponentByPosition(0, prepare_for_sending(validate_attribute_value(schema, attribute, change_operation[1], auto_encode, validator, check_names=check_names))) + change = Change() + change['operation'] = Operation(change_table[change_operation[0]]) + change['modification'] = partial_attribute + + change_list[pos] = change + pos += 1 + + request = ModifyRequest() + request['object'] = LDAPDN(dn) + request['changes'] = change_list + return request + + +def modify_request_to_dict(request): + return {'entry': str(request['object']), + 'changes': changes_to_list(request['changes'])} + + +def modify_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'message': str(response['diagnosticMessage']), + 'dn': str(response['matchedDN']), + 'referrals': referrals_to_list(response['referral'])} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modifyDn.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modifyDn.py new file mode 100644 index 0000000..73c6da3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/modifyDn.py @@ -0,0 +1,62 @@ +""" +""" + +# Created on 2013.05.31 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.rfc4511 import ModifyDNRequest, LDAPDN, RelativeLDAPDN, DeleteOldRDN, NewSuperior, ResultCode +from ..operation.bind import referrals_to_list + +# ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { +# entry LDAPDN, +# newrdn RelativeLDAPDN, +# deleteoldrdn BOOLEAN, +# newSuperior [0] LDAPDN OPTIONAL } + + +def modify_dn_operation(dn, + new_relative_dn, + delete_old_rdn=True, + new_superior=None): + request = ModifyDNRequest() + request['entry'] = LDAPDN(dn) + request['newrdn'] = RelativeLDAPDN(new_relative_dn) + request['deleteoldrdn'] = DeleteOldRDN(delete_old_rdn) + if new_superior: + request['newSuperior'] = NewSuperior(new_superior) + + return request + + +def modify_dn_request_to_dict(request): + return {'entry': str(request['entry']), + 'newRdn': str(request['newrdn']), + 'deleteOldRdn': bool(request['deleteoldrdn']), + 'newSuperior': str(request['newSuperior']) if request['newSuperior'] is not None and request['newSuperior'].hasValue() else None} + + +def modify_dn_response_to_dict(response): + return {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'dn': str(response['matchedDN']), + 'referrals': referrals_to_list(response['referral']), + 'message': str(response['diagnosticMessage'])} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/search.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/search.py new file mode 100644 index 0000000..e12c13c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/search.py @@ -0,0 +1,579 @@ +""" +""" + +# Created on 2013.06.02 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from string import whitespace +from os import linesep + +from .. import DEREF_NEVER, BASE, LEVEL, SUBTREE, DEREF_SEARCH, DEREF_BASE, DEREF_ALWAYS, NO_ATTRIBUTES, SEQUENCE_TYPES, get_config_parameter, STRING_TYPES + +from ..core.exceptions import LDAPInvalidFilterError, LDAPAttributeError, LDAPInvalidScopeError, LDAPInvalidDereferenceAliasesError +from ..utils.ciDict import CaseInsensitiveDict +from ..protocol.rfc4511 import SearchRequest, LDAPDN, Scope, DerefAliases, Integer0ToMax, TypesOnly, \ + AttributeSelection, Selector, EqualityMatch, AttributeDescription, AssertionValue, Filter, \ + Not, And, Or, ApproxMatch, GreaterOrEqual, LessOrEqual, ExtensibleMatch, Present, SubstringFilter, \ + Substrings, Final, Initial, Any, ResultCode, Substring, MatchingRule, Type, MatchValue, DnAttributes +from ..operation.bind import referrals_to_list +from ..protocol.convert import ava_to_dict, attributes_to_list, search_refs_to_list, validate_assertion_value, prepare_filter_for_sending, search_refs_to_list_fast +from ..protocol.formatters.standard import format_attribute_values +from ..utils.conv import to_unicode, to_raw + +ROOT = 0 +AND = 1 +OR = 2 +NOT = 3 +MATCH_APPROX = 4 +MATCH_GREATER_OR_EQUAL = 5 +MATCH_LESS_OR_EQUAL = 6 +MATCH_EXTENSIBLE = 7 +MATCH_PRESENT = 8 +MATCH_SUBSTRING = 9 +MATCH_EQUAL = 10 + +SEARCH_OPEN = 20 +SEARCH_OPEN_OR_CLOSE = 21 +SEARCH_MATCH_OR_CLOSE = 22 +SEARCH_MATCH_OR_CONTROL = 23 + + +class FilterNode(object): + def __init__(self, tag=None, assertion=None): + self.tag = tag + self.parent = None + self.assertion = assertion + self.elements = [] + + def append(self, filter_node): + filter_node.parent = self + self.elements.append(filter_node) + return filter_node + + def __str__(self, pos=0): + self.__repr__(pos) + + def __repr__(self, pos=0): + node_tags = ['ROOT', 'AND', 'OR', 'NOT', 'MATCH_APPROX', 'MATCH_GREATER_OR_EQUAL', 'MATCH_LESS_OR_EQUAL', 'MATCH_EXTENSIBLE', 'MATCH_PRESENT', 'MATCH_SUBSTRING', 'MATCH_EQUAL'] + representation = ' ' * pos + 'tag: ' + node_tags[self.tag] + ' - assertion: ' + str(self.assertion) + if self.elements: + representation += ' - elements: ' + str(len(self.elements)) + for element in self.elements: + representation += linesep + ' ' * pos + element.__repr__(pos + 2) + return representation + + +def evaluate_match(match, schema, auto_escape, auto_encode, validator, check_names): + left_part, equal_sign, right_part = match.strip().partition('=') + if not equal_sign: + raise LDAPInvalidFilterError('invalid matching assertion') + if left_part.endswith('~'): # approximate match '~=' + tag = MATCH_APPROX + left_part = left_part[:-1].strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + elif left_part.endswith('>'): # greater or equal match '>=' + tag = MATCH_GREATER_OR_EQUAL + left_part = left_part[:-1].strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + elif left_part.endswith('<'): # less or equal match '<=' + tag = MATCH_LESS_OR_EQUAL + left_part = left_part[:-1].strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + elif left_part.endswith(':'): # extensible match ':=' + tag = MATCH_EXTENSIBLE + left_part = left_part[:-1].strip() + right_part = right_part.strip() + extended_filter_list = left_part.split(':') + matching_rule = False + dn_attributes = False + attribute_name = False + if extended_filter_list[0] == '': # extensible filter format [:dn]:matchingRule:=assertionValue + if len(extended_filter_list) == 2 and extended_filter_list[1].lower().strip() != 'dn': + matching_rule = extended_filter_list[1] + elif len(extended_filter_list) == 3 and extended_filter_list[1].lower().strip() == 'dn': + dn_attributes = True + matching_rule = extended_filter_list[2] + else: + raise LDAPInvalidFilterError('invalid extensible filter') + elif len(extended_filter_list) <= 3: # extensible filter format attr[:dn][:matchingRule]:=assertionValue + if len(extended_filter_list) == 1: + attribute_name = extended_filter_list[0] + elif len(extended_filter_list) == 2: + attribute_name = extended_filter_list[0] + if extended_filter_list[1].lower().strip() == 'dn': + dn_attributes = True + else: + matching_rule = extended_filter_list[1] + elif len(extended_filter_list) == 3 and extended_filter_list[1].lower().strip() == 'dn': + attribute_name = extended_filter_list[0] + dn_attributes = True + matching_rule = extended_filter_list[2] + else: + raise LDAPInvalidFilterError('invalid extensible filter') + + if not attribute_name and not matching_rule: + raise LDAPInvalidFilterError('invalid extensible filter') + attribute_name = attribute_name.strip() if attribute_name else False + matching_rule = matching_rule.strip() if matching_rule else False + assertion = {'attr': attribute_name, 'value': validate_assertion_value(schema, attribute_name, right_part, auto_escape, auto_encode, validator, check_names), 'matchingRule': matching_rule, 'dnAttributes': dn_attributes} + elif right_part == '*': # attribute present match '=*' + tag = MATCH_PRESENT + left_part = left_part.strip() + assertion = {'attr': left_part} + elif '*' in right_part: # substring match '=initial*substring*substring*final' + tag = MATCH_SUBSTRING + left_part = left_part.strip() + right_part = right_part.strip() + substrings = right_part.split('*') + initial = validate_assertion_value(schema, left_part, substrings[0], auto_escape, auto_encode, validator, check_names) if substrings[0] else None + final = validate_assertion_value(schema, left_part, substrings[-1], auto_escape, auto_encode, validator, check_names) if substrings[-1] else None + any_string = [validate_assertion_value(schema, left_part, substring, auto_escape, auto_encode, validator, check_names) for substring in substrings[1:-1] if substring] + #assertion = {'attr': left_part, 'initial': initial, 'any': any_string, 'final': final} + assertion = {'attr': left_part} + if initial: + assertion['initial'] = initial + if any_string: + assertion['any'] = any_string + if final: + assertion['final'] = final + else: # equality match '=' + tag = MATCH_EQUAL + left_part = left_part.strip() + right_part = right_part.strip() + assertion = {'attr': left_part, 'value': validate_assertion_value(schema, left_part, right_part, auto_escape, auto_encode, validator, check_names)} + + return FilterNode(tag, assertion) + + +def parse_filter(search_filter, schema, auto_escape, auto_encode, validator, check_names): + if str is not bytes and isinstance(search_filter, bytes): # python 3 with byte filter + search_filter = to_unicode(search_filter) + search_filter = search_filter.strip() + if search_filter and search_filter.count('(') == search_filter.count(')') and search_filter.startswith('(') and search_filter.endswith(')'): + state = SEARCH_OPEN_OR_CLOSE + root = FilterNode(ROOT) + current_node = root + start_pos = None + skip_white_space = True + just_closed = False + for pos, c in enumerate(search_filter): + if skip_white_space and c in whitespace: + continue + elif (state == SEARCH_OPEN or state == SEARCH_OPEN_OR_CLOSE) and c == '(': + state = SEARCH_MATCH_OR_CONTROL + just_closed = False + elif state == SEARCH_MATCH_OR_CONTROL and c in '&!|': + if c == '&': + current_node = current_node.append(FilterNode(AND)) + elif c == '|': + current_node = current_node.append(FilterNode(OR)) + elif c == '!': + current_node = current_node.append(FilterNode(NOT)) + state = SEARCH_OPEN + elif (state == SEARCH_MATCH_OR_CLOSE or state == SEARCH_OPEN_OR_CLOSE) and c == ')': + if just_closed: + current_node = current_node.parent + else: + just_closed = True + skip_white_space = True + end_pos = pos + if start_pos: + if current_node.tag == NOT and len(current_node.elements) > 0: + raise LDAPInvalidFilterError('NOT (!) clause in filter cannot be multiple') + current_node.append(evaluate_match(search_filter[start_pos:end_pos], schema, auto_escape, auto_encode, validator, check_names)) + start_pos = None + state = SEARCH_OPEN_OR_CLOSE + elif (state == SEARCH_MATCH_OR_CLOSE or state == SEARCH_MATCH_OR_CONTROL) and c not in '()': + skip_white_space = False + if not start_pos: + start_pos = pos + state = SEARCH_MATCH_OR_CLOSE + else: + raise LDAPInvalidFilterError('malformed filter') + if len(root.elements) != 1: + raise LDAPInvalidFilterError('missing boolean operator in filter') + return root + else: + raise LDAPInvalidFilterError('invalid filter') + + +def compile_filter(filter_node): + """Builds ASN1 structure for filter, converts from filter LDAP escaping to bytes""" + compiled_filter = Filter() + if filter_node.tag == AND: + boolean_filter = And() + pos = 0 + for element in filter_node.elements: + boolean_filter[pos] = compile_filter(element) + pos += 1 + compiled_filter['and'] = boolean_filter + elif filter_node.tag == OR: + boolean_filter = Or() + pos = 0 + for element in filter_node.elements: + boolean_filter[pos] = compile_filter(element) + pos += 1 + compiled_filter['or'] = boolean_filter + elif filter_node.tag == NOT: + boolean_filter = Not() + boolean_filter['innerNotFilter'] = compile_filter(filter_node.elements[0]) + compiled_filter.setComponentByName('notFilter', boolean_filter, verifyConstraints=False) # do not verify constraints because of hack for recursive filters in rfc4511 + + elif filter_node.tag == MATCH_APPROX: + matching_filter = ApproxMatch() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter['approxMatch'] = matching_filter + elif filter_node.tag == MATCH_GREATER_OR_EQUAL: + matching_filter = GreaterOrEqual() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter['greaterOrEqual'] = matching_filter + elif filter_node.tag == MATCH_LESS_OR_EQUAL: + matching_filter = LessOrEqual() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter['lessOrEqual'] = matching_filter + elif filter_node.tag == MATCH_EXTENSIBLE: + matching_filter = ExtensibleMatch() + if filter_node.assertion['matchingRule']: + matching_filter['matchingRule'] = MatchingRule(filter_node.assertion['matchingRule']) + if filter_node.assertion['attr']: + matching_filter['type'] = Type(filter_node.assertion['attr']) + matching_filter['matchValue'] = MatchValue(prepare_filter_for_sending(filter_node.assertion['value'])) + matching_filter['dnAttributes'] = DnAttributes(filter_node.assertion['dnAttributes']) + compiled_filter['extensibleMatch'] = matching_filter + elif filter_node.tag == MATCH_PRESENT: + matching_filter = Present(AttributeDescription(filter_node.assertion['attr'])) + compiled_filter['present'] = matching_filter + elif filter_node.tag == MATCH_SUBSTRING: + matching_filter = SubstringFilter() + matching_filter['type'] = AttributeDescription(filter_node.assertion['attr']) + substrings = Substrings() + pos = 0 + if 'initial' in filter_node.assertion and filter_node.assertion['initial']: + substrings[pos] = Substring().setComponentByName('initial', Initial(prepare_filter_for_sending(filter_node.assertion['initial']))) + pos += 1 + if 'any' in filter_node.assertion and filter_node.assertion['any']: + for substring in filter_node.assertion['any']: + substrings[pos] = Substring().setComponentByName('any', Any(prepare_filter_for_sending(substring))) + pos += 1 + if 'final' in filter_node.assertion and filter_node.assertion['final']: + substrings[pos] = Substring().setComponentByName('final', Final(prepare_filter_for_sending(filter_node.assertion['final']))) + matching_filter['substrings'] = substrings + compiled_filter['substringFilter'] = matching_filter + elif filter_node.tag == MATCH_EQUAL: + matching_filter = EqualityMatch() + matching_filter['attributeDesc'] = AttributeDescription(filter_node.assertion['attr']) + matching_filter['assertionValue'] = AssertionValue(prepare_filter_for_sending(filter_node.assertion['value'])) + compiled_filter.setComponentByName('equalityMatch', matching_filter) + else: + raise LDAPInvalidFilterError('unknown filter node tag') + + return compiled_filter + + +def build_attribute_selection(attribute_list, schema): + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + + attribute_selection = AttributeSelection() + for index, attribute in enumerate(attribute_list): + if schema and schema.attribute_types: + if ';' in attribute: # exclude tags from validation + if not attribute[0:attribute.index(';')] in schema.attribute_types and attribute.lower() not in conf_attributes_excluded_from_check: + raise LDAPAttributeError('invalid attribute type in attribute list: ' + attribute) + else: + if attribute not in schema.attribute_types and attribute.lower() not in conf_attributes_excluded_from_check: + raise LDAPAttributeError('invalid attribute type in attribute list: ' + attribute) + attribute_selection[index] = Selector(attribute) + + return attribute_selection + + +def search_operation(search_base, + search_filter, + search_scope, + dereference_aliases, + attributes, + size_limit, + time_limit, + types_only, + auto_escape, + auto_encode, + schema=None, + validator=None, + check_names=False): + # SearchRequest ::= [APPLICATION 3] SEQUENCE { + # baseObject LDAPDN, + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + # ... }, + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + # sizeLimit INTEGER (0 .. maxInt), + # timeLimit INTEGER (0 .. maxInt), + # typesOnly BOOLEAN, + # filter Filter, + # attributes AttributeSelection } + request = SearchRequest() + request['baseObject'] = LDAPDN(search_base) + + if search_scope == BASE or search_scope == 0: + request['scope'] = Scope('baseObject') + elif search_scope == LEVEL or search_scope == 1: + request['scope'] = Scope('singleLevel') + elif search_scope == SUBTREE or search_scope == 2: + request['scope'] = Scope('wholeSubtree') + else: + raise LDAPInvalidScopeError('invalid scope type') + + if dereference_aliases == DEREF_NEVER or dereference_aliases == 0: + request['derefAliases'] = DerefAliases('neverDerefAliases') + elif dereference_aliases == DEREF_SEARCH or dereference_aliases == 1: + request['derefAliases'] = DerefAliases('derefInSearching') + elif dereference_aliases == DEREF_BASE or dereference_aliases == 2: + request['derefAliases'] = DerefAliases('derefFindingBaseObj') + elif dereference_aliases == DEREF_ALWAYS or dereference_aliases == 3: + request['derefAliases'] = DerefAliases('derefAlways') + else: + raise LDAPInvalidDereferenceAliasesError('invalid dereference aliases type') + + request['sizeLimit'] = Integer0ToMax(size_limit) + request['timeLimit'] = Integer0ToMax(time_limit) + request['typesOnly'] = TypesOnly(True) if types_only else TypesOnly(False) + request['filter'] = compile_filter(parse_filter(search_filter, schema, auto_escape, auto_encode, validator, check_names).elements[0]) # parse the searchFilter string and compile it starting from the root node + if not isinstance(attributes, SEQUENCE_TYPES): + attributes = [NO_ATTRIBUTES] + + request['attributes'] = build_attribute_selection(attributes, schema) + + return request + + +def decode_vals(vals): + try: + return [str(val) for val in vals if val] if vals else None + except UnicodeDecodeError: + return decode_raw_vals(vals) + +def decode_vals_fast(vals): + try: + return [to_unicode(val[3], from_server=True) for val in vals if val] if vals else None + except UnicodeDecodeError: + return [val[3] for val in vals if val] if vals else None + + +def attributes_to_dict(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[str(attribute['type'])] = decode_vals(attribute['vals']) + return attributes + + +def attributes_to_dict_fast(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[to_unicode(attribute[3][0][3], from_server=True)] = decode_vals_fast(attribute[3][1][3]) + + return attributes + + +def decode_raw_vals(vals): + return [bytes(val) for val in vals] if vals else None + + +def decode_raw_vals_fast(vals): + return [bytes(val[3]) for val in vals] if vals else None + + +def raw_attributes_to_dict(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[str(attribute['type'])] = decode_raw_vals(attribute['vals']) + + return attributes + + +def raw_attributes_to_dict_fast(attribute_list): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + attributes[to_unicode(attribute[3][0][3], from_server=True)] = decode_raw_vals_fast(attribute[3][1][3]) + + return attributes + + +def checked_attributes_to_dict(attribute_list, schema=None, custom_formatter=None): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + + checked_attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + name = str(attribute['type']) + checked_attributes[name] = format_attribute_values(schema, name, decode_raw_vals(attribute['vals']) or [], custom_formatter) + return checked_attributes + + +def checked_attributes_to_dict_fast(attribute_list, schema=None, custom_formatter=None): + conf_case_insensitive_attributes = get_config_parameter('CASE_INSENSITIVE_ATTRIBUTE_NAMES') + + checked_attributes = CaseInsensitiveDict() if conf_case_insensitive_attributes else dict() + for attribute in attribute_list: + name = to_unicode(attribute[3][0][3], from_server=True) + checked_attributes[name] = format_attribute_values(schema, name, decode_raw_vals_fast(attribute[3][1][3]) or [], custom_formatter) + return checked_attributes + + +def matching_rule_assertion_to_string(matching_rule_assertion): + return str(matching_rule_assertion) + + +def filter_to_string(filter_object): + filter_type = filter_object.getName() + filter_string = '(' + if filter_type == 'and': + filter_string += '&' + for f in filter_object['and']: + filter_string += filter_to_string(f) + elif filter_type == 'or': + filter_string += '|' + for f in filter_object['or']: + filter_string += filter_to_string(f) + elif filter_type == 'notFilter': + filter_string += '!' + filter_to_string(filter_object['notFilter']['innerNotFilter']) + elif filter_type == 'equalityMatch': + ava = ava_to_dict(filter_object['equalityMatch']) + filter_string += ava['attribute'] + '=' + ava['value'] + elif filter_type == 'substringFilter': + attribute = filter_object['substringFilter']['type'] + filter_string += str(attribute) + '=' + for substring in filter_object['substringFilter']['substrings']: + component = substring.getName() + if substring[component] is not None and substring[component].hasValue(): + if component == 'initial': + filter_string += str(substring['initial']) + '*' + elif component == 'any': + filter_string += str(substring['any']) if filter_string.endswith('*') else '*' + str(substring['any']) + filter_string += '*' + elif component == 'final': + filter_string += '*' + str(substring['final']) + elif filter_type == 'greaterOrEqual': + ava = ava_to_dict(filter_object['greaterOrEqual']) + filter_string += ava['attribute'] + '>=' + ava['value'] + elif filter_type == 'lessOrEqual': + ava = ava_to_dict(filter_object['lessOrEqual']) + filter_string += ava['attribute'] + '<=' + ava['value'] + elif filter_type == 'present': + filter_string += str(filter_object['present']) + '=*' + elif filter_type == 'approxMatch': + ava = ava_to_dict(filter_object['approxMatch']) + filter_string += ava['attribute'] + '~=' + ava['value'] + elif filter_type == 'extensibleMatch': + filter_string += matching_rule_assertion_to_string(filter_object['extensibleMatch']) + else: + raise LDAPInvalidFilterError('error converting filter to string') + filter_string += ')' + + if str is bytes: # Python2, forces conversion to Unicode + filter_string = to_unicode(filter_string) + + return filter_string + + +def search_request_to_dict(request): + return {'base': str(request['baseObject']), + 'scope': int(request['scope']), + 'dereferenceAlias': int(request['derefAliases']), + 'sizeLimit': int(request['sizeLimit']), + 'timeLimit': int(request['timeLimit']), + 'typesOnly': bool(request['typesOnly']), + 'filter': filter_to_string(request['filter']), + 'attributes': attributes_to_list(request['attributes'])} + + +def search_result_entry_response_to_dict(response, schema, custom_formatter, check_names): + entry = dict() + # entry['dn'] = str(response['object']) + if response['object']: + if isinstance(response['object'], STRING_TYPES): # mock strategies return string not a PyAsn1 object + entry['raw_dn'] = to_raw(response['object']) + entry['dn'] = to_unicode(response['object']) + else: + entry['raw_dn'] = str(response['object']) + entry['dn'] = to_unicode(bytes(response['object']), from_server=True) + else: + entry['raw_dn'] = b'' + entry['dn'] = '' + entry['raw_attributes'] = raw_attributes_to_dict(response['attributes']) + if check_names: + entry['attributes'] = checked_attributes_to_dict(response['attributes'], schema, custom_formatter) + else: + entry['attributes'] = attributes_to_dict(response['attributes']) + + return entry + + +def search_result_done_response_to_dict(response): + result = {'result': int(response['resultCode']), + 'description': ResultCode().getNamedValues().getName(response['resultCode']), + 'message': str(response['diagnosticMessage']), + 'dn': str(response['matchedDN']), + 'referrals': referrals_to_list(response['referral'])} + + if 'controls' in response: # used for returning controls in Mock strategies + result['controls'] = dict() + for control in response['controls']: + result['controls'][control[0]] = control[1] + + return result + + +def search_result_reference_response_to_dict(response): + return {'uri': search_refs_to_list(response)} + + +def search_result_entry_response_to_dict_fast(response, schema, custom_formatter, check_names): + entry_dict = dict() + entry_dict['raw_dn'] = response[0][3] + entry_dict['dn'] = to_unicode(response[0][3], from_server=True) + entry_dict['raw_attributes'] = raw_attributes_to_dict_fast(response[1][3]) # attributes + if check_names: + entry_dict['attributes'] = checked_attributes_to_dict_fast(response[1][3], schema, custom_formatter) # attributes + else: + entry_dict['attributes'] = attributes_to_dict_fast(response[1][3]) # attributes + + return entry_dict + + +def search_result_reference_response_to_dict_fast(response): + return {'uri': search_refs_to_list_fast([r[3] for r in response])} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/unbind.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/unbind.py new file mode 100644 index 0000000..4d418fb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/operation/unbind.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2013.09.03 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..protocol.rfc4511 import UnbindRequest + + +def unbind_operation(): + # UnbindRequest ::= [APPLICATION 2] NULL + request = UnbindRequest() + return request diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eee79c41b82ca03596efa94f78c4d0a399fbbea2 GIT binary patch literal 145 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vCza+OnzaXjpvA`Hg78K=|8kt% z8(1R#$XizZ1y>dL*r9N8g+F7mqd~Hit7P%^2>!Y`u zi>r5UHut3O!akIBp@rNP4C3BE(y-U?ZFT?--Jx67vF})5M>=$ee-Mm@m^j+uDJBBl z9N4Rl+Rad-j&)?L)ybIY$jAhtY|H1xsBhOA>F32ijXaquA9A&qX<++T;YW>hYh4*# z%i3MG+q{yt*J^v=HUdZkPjxA5489LO_hf!Nj+ad*W<%CTQ}`3v1e*W6T)N6EO=(Wb zx^cNuC+6nt)Ag4Z?NW){Je$y1?R25la-uhi8?b)KG`{lx+VmLv%9Pb2<;OM{?DNj5Drh)EDsXv-@`0RJXZwg%e+Vuan9 zW%n!vpcWTF&Mj3=%2layd>|`-O4*g8%9r?*LykG*lBwKs;x$KJlJ9lT%q~`-?Q&uR zwf*zD=k@FNUcdMH^{w&oih;ks{+Z|f)dj=&FY2U!IW)eDpPXif!41dYjGJxNF&&c` zJjbneu46e?C-3At1*f23`F62Wa!Q@DQ|?rpN@vU&Q}9B&+8KAoI}^@?>KEIGI+M<1 zXUduC)SO!9uya_!OYI|_qs~#Z%e?Z1;Y{-}UPXP3kMjxCGyD*rL_N!=cn$S&ewZIY zeS#n5)2L7KV|)hnDL%`Oqdv_~@RO+D;HUU$)HZ*E+o<2<=cc}Wbbvv};@_DvaF zT^1q~FHM5w;)#{zKfb@*SXyqbKEAiS5?5DNKf2p^Kj|HL;zi9?7_9qGnq6189WU}k z-HInaxP9~9QW!)cY%6qejUYFpNcd~L$kVVR1p9F9Q?C^*wOuJS^e92^2G88K&mXw$ zo}OGc<5Gf9#>J$Cl?qYV6z*qn1$8g*TOs%2!=7xpU9Y+Bw?R&`wc!dGPx&$h=wXf> z&#e0aZ@MX2O|_^Sg`x$GQGZky@ms=A+9Zbut#WPcX++T8Yt?ep1uUws{fq60?k zc-&5Qw@|V1cW*n|2m|}=1XuEv^a0y&1K##zI^Vv$NR#Z(e0qR208T4ATVxPZPS+y!Ij{6I6oA?~-Lg&Xa#<+kM_8tE6Y z1u4k7DNf+4xS$kG{#Inh`L*rHBUC4W>L5zRDGa=YUqT|L($)l-TIfSLBY0$o@l-a_ zOtvylSd?6u$!s>k1W7uhn^>F2Psx>5jEp^Fmu;QvLz17I+%+TCH}}|XuAd`W_Zez) z*0^Cjtv*B#63aEj8~9GK1-!S2e`*bwjY>w2bPf&LipSzjeC14JPz@vG&lA^+vK(U~>#%5V8 z!p4{{46z8GH8Mk~rq#%n*r$|4vQo;)UDjv9I!H0;EG6=eOTt@+6>{4n!c#*315C{H zGM%XQPKtPtUjDxjCE(OYkBg$`4+r$XO;voUtWMDKVv7ihOB=3yKsL9|oN`9*$j;)a zY=oppAAX1M7Elvkm?}cyb5}rdH`2Xpa!A znDKr}Aeb?Kzy_M@?!kJRa72(n8bKV-ybci^-;^C>viGrrY?qSFH_;gQ7aV6;D0QS4 zbo)8Ov0jKw-P>b<$q_`5kE&aZxZLp&y9B=M#A7YtaW9B`ZRxK7uOOpX&uRNxCxA@= z7F*JlqenQd5-_z?-^0X|_-kk%O#FKof#oq?z?p8EVg?2`ajQgTGGb!n+Uqt@kbbAz z_QX{p%oJoGbvqXq5ji#xFKY6M2%OWSZZF!PUAEi^p$sCo&~JI8GC6hNtaNV;pi1}l zF53I{_WKDGl*h@|-Dd!Pvp7My-#D*4`N-~-s;{PdgsNXg+)ZjR6vh6ESV5d7PU}!X zkaqrdWZD{wiV_IRK}0?PTnVB;3l2vK)lSI$^+d=cpT@JV-Oopaa9_Z19gu7TWQVeY zM{aF!@Ra7_=pg_c9ImkI38iM@TbK+Izl}=yeu{H_++7Gg&QpO7;ghea;e-aKdiNNU zQ@y)^_CC5u2b4jWKx4nZc&)Gab*e&(fNCWJa#|ydREqMafG0B8IjiaYjhsUklN3Lk!Xnzg^Gy$hD@s%&1gcH1r9|O$T-YC`y)INyXb`5K!>1!CMHx{qtfYfnxAaM!L_01oZ?(KG%}ZR1lXIWBqx=~I zEIkAsK9i*524ecti0O4HZUVB8N!dXqKdRk|nAA0#3;Dy`tRd#P#q;X^h8~5*$yfnn z2#Pssg7D%`>Ec~##6>^w$r#2)oO6TiY)LwQIs8`ele9M#7MCb29=fM#Ezn2GDRg{} zd-TX|m4bB%3!#L9otM2eeV~U@EOK#aRI2g4^wS0f!RNZ6PjokvVV?xCpXO!#Apc zJU{JS7jy@XPb9M`UjuWCYz@)@!h72DWF#>m(JQ)IRdKm0u`^8E1w7k-9v%9r{r>`u zKHLSzRf>)sU9;rz2->p8K4(!*-6j7rvM7~<`{bW}Z0?%7In2yOd0fc8*JsZQeY2l? zfmGqsOHr|(qeF;b=S!MH`Gly1d0%3-v1p4*J6yMu+}Fjr9g1u~s;rRbwl*@5 z-Ra2)*`Q}0(nMa{>maa_?;+#lQMQPX+aKP&J+A=*#|C)?Kibv+6?!O~t-+ASxaNVN zwJ>aZZlGo~c1~o}sx{S&l;oE=Na7_qXF*5C8B6A_BA0^B0J|Xlb*jm*vP?TjiD*i{ zj+a<5yssg&NTLnU+7}aA>oyW&>DCo``(h&uJlkKlgAmy;5kB*|$Lsa7m?LsYmjuNd zqKYCedqEFc>msE%j=nQ3y=Vy;8=wfHTif?S2_A+)oNIeQY|*0id|XP%lFr0h59vrs zmMXa-!r)tRG3h$v`$k8P#$g)e*|+MRx(gcQ85BmrVwQ<~gIQoT9F7Tg9QlW8@;_l# zO+m(>MOjSxqdJR&DTshVQz8Y*F3xcnfX#w9r;{u493p!)Mji%+!t7i9e80fWKQE9u zQAw6p>|+E>WoV4gDRqjw%7)k4Y|mX6H`CItcS%Wb&AG8zj3EU zmXrR-eP`_XCG=K@YY{vWSqdg&%F-fbFmF zLqCL<;FFssU>5dY5cTKV;b(Zu(9uB5o{eak3IzTZx{?M0^RLtEgW>__#L@>h zS5}r+n#+%tKDd8-`F8WpM<4#6x%5ZNOW)5N8re%SiYjXPHS~%!$BosSkCs<{ceMS(5N)-6YpaK+SL{29 z{|MECQHvgob}st*oyb;Q+Yf9#s-BbVEb4vF-l?TCGoXD(d7K?{ZSLj&;O`Zi+nG~# z!k#-X=in0pdbIJmjX-38OAW5pCj{Biq1~kN)YQ9 zyG*Sb6%;Xx?@~e5$0^9|Aab|rW8xvf9#KKYP|zK7VD}tyX6xw^O>e8!?!kXG*G1St z5Ct3ToK-WjEz1KZ)zqY3w0^y*7xs`7AHdYUoYcM}nA>k|#RCxaH~7ixC=9ru8tiHf zZm5LcG;RSkI3&0s^eeaz*s!}*{HD<(cV(H^Fru(z%0(eVW`qA59nN;y69cCjksNG} zvGt2Sqf7lB+cd<#l0BoicGHyKOxhHw{WzV&tr-LJe!M;3H=mo@mGS&Be8mgL3}xwx zdn(Qa#QGL2@RyYK@|X z>@k7?Yo4$^tvxi7ui^;NrAqUco|p7fao;5G@*+w7*T))4-(RY;Ocp?CtN1>(D1Y~o zys211k+F^J1+h*=%hPD!J!&F-k9vUD%BRTN!6dQ<>|3t2F|cl1BSL*uzVXBhysfTS z{0~B?EfI1}I-pM9tWbMP>geu+3rDfSP5LA+1Jdnn?{1M6?0>sZolPnNl1)O?)MVC5M zRYpbG7-dQ()92O&vEF*;-K$qsEUN?9N-y%;asem(nHH3a)RbCLxaOS9zJ;7SFe09i z3rKzh+!b6KE=tFUGgO?X;u00~I3O0NxJCu#U{xkfP^_u4L@H;ZasuKG!RQvJVpKt~ zm@)-QE{Z!t996tkcg4~Tq!4>;Z;{w2-$7v=tC~mH3=GQ*tL93TQn6IR&r1H&Rt5b^ M=~Ss)d9yV0zab#W^Z)<= literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/microsoft.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/microsoft.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..108fceb69c8d84d428b9b239dc6dd6d96845449b GIT binary patch literal 3069 zcmb_eOK;mo5ayB;MN^V3KjQe2G)__!QQOE-Vz(~(Kw`UYQ#4Ky2R$qb5Da%MGvPzo zU8Po`Gza_8OMu>cagIg*5wGnff1#IjW@*We;i5%T3LJhj+!bfOotfR$TFo=y`sFvy zubeTA-%%M{Hh`OO%RfLcgBpx5GbWV4(~8Z+qE=#4o1oo}ONm3Bq)f|+OI>X%#UqJF zy`(}bNtIT?=CE>HOGfEvGDgR=?#A_GoQ@OY3xka?Z{J`Z_x3D00eXd1L9c3k67(7y z1$|WOQ=pHrI_Pz+p8>`_I=K#&I zOYA&*3(!0>w~WT+oOmxGSYxwc=H6zIaCX1f;W8f?;)a!5_k(smse<-e97uVq(}|-n zP*IlVQ()Z4L=vdAER{-hL&X`)aJTs5E>A@G^H9 z*|S~{YV#59F_TyJj6D;O#jA(N<~2mX`Y0;_3r;?<6@^jUTa8i%E_EOlE-LW%)DuGw zX$6c=xL6aMNm}JXWa18&GHCP7##rw9ehU2ge(w2xlCf@#xa#|lyFpyM5ib6v1DtJf zMQiZ9ogkNyihH62?*zss$|x)pn2@51VgyAEL|zNC1RUh4!j<~f5L5UH#h)K9s-&~n zi8@y!Sd1W!uXY|Sx3_m!dW$g&IyVkwM`S7svv@IyLXpXATQxg9F$Vu|8E%PAx|36+ zN<5;ir?Y`?^tx}pxB6XPf*P#n>N1ZSnR9b#!B}^70nb%OTFf*v&@yA6DRR$)AVm_u-Z%2-g;<|7WMX&vzA18E5O8 zxs!FU2fcx7$ijC+*DQg0h}DM|Rvgyk8rh_74?z_yqYXCOICBT-( zmS_UDHMYf9fJ=xKIWPe`H;otMp#^iw2R1AB-4`Y?G6Ud!O-`!y#bc&^}DlrEd`NF5s8A&%DMeHYHtT3jmI@+AmVx9PrsD1*6!IPIYwU zTB~8{22(J4oXoOhIz{M+WQVD9(*OBEoDciBa6~zAFoBXi_6OZGdZJG?MH9djre(1mE-klO#lc0NS=>X$ zrA{AxsL)+T;0{$R81`OWayn&os%VmRT*p>Q*MLrc_mkq3^%)W%7eLrEE)?z*{OY7? U)#vJ!dbRG>%kI4Ac(zyi3v7Us$p8QV literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/novell.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/novell.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e34c509b10ff3b14c8c54f2fe9dcb053a4c938ba GIT binary patch literal 4772 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 I$`e}i7rVzvIRF3v literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/persistentSearch.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/persistentSearch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20bcec5a3185e1c140b3a3f5ece8676050fd83a6 GIT binary patch literal 1638 zcmah}&2HO95ayB;MNy(H+e+>B(4Qj@p{>ekatI1nwo?=+7y~wX*bBjM*A5Z>WtTLf zLOm%@&}%R4vFID|+LK#B9GFCkVl%na(;@^noG}Y>}&qE=6TGU?hkpz z@3?5X)1pXulsC?0UT0iH6=zF=Cy~bb@#4FyivTS5Rh^_PjElSyMH=Hx*24nh3`CxQ z;u<9YpUw?#GQv9xZJ~pub8BT8tpzD}nF)z?n!_tDWFjk`SJyle@$2*UkftBMj`BO+ zCc1Lu%RHSmJ;AG5@_^tj5(<1#59C%LSmG<{sYd2)CA?%C`(Wl=d<=~5I`5f|xk z`B4gfITJgu(N`c60kXRT;t&=40K5*&o#CR-KyAQ7_A!H*3*a5=08CcnoIjx9>5UOF zCi?IV*cRg{ulQ15xd1_OJ6mG5o=!X9UIa@_JMcPUAO6Jwsu3!@8|@=VtR=|?gw{I5 zRY#zF5Q)3kwn=pOsptpE{67;cU_w_h!D0pw9oPX(=&hLW`6aMx*5(-$RdSoe5mI_Z z2ygU6+{qZ;cv(poQ?2pHjr;`(Z;-C5xC?}GP?n_>suem&(Vaso5 zE?ijRb=Dw-6}}s5Plg5b6Ls2t3VAGPKNd*^z^6$yqtGI%;lq1;LAFprS~Q<-Xdg<| zy6Xqx3Z|ucZHYyO>LxLmK;xMF-%2_1yv5(jC6%Wzc>Q{u9j{dU> zF4U5DxIIqJC&Awyd}>5R^b8M{#V#K~Oj`kRpeuKx7ofUI>P}QQ7b>ODc#0 z1vw~h(Mxg+`bOJhPkx17+!;!;m7<4G*wK8ugPrf2-Py;U*CO!!@uyOMxrF?UVEtL( zoWdwSfssTINhM2Y$^=Wf;Hf1nigP@%Q%5*yLo{k^C2rajP4I2$B(1b9+LS0R8w)Br zswt`JEST_qBGQ%3k3=>VUvRMnxFy?w+iDB&HsFr*0DFo7?gHMD+km%~1^9;Cle@C_ zk%}F;GbVoD(AEVIB|bOppQB1u<4VWb#5A5}m6|AR+_8E+RavBbW?G{#Rq}jRsM0jA ze4m=$FJUrO&%*TM@c*o<9rUj(o?sL68BTATX^UNOL(&(C-An>uH!QS2Ui6 zXqVF$6_6emDl+>TS;A(^jjri_A-W6EwfX1dph}B_A}(&nASXEn^8<`!B39#XPUM{B`K$O_Q|&^U;YKRNU!}5P;uHgJfmv%(T*2un zdqEZqJf$TO8yct8KQU_FRChEd|Ja2p+}apuVdHuEUrVDZC6lye57d;q2*3-X@N`6nuA z#pZNDKQl^d%ql)-`qrFfO!DP?Wl3ues|%E9kMthwpz&rK@~%G|+#TG%cV{ph9v&SX z4~Bz#gTvv8Z`VY`PN}N1wTj0xY_MyA8d>_5Xh%A(;wVhwYIeOj%C8F;yunV~kdIfz z^onqzWKhaV%Xi>M?7jLuvG#kQtwTGu%Uir_b#3^y{{?uMK??u? literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc2849.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc2849.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e89b0829d476e1e7079509d966d7bb02971dbef5 GIT binary patch literal 6866 zcmcIp+i%;}8RsD>ilSv%b{t>QG-Y$?s}A+XFkt(AhZNw9p;Si zA)bGrI7L3p3%HN+5njZ7jF0j$-1qT)d>r?2{sN!ilMk4)pTEeb_%wPGe1;$3PoX!- z%lsgJ8oeogf*<0~pf}A=@@M&B^bYVN{3yRg+Gt`)4arw<9>+mUsOt` zB4$0pM=K>3<(AH!b-j9Z zTg08K(+bztbl*<;`kEn*^2{P;LS@bH=eUvFvve01X%1^m?8~jG;yR5tr$S|3d8@e1 zLdd|HE^ZNZ{nl;B1hBIzHwC@Jqwk_A8F8P4?9nhaHZ`-<%%Qm|h$sp){wIE71ifD= zCDj>P+6r91dau^pa2=fnVjnG~=J6{hf>!55r_q^dcz#f8HfK6(FRd(Zp5HprbspQHtUA36W zOjYd1T%91LUj~m>+KC1D$%? z+HJ+NbtTBGS>hH`=r7O%gXU=VO~q61C^%0Gj2+eYFrz`m=sXR~$V_5pQrXtM0+MBFko*AEnXDi&mT1IO_9jwV#BBh(z2$pBglPpWA1_Dv0=GPmIt~NVschy!A9F(Mawvi{;fkQ(2xB*cgpi zK{e%-SH%&ms*~u^kNA|uCHZt0ofTypLN4xXR;2h|-PSk*u26{>AFdI~(~2nbjHeQE zFB5JW&w^G6)mxJ7&r~+BD(#_$`Nqc8)De{k*{fJaD(gU&KMw#VW z({}~E6|96&>vUX?%QpsGX0p|fEXZ;-K`KK4`B65R6of)w2V%VPHO>h#da!>R3;ZIQ z6e~6b2|l2T8PHN>h@YthzmEYS!{dhe`-spz;&j8Q{Pm z-+GuyF?b#r=-b+LiN@wddB%Al*=x|_)lWo_lG!f~t)gXR@s1*pc{^mNi`3KNQ z+@SR&T@$bdhGwxM`atkBW>W-7#)y-o1pYxZ?Y4hFkqW#EFXhvTfiB_pCR?coNLxvOT2cWi$nf~ zOX)r<7s~xoaLRMdb{#@@0iAd)PSe)hE!+%R>++H+ArmiQzdXFe;=X*w$iRX3vC5a~ zr3o_Nl_zXss%t;P6eJ3kN_?;>q%^!k(f}ROIfElnAr(j03(z-mKX*cnG>b-Dn})TD zH49V~c2g&f1WhGvgJnaYvBSOxt17%86KbKlLpBj7a3j@6O?)6JS+b6yLN;|$q1jNA znhK4C*>Va#>{)&FhU-gj9I4!M3Ziy@k6?7m8(wXx>DocthLVw8qAt1KnJaHpZZ1@A z+B0^m;lo(2*z*-Jfp70Vbp(sxlx%OKwd4xBy==Qs(1z=iY3)mJWVjRGNPXvAb2NZiBqoM>a;d>l?10 zIx{l1X{bT?7bN-?8^=AbA=DtSKc52}GkZADQ=9*e1FCo%97xm$XlD|&BD9Uqpgp!1 zZSFP^fOcQ{Qmp3}t}WbL7=YXOT)4@aNCo(Oq{U^LPouxs^G(DrG6?Z6vD7CuBvIcB zF#uKp@H}QxfQh-OC;S5jdjS6Ae-Uw>k!te0%^((Y_|8@MPHCrjmYY1c0uRcqX$AIh z2r*iQ=g}LcScH^ivz$;0((fMHMg%D1k91u~(PA8fd;p(GCy&t1b%#8t_@vKXY4wU< z%+yvJ@$i}#@oUIaKEw9-RR`JrTb$+FXa?Di;E)|hsCX#R zHE|7VQUM?*p4zxiFxVpiAN}V7z~fNo4wz1Xq|{NKd5DlaW_`~N!rj3!QC8JsqMXlx z29Xdy;zI~P^RXx-XMUKR`C;-_!|^!XuZoZRESDNxNbTpyAoHCe&%M960TwpeqWgq; z175+s?&w~X2MxZ_z#dG=`wc89#NyFz(uP^v$;ab2njEtcLkfLTKF9Ap=j@l7jBmX$ zKVSL3S&ZpKbhtMtJ--L%Q~%gE8b@KF44F z^8{srp&DvC8gjI|psJw0i0q+Hy$Y%Z>Sf9m)3qmwsi5AWj4`Di05t=u2L|`4Iz*MO z%;s{a!@hjyhZKc=9A2lKj$8CF;jbGRAN$*oqsmpL3A+HGBQx81CLMkKueJ z8OaPOjfyFzBvUM-;-l!S0Lr%xZZnQg!Y3oOo&>a03VqU~@>6x4l37*IQgI9oBHI0M z#>;V9Pwu#i@M$GjMXIHiPe!bP!1ge$mQIAC+sD>iv*8EzcB^yYuNcd~)=;{~Qp45@ zp7zGky&dwYGTJLyGHQ~JTRInMU<64@Z2P`VJsDJ7KrhM&D*BWRr?BTi2x9~#x&zkG z8IsYwKq*LY`RcvTkn#EGo)h9^`HwimCsY);zQW+8>iDxD%VTU-EvVua)}=h4%!CA6 zMtgKT!uMjRz^x#id5C(SOl7o+kq90Io^h=F6DDk`u2G!4X3!{5b`+G0*gFX|uF6d-fwlwn ze@{)mPZQthr#sw0c#wq=c$=FcP=Czx3H5kF9R~Fm zypT}GasCLRZg~zRN#rqjF;o%Z{|VG0PFGM~O8UFTL#5Y;e*!;vaZcf*v>x9zjvb@% zj{b=D^he3A(K+lz&5?LCR*56}$GFUugH#2mBc zd#4sVZoPYE!$V!K?)tvVZCP8g8=k#D`OuYrS5b|u*q>3oD%RZva7tEV#8vbj5%VG= zwpfpd$K6~!u;J;BZFp;5`@UyiC#m<5vjz5|Odjq2v38V?2Njw1MOH_+_ZsaDf4)-6 zMmlfQ13?)-g;lb&ORhuEqh!M8n5#Aa78N@okl&sbslGE4*~;%8rkvU zD!wy$)oPLyCfN!~^gSCf#SCW4FgY(vX;k=-mpaZ)vU4ba3KwsZN;o+>(pV|s576PT z%)9KNva3FXU0$IgDAInEFja)0tB?oSYcUtHU8MF>&M;1saZs@WaguaWDrJM%Lu(DW z7UTX}Q|z}pGAH! z9Y07cAR7xq0wdkaQz-B#0yofQF$ndb-aqwfrSwdctyVdTTUB9WiLAiN*Oq=rR%x9P zcnY`dZr0rn{eOZVR~1OeoatUMyxf1mScnBlqGN3Yjiz5FHIs7cch~4M{cz{UG5c?YlIXF{<>Hd!Xy%XU;+KHk$4QiVFNP8ht7+tG-2u hC;oI(Gbha{GjEQYhPB@svx?R}Yuq|uX3d;A`7gzNC?Eg; literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc3062.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc3062.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b55166a128a92cea4b872989fd057c8b0987d056 GIT binary patch literal 2280 zcmb_d&2HO95az!~in8R?4V>h{V|DOf(iTb321yOq5YSL*B=@jJK@i%tz?OemuA0a} zPR=cl&>YfZ(KqO$@Y+*eA*ar)EJZTpGz~;yNBhl;#QkP=zx}S!a20rd|BJC#bw&9H z!Spd;avw(d8Vps4LRG3IYN`<})rqbm))ON&iJ4l&lGsRUsZH$EAx`QNS5*!bYEtW^ zLM^79>7)+0Ms2{h#2#RWx`17Y8-VN71MEq>2Dm}j0Ix9}e%}P#q%FWLiCc8Nr?jtB zs{0leskF7K-W>=gdVJw-9ljMaj(9)+@aq4XdVz zhWklWmiu`o*fSv=-{(AyL@!Q@gbnaL)5n6zeHi5zV3FZ&@VZlTBu=(&2km-ghhYZf!mx6~FwN;G!MPWPPexI49;t;P%?Dw~b@**%0nHv0 zRRg{|Kr0@^A{p}<#JG*d!7Lj}ms2R@p9;T%UNrCS?1;43DdJ))&Pov_$yV{}SHqKM zx5qmPjfz|6w&1zQ2YIr?PX@PkzrML$j5%($HjEMrXX}Q#p-SIMit2O|`UpDrl%8(M zGUZe3AMbsroNrZF&HHk4I0y>&&@|Ajp~0&0CYlzS#X|9Q^vxJ6rU>|w&(kJyL)3%L;D&C4EfW^W`#KWyR=~@)RLo+ zNC}ZgjpJ6U8iPD7@(k1!)qd%@yast47$u6GZ5gVkx++KSLf>XrpbwGD`gW$08r7jk zMs;nm2_>weWRoU^OPVwnzobjU>4v}jMwnL8ndJs;`#%bX80$e^9l@xD?_pRh| iq1YC=gk`I(>~AJF-aQnx68RXLEw!a?G+Org$NLvb9O`8N literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc4511.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/__pycache__/rfc4511.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1472b131a76d5f495fc6fe736c5ddfe8ccdfd8cd GIT binary patch literal 23274 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/controls.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/controls.py new file mode 100644 index 0000000..658867b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/controls.py @@ -0,0 +1,40 @@ +""" +""" + +# Created on 2015.10.20 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .rfc4511 import Control, Criticality, LDAPOID +from ..utils.asn1 import encode + + +def build_control(oid, criticality, value, encode_control_value=True): + control = Control() + control.setComponentByName('controlType', LDAPOID(oid)) + control.setComponentByName('criticality', Criticality(criticality)) + if value is not None: + if encode_control_value: + control.setComponentByName('controlValue', encode(value)) + else: + control.setComponentByName('controlValue', value) + + return control diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/convert.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/convert.py new file mode 100644 index 0000000..4acc3cb --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/convert.py @@ -0,0 +1,221 @@ +""" +""" + +# Created on 2013.07.24 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from pyasn1.error import PyAsn1Error + +from .. import SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from ..core.exceptions import LDAPControlError, LDAPAttributeError, LDAPObjectClassError, LDAPInvalidValueError +from ..protocol.rfc4511 import Controls, Control +from ..utils.conv import to_raw, to_unicode, escape_filter_chars, is_filter_escaped +from ..protocol.formatters.standard import find_attribute_validator + + +def to_str_or_normalized_unicode(val): + """ Attempt to convert value to a string. If that would error, convert it to normalized unicode. + Python 3 string conversion handles unicode -> str without issue, but python 2 doesn't. + """ + try: + return str(val) + except: + return val.encode('ascii', 'backslashreplace') + + +def attribute_to_dict(attribute): + try: + return {'type': str(attribute['type']), 'values': [str(val) for val in attribute['vals']]} + except PyAsn1Error: # invalid encoding, return bytes value + return {'type': str(attribute['type']), 'values': [bytes(val) for val in attribute['vals']]} + + +def attributes_to_dict(attributes): + attributes_dict = dict() + for attribute in attributes: + attribute_dict = attribute_to_dict(attribute) + attributes_dict[attribute_dict['type']] = attribute_dict['values'] + return attributes_dict + + +def referrals_to_list(referrals): + if isinstance(referrals, list): + return [to_str_or_normalized_unicode(referral) for referral in referrals if referral] if referrals else None + else: + return [to_str_or_normalized_unicode(referral) for referral in referrals if referral] if referrals is not None and referrals.hasValue() else None + + +def search_refs_to_list(search_refs): + return [to_str_or_normalized_unicode(search_ref) for search_ref in search_refs if search_ref] if search_refs else None + + +def search_refs_to_list_fast(search_refs): + return [to_unicode(search_ref) for search_ref in search_refs if search_ref] if search_refs else None + + +def sasl_to_dict(sasl): + return {'mechanism': str(sasl['mechanism']), 'credentials': bytes(sasl['credentials']) if sasl['credentials'] is not None and sasl['credentials'].hasValue() else None} + + +def authentication_choice_to_dict(authentication_choice): + return {'simple': str(authentication_choice['simple']) if authentication_choice.getName() == 'simple' else None, 'sasl': sasl_to_dict(authentication_choice['sasl']) if authentication_choice.getName() == 'sasl' else None} + + +def partial_attribute_to_dict(modification): + try: + return {'type': str(modification['type']), 'value': [str(value) for value in modification['vals']]} + except PyAsn1Error: # invalid encoding, return bytes value + return {'type': str(modification['type']), 'value': [bytes(value) for value in modification['vals']]} + + +def change_to_dict(change): + return {'operation': int(change['operation']), 'attribute': partial_attribute_to_dict(change['modification'])} + + +def changes_to_list(changes): + return [change_to_dict(change) for change in changes] + + +def attributes_to_list(attributes): + return [to_str_or_normalized_unicode(attribute) for attribute in attributes] + + +def ava_to_dict(ava): + try: + return {'attribute': str(ava['attributeDesc']), 'value': escape_filter_chars(str(ava['assertionValue']))} + except Exception: # invalid encoding, return bytes value + try: + return {'attribute': str(ava['attributeDesc']), 'value': escape_filter_chars(bytes(ava['assertionValue']))} + except Exception: + return {'attribute': str(ava['attributeDesc']), 'value': bytes(ava['assertionValue'])} + + +def substring_to_dict(substring): + return {'initial': substring['initial'] if substring['initial'] else '', 'any': [middle for middle in substring['any']] if substring['any'] else '', 'final': substring['final'] if substring['final'] else ''} + + +def prepare_changes_for_request(changes): + prepared = dict() + for change in changes: + attribute_name = change['attribute']['type'] + if attribute_name not in prepared: + prepared[attribute_name] = [] + prepared[attribute_name].append((change['operation'], change['attribute']['value'])) + return prepared + + +def build_controls_list(controls): + """controls is a sequence of Control() or sequences + each sequence must have 3 elements: the control OID, the criticality, the value + criticality must be a boolean + """ + + if not controls: + return None + + if not isinstance(controls, SEQUENCE_TYPES): + raise LDAPControlError('controls must be a sequence') + + built_controls = Controls() + for idx, control in enumerate(controls): + if isinstance(control, Control): + built_controls.setComponentByPosition(idx, control) + elif len(control) == 3 and isinstance(control[1], bool): + built_control = Control() + built_control['controlType'] = control[0] + built_control['criticality'] = control[1] + if control[2] is not None: + built_control['controlValue'] = control[2] + built_controls.setComponentByPosition(idx, built_control) + else: + raise LDAPControlError('control must be a sequence of 3 elements: controlType, criticality (boolean) and controlValue (None if not provided)') + + return built_controls + + +def validate_assertion_value(schema, name, value, auto_escape, auto_encode, validator, check_names): + value = to_unicode(value) + if auto_escape: + if '\\' in value and not is_filter_escaped(value): + value = escape_filter_chars(value) + value = validate_attribute_value(schema, name, value, auto_encode, validator=validator, check_names=check_names) + return value + + +def validate_attribute_value(schema, name, value, auto_encode, validator=None, check_names=False): + conf_classes_excluded_from_check = [v.lower() for v in get_config_parameter('CLASSES_EXCLUDED_FROM_CHECK')] + conf_attributes_excluded_from_check = [v.lower() for v in get_config_parameter('ATTRIBUTES_EXCLUDED_FROM_CHECK')] + conf_utf8_syntaxes = get_config_parameter('UTF8_ENCODED_SYNTAXES') + conf_utf8_types = [v.lower() for v in get_config_parameter('UTF8_ENCODED_TYPES')] + if schema and schema.attribute_types: + if ';' in name: + name = name.split(';')[0] + if check_names and schema.object_classes and name.lower() == 'objectclass': + if to_unicode(value).lower() not in conf_classes_excluded_from_check and to_unicode(value) not in schema.object_classes: + raise LDAPObjectClassError('invalid class in objectClass attribute: ' + str(value)) + elif check_names and name not in schema.attribute_types and name.lower() not in conf_attributes_excluded_from_check: + raise LDAPAttributeError('invalid attribute ' + name) + else: # try standard validators + validator = find_attribute_validator(schema, name, validator) + validated = validator(value) + if validated is False: + try: # checks if the value is a byte value erroneously converted to a string (as "b'1234'"), this is a common case in Python 3 when encoding is not specified + if value[0:2] == "b'" and value [-1] == "'": + value = to_raw(value[2:-1]) + validated = validator(value) + except Exception: + raise LDAPInvalidValueError('value \'%s\' non valid for attribute \'%s\'' % (value, name)) + if validated is False: + raise LDAPInvalidValueError('value \'%s\' non valid for attribute \'%s\'' % (value, name)) + elif validated is not True: # a valid LDAP value equivalent to the actual value + value = validated + # converts to utf-8 for well known Unicode LDAP syntaxes + if auto_encode and ((name in schema.attribute_types and schema.attribute_types[name].syntax in conf_utf8_syntaxes) or name.lower() in conf_utf8_types): + value = to_unicode(value) # tries to convert from local encoding to Unicode + return to_raw(value) + + +def prepare_filter_for_sending(raw_string): + i = 0 + ints = [] + raw_string = to_raw(raw_string) + while i < len(raw_string): + if (raw_string[i] == 92 or raw_string[i] == '\\') and i < len(raw_string) - 2: # 92 (0x5C) is backslash + try: + ints.append(int(raw_string[i + 1: i + 3], 16)) + i += 2 + except ValueError: # not an ldap escaped value, sends as is + ints.append(92) # adds backslash + else: + if str is not bytes: # Python 3 + ints.append(raw_string[i]) + else: # Python 2 + ints.append(ord(raw_string[i])) + i += 1 + + if str is not bytes: # Python 3 + return bytes(ints) + else: # Python 2 + return ''.join(chr(x) for x in ints) + + +def prepare_for_sending(raw_string): + return to_raw(raw_string) if isinstance(raw_string, STRING_TYPES) else raw_string diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee886403b0cc56bf8177596f7c47774d62135d48 GIT binary patch literal 156 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vNza+OnzaXjpvA`Hg78K=|lIYq;;_lhPbtkwwF4Rd8HgDGrxPbS literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/formatters.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/formatters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..faa3564223785a2a2a9e4f2a05caa43afcd7eca7 GIT binary patch literal 10235 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 F`XAU3Pow|< literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/validators.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/__pycache__/validators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54dbf383c2c5be7a61ead74bbc3fbcd88685f9cf GIT binary patch literal 10697 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. + +import re + +from binascii import hexlify +from uuid import UUID +from datetime import datetime, timedelta +from ...utils.conv import to_unicode + +from ...core.timezone import OffsetTzInfo + + +def format_unicode(raw_value): + try: + if str is not bytes: # Python 3 + return str(raw_value, 'utf-8', errors='strict') + else: # Python 2 + return unicode(raw_value, 'utf-8', errors='strict') + except (TypeError, UnicodeDecodeError): + pass + + return raw_value + + +def format_integer(raw_value): + try: + return int(raw_value) + except (TypeError, ValueError): # expected exceptions + pass + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_binary(raw_value): + try: + return bytes(raw_value) + except TypeError: # expected exceptions + pass + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_uuid(raw_value): + try: + return str(UUID(bytes=raw_value)) + except (TypeError, ValueError): + return format_unicode(raw_value) + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_uuid_le(raw_value): + try: + return '{' + str(UUID(bytes_le=raw_value)) + '}' + except (TypeError, ValueError): + return format_unicode(raw_value) + except Exception: # any other exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value + + +def format_boolean(raw_value): + if raw_value in [b'TRUE', b'true', b'True']: + return True + if raw_value in [b'FALSE', b'false', b'False']: + return False + + return raw_value + + +def format_ad_timestamp(raw_value): + """ + Active Directory stores date/time values as the number of 100-nanosecond intervals + that have elapsed since the 0 hour on January 1, 1601 till the date/time that is being stored. + The time is always stored in Greenwich Mean Time (GMT) in the Active Directory. + """ + utc_timezone = OffsetTzInfo(0, 'UTC') + if raw_value == b'9223372036854775807': # max value to be stored in a 64 bit signed int + return datetime.max.replace(tzinfo=utc_timezone) # returns datetime.datetime(9999, 12, 31, 23, 59, 59, 999999, tzinfo=OffsetTzInfo(offset=0, name='UTC')) + try: + timestamp = int(raw_value) + if timestamp < 0: # ad timestamp cannot be negative + timestamp = timestamp * -1 + except Exception: + return raw_value + + try: + return datetime.fromtimestamp(timestamp / 10000000.0 - 11644473600, + tz=utc_timezone) # forces true division in python 2 + except (OSError, OverflowError, ValueError): # on Windows backwards timestamps are not allowed + try: + unix_epoch = datetime.fromtimestamp(0, tz=utc_timezone) + diff_seconds = timedelta(seconds=timestamp / 10000000.0 - 11644473600) + return unix_epoch + diff_seconds + except Exception: + pass + except Exception: + pass + + return raw_value + + +try: # uses regular expressions and the timezone class (python3.2 and later) + from datetime import timezone + + time_format = re.compile( + r''' + ^ + (?P[0-9]{4}) + (?P0[1-9]|1[0-2]) + (?P0[1-9]|[12][0-9]|3[01]) + (?P[01][0-9]|2[0-3]) + (?: + (?P[0-5][0-9]) + (?P[0-5][0-9]|60)? + )? + (?: + [.,] + (?P[0-9]+) + )? + (?: + Z + | + (?: + (?P[+-]) + (?P[01][0-9]|2[0-3]) + (?P[0-5][0-9])? + ) + ) + $ + ''', + re.VERBOSE + ) + + + def format_time(raw_value): + try: + match = time_format.fullmatch(to_unicode(raw_value)) + if match is None: + return raw_value + matches = match.groupdict() + + offset = timedelta( + hours=int(matches['OffHour'] or 0), + minutes=int(matches['OffMinute'] or 0) + ) + + if matches['Offset'] == '-': + offset *= -1 + + # Python does not support leap second in datetime (!) + if matches['Second'] == '60': + matches['Second'] = '59' + + # According to RFC, fraction may be applied to an Hour/Minute (!) + fraction = float('0.' + (matches['Fraction'] or '0')) + + if matches['Minute'] is None: + fraction *= 60 + minute = int(fraction) + fraction -= minute + else: + minute = int(matches['Minute']) + + if matches['Second'] is None: + fraction *= 60 + second = int(fraction) + fraction -= second + else: + second = int(matches['Second']) + + microseconds = int(fraction * 1000000) + + return datetime( + int(matches['Year']), + int(matches['Month']), + int(matches['Day']), + int(matches['Hour']), + minute, + second, + microseconds, + timezone(offset), + ) + except Exception: # exceptions should be investigated, anyway the formatter return the raw_value + pass + return raw_value + +except ImportError: + def format_time(raw_value): + """ + From RFC4517: + A value of the Generalized Time syntax is a character string + representing a date and time. The LDAP-specific encoding of a value + of this syntax is a restriction of the format defined in [ISO8601], + and is described by the following ABNF: + + GeneralizedTime = century year month day hour + [ minute [ second / leap-second ] ] + [ fraction ] + g-time-zone + + century = 2(%x30-39) ; "00" to "99" + year = 2(%x30-39) ; "00" to "99" + month = ( %x30 %x31-39 ) ; "01" (January) to "09" + / ( %x31 %x30-32 ) ; "10" to "12" + day = ( %x30 %x31-39 ) ; "01" to "09" + / ( %x31-32 %x30-39 ) ; "10" to "29" + / ( %x33 %x30-31 ) ; "30" to "31" + hour = ( %x30-31 %x30-39 ) / ( %x32 %x30-33 ) ; "00" to "23" + minute = %x30-35 %x30-39 ; "00" to "59" + second = ( %x30-35 %x30-39 ) ; "00" to "59" + leap-second = ( %x36 %x30 ) ; "60" + fraction = ( DOT / COMMA ) 1*(%x30-39) + g-time-zone = %x5A ; "Z" + / g-differential + g-differential = ( MINUS / PLUS ) hour [ minute ] + MINUS = %x2D ; minus sign ("-") + """ + + if len(raw_value) < 10 or not all((c in b'0123456789+-,.Z' for c in raw_value)) or ( + b'Z' in raw_value and not raw_value.endswith( + b'Z')): # first ten characters are mandatory and must be numeric or timezone or fraction + return raw_value + + # sets position for fixed values + year = int(raw_value[0: 4]) + month = int(raw_value[4: 6]) + day = int(raw_value[6: 8]) + hour = int(raw_value[8: 10]) + minute = 0 + second = 0 + microsecond = 0 + + remain = raw_value[10:] + if remain and remain.endswith(b'Z'): # uppercase 'Z' + sep = b'Z' + elif b'+' in remain: # timezone can be specified with +hh[mm] or -hh[mm] + sep = b'+' + elif b'-' in remain: + sep = b'-' + else: # timezone not specified + return raw_value + + time, _, offset = remain.partition(sep) + + if time and (b'.' in time or b',' in time): + # fraction time + if time[0] in b',.': + minute = 6 * int(time[1] if str is bytes else chr(time[1])) # Python 2 / Python 3 + elif time[2] in b',.': + minute = int(raw_value[10: 12]) + second = 6 * int(time[3] if str is bytes else chr(time[3])) # Python 2 / Python 3 + elif time[4] in b',.': + minute = int(raw_value[10: 12]) + second = int(raw_value[12: 14]) + microsecond = 100000 * int(time[5] if str is bytes else chr(time[5])) # Python 2 / Python 3 + elif len(time) == 2: # mmZ format + minute = int(raw_value[10: 12]) + elif len(time) == 0: # Z format + pass + elif len(time) == 4: # mmssZ + minute = int(raw_value[10: 12]) + second = int(raw_value[12: 14]) + else: + return raw_value + + if sep == b'Z': # UTC + timezone = OffsetTzInfo(0, 'UTC') + else: # build timezone + try: + if len(offset) == 2: + timezone_hour = int(offset[:2]) + timezone_minute = 0 + elif len(offset) == 4: + timezone_hour = int(offset[:2]) + timezone_minute = int(offset[2:4]) + else: # malformed timezone + raise ValueError + except ValueError: + return raw_value + if timezone_hour > 23 or timezone_minute > 59: # invalid timezone + return raw_value + + if str is not bytes: # Python 3 + timezone = OffsetTzInfo((timezone_hour * 60 + timezone_minute) * (1 if sep == b'+' else -1), + 'UTC' + str(sep + offset, encoding='utf-8')) + else: # Python 2 + timezone = OffsetTzInfo((timezone_hour * 60 + timezone_minute) * (1 if sep == b'+' else -1), + unicode('UTC' + sep + offset, encoding='utf-8')) + + try: + return datetime(year=year, + month=month, + day=day, + hour=hour, + minute=minute, + second=second, + microsecond=microsecond, + tzinfo=timezone) + except (TypeError, ValueError): + pass + + return raw_value + + +def format_ad_timedelta(raw_value): + """ + Convert a negative filetime value to a timedelta. + """ + # Active Directory stores attributes like "minPwdAge" as a negative + # "filetime" timestamp, which is the number of 100-nanosecond intervals that + # have elapsed since the 0 hour on January 1, 1601. + # + # Handle the minimum value that can be stored in a 64 bit signed integer. + # See https://docs.microsoft.com/en-us/dotnet/api/system.int64.minvalue + # In attributes like "maxPwdAge", this signifies never. + if raw_value == b'-9223372036854775808': + return timedelta.max + # We can reuse format_ad_timestamp to get a datetime object from the + # timestamp. Afterwards, we can subtract a datetime representing 0 hour on + # January 1, 1601 from the returned datetime to get the timedelta. + return format_ad_timestamp(raw_value) - format_ad_timestamp(0) + + +def format_time_with_0_year(raw_value): + try: + if raw_value.startswith(b'0000'): + return raw_value + except Exception: + try: + if raw_value.startswith('0000'): + return raw_value + except Exception: + pass + + return format_time(raw_value) + + +def format_sid(raw_value): + """ + SID= "S-1-" IdentifierAuthority 1*SubAuthority + IdentifierAuthority= IdentifierAuthorityDec / IdentifierAuthorityHex + ; If the identifier authority is < 2^32, the + ; identifier authority is represented as a decimal + ; number + ; If the identifier authority is >= 2^32, + ; the identifier authority is represented in + ; hexadecimal + IdentifierAuthorityDec = 1*10DIGIT + ; IdentifierAuthorityDec, top level authority of a + ; security identifier is represented as a decimal number + IdentifierAuthorityHex = "0x" 12HEXDIG + ; IdentifierAuthorityHex, the top-level authority of a + ; security identifier is represented as a hexadecimal number + SubAuthority= "-" 1*10DIGIT + ; Sub-Authority is always represented as a decimal number + ; No leading "0" characters are allowed when IdentifierAuthority + ; or SubAuthority is represented as a decimal number + ; All hexadecimal digits must be output in string format, + ; pre-pended by "0x" + + Revision (1 byte): An 8-bit unsigned integer that specifies the revision level of the SID. This value MUST be set to 0x01. + SubAuthorityCount (1 byte): An 8-bit unsigned integer that specifies the number of elements in the SubAuthority array. The maximum number of elements allowed is 15. + IdentifierAuthority (6 bytes): A SID_IDENTIFIER_AUTHORITY structure that indicates the authority under which the SID was created. It describes the entity that created the SID. The Identifier Authority value {0,0,0,0,0,5} denotes SIDs created by the NT SID authority. + SubAuthority (variable): A variable length array of unsigned 32-bit integers that uniquely identifies a principal relative to the IdentifierAuthority. Its length is determined by SubAuthorityCount. + """ + try: + if raw_value.startswith(b'S-1-'): + return raw_value + except Exception: + try: + if raw_value.startswith('S-1-'): + return raw_value + except Exception: + pass + try: + if str is not bytes: # Python 3 + revision = int(raw_value[0]) + sub_authority_count = int(raw_value[1]) + identifier_authority = int.from_bytes(raw_value[2:8], byteorder='big') + if identifier_authority >= 4294967296: # 2 ^ 32 + identifier_authority = hex(identifier_authority) + + sub_authority = '' + i = 0 + while i < sub_authority_count: + sub_authority += '-' + str( + int.from_bytes(raw_value[8 + (i * 4): 12 + (i * 4)], byteorder='little')) # little endian + i += 1 + else: # Python 2 + revision = int(ord(raw_value[0])) + sub_authority_count = int(ord(raw_value[1])) + identifier_authority = int(hexlify(raw_value[2:8]), 16) + if identifier_authority >= 4294967296: # 2 ^ 32 + identifier_authority = hex(identifier_authority) + + sub_authority = '' + i = 0 + while i < sub_authority_count: + sub_authority += '-' + str(int(hexlify(raw_value[11 + (i * 4): 7 + (i * 4): -1]), 16)) # little endian + i += 1 + return 'S-' + str(revision) + '-' + str(identifier_authority) + sub_authority + except Exception: # any exception should be investigated, anyway the formatter return the raw_value + pass + + return raw_value diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/standard.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/standard.py new file mode 100644 index 0000000..42f6c26 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/standard.py @@ -0,0 +1,238 @@ +""" +""" + +# Created on 2014.10.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ... import SEQUENCE_TYPES +from .formatters import format_ad_timestamp, format_binary, format_boolean,\ + format_integer, format_sid, format_time, format_unicode, format_uuid, format_uuid_le, format_time_with_0_year,\ + format_ad_timedelta +from .validators import validate_integer, validate_time, always_valid,\ + validate_generic_single_value, validate_boolean, validate_ad_timestamp, validate_sid,\ + validate_uuid_le, validate_uuid, validate_zero_and_minus_one_and_positive_int, validate_guid, validate_time_with_0_year,\ + validate_ad_timedelta + +# for each syntax can be specified a format function and a input validation function + +standard_formatter = { + '1.2.840.113556.1.4.903': (format_binary, None), # Object (DN-binary) - Microsoft + '1.2.840.113556.1.4.904': (format_unicode, None), # Object (DN-string) - Microsoft + '1.2.840.113556.1.4.905': (format_unicode, None), # String (Teletex) - Microsoft + '1.2.840.113556.1.4.906': (format_integer, validate_integer), # Large integer - Microsoft + '1.2.840.113556.1.4.907': (format_binary, None), # String (NT-sec-desc) - Microsoft + '1.2.840.113556.1.4.1221': (format_binary, None), # Object (OR-name) - Microsoft + '1.2.840.113556.1.4.1362': (format_unicode, None), # String (Case) - Microsoft + '1.3.6.1.4.1.1466.115.121.1.1': (format_binary, None), # ACI item [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.2': (format_binary, None), # Access point [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.3': (format_unicode, None), # Attribute type description + '1.3.6.1.4.1.1466.115.121.1.4': (format_binary, None), # Audio [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.5': (format_binary, None), # Binary [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.6': (format_unicode, None), # Bit String + '1.3.6.1.4.1.1466.115.121.1.7': (format_boolean, validate_boolean), # Boolean + '1.3.6.1.4.1.1466.115.121.1.8': (format_binary, None), # Certificate [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.9': (format_binary, None), # Certificate List [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.10': (format_binary, None), # Certificate Pair [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.11': (format_unicode, None), # Country String + '1.3.6.1.4.1.1466.115.121.1.12': (format_unicode, None), # Distinguished name (DN) + '1.3.6.1.4.1.1466.115.121.1.13': (format_binary, None), # Data Quality Syntax [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.14': (format_unicode, None), # Delivery method + '1.3.6.1.4.1.1466.115.121.1.15': (format_unicode, None), # Directory string + '1.3.6.1.4.1.1466.115.121.1.16': (format_unicode, None), # DIT Content Rule Description + '1.3.6.1.4.1.1466.115.121.1.17': (format_unicode, None), # DIT Structure Rule Description + '1.3.6.1.4.1.1466.115.121.1.18': (format_binary, None), # DL Submit Permission [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.19': (format_binary, None), # DSA Quality Syntax [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.20': (format_binary, None), # DSE Type [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.21': (format_binary, None), # Enhanced Guide + '1.3.6.1.4.1.1466.115.121.1.22': (format_unicode, None), # Facsimile Telephone Number + '1.3.6.1.4.1.1466.115.121.1.23': (format_binary, None), # Fax + '1.3.6.1.4.1.1466.115.121.1.24': (format_time, validate_time), # Generalized time + '1.3.6.1.4.1.1466.115.121.1.25': (format_binary, None), # Guide [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.26': (format_unicode, None), # IA5 string + '1.3.6.1.4.1.1466.115.121.1.27': (format_integer, validate_integer), # Integer + '1.3.6.1.4.1.1466.115.121.1.28': (format_binary, None), # JPEG + '1.3.6.1.4.1.1466.115.121.1.29': (format_binary, None), # Master and Shadow Access Points [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.30': (format_unicode, None), # Matching rule description + '1.3.6.1.4.1.1466.115.121.1.31': (format_unicode, None), # Matching rule use description + '1.3.6.1.4.1.1466.115.121.1.32': (format_unicode, None), # Mail Preference [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.33': (format_unicode, None), # MHS OR Address [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.34': (format_unicode, None), # Name and optional UID + '1.3.6.1.4.1.1466.115.121.1.35': (format_unicode, None), # Name form description + '1.3.6.1.4.1.1466.115.121.1.36': (format_unicode, None), # Numeric string + '1.3.6.1.4.1.1466.115.121.1.37': (format_unicode, None), # Object class description + '1.3.6.1.4.1.1466.115.121.1.38': (format_unicode, None), # OID + '1.3.6.1.4.1.1466.115.121.1.39': (format_unicode, None), # Other mailbox + '1.3.6.1.4.1.1466.115.121.1.40': (format_binary, None), # Octet string + '1.3.6.1.4.1.1466.115.121.1.41': (format_unicode, None), # Postal address + '1.3.6.1.4.1.1466.115.121.1.42': (format_binary, None), # Protocol Information [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.43': (format_binary, None), # Presentation Address [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.44': (format_unicode, None), # Printable string + '1.3.6.1.4.1.1466.115.121.1.45': (format_binary, None), # Subtree specification [OBSOLETE + '1.3.6.1.4.1.1466.115.121.1.46': (format_binary, None), # Supplier Information [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.47': (format_binary, None), # Supplier Or Consumer [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.48': (format_binary, None), # Supplier And Consumer [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.49': (format_binary, None), # Supported Algorithm [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.50': (format_unicode, None), # Telephone number + '1.3.6.1.4.1.1466.115.121.1.51': (format_unicode, None), # Teletex terminal identifier + '1.3.6.1.4.1.1466.115.121.1.52': (format_unicode, None), # Teletex number + '1.3.6.1.4.1.1466.115.121.1.53': (format_time, validate_time), # Utc time (deprecated) + '1.3.6.1.4.1.1466.115.121.1.54': (format_unicode, None), # LDAP syntax description + '1.3.6.1.4.1.1466.115.121.1.55': (format_binary, None), # Modify rights [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.56': (format_binary, None), # LDAP Schema Definition [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.57': (format_unicode, None), # LDAP Schema Description [OBSOLETE] + '1.3.6.1.4.1.1466.115.121.1.58': (format_unicode, None), # Substring assertion + '1.3.6.1.1.16.1': (format_uuid, validate_uuid), # UUID + '1.3.6.1.1.16.4': (format_uuid, validate_uuid), # entryUUID (RFC 4530) + '2.16.840.1.113719.1.1.4.1.501': (format_uuid, validate_guid), # GUID (Novell) + '2.16.840.1.113719.1.1.5.1.0': (format_binary, None), # Unknown (Novell) + '2.16.840.1.113719.1.1.5.1.6': (format_unicode, None), # Case Ignore List (Novell) + '2.16.840.1.113719.1.1.5.1.12': (format_binary, None), # Tagged Data (Novell) + '2.16.840.1.113719.1.1.5.1.13': (format_binary, None), # Octet List (Novell) + '2.16.840.1.113719.1.1.5.1.14': (format_unicode, None), # Tagged String (Novell) + '2.16.840.1.113719.1.1.5.1.15': (format_unicode, None), # Tagged Name And String (Novell) + '2.16.840.1.113719.1.1.5.1.16': (format_binary, None), # NDS Replica Pointer (Novell) + '2.16.840.1.113719.1.1.5.1.17': (format_unicode, None), # NDS ACL (Novell) + '2.16.840.1.113719.1.1.5.1.19': (format_time, validate_time), # NDS Timestamp (Novell) + '2.16.840.1.113719.1.1.5.1.22': (format_integer, validate_integer), # Counter (Novell) + '2.16.840.1.113719.1.1.5.1.23': (format_unicode, None), # Tagged Name (Novell) + '2.16.840.1.113719.1.1.5.1.25': (format_unicode, None), # Typed Name (Novell) + 'supportedldapversion': (format_integer, None), # supportedLdapVersion (Microsoft) + 'octetstring': (format_binary, validate_uuid_le), # octect string (Microsoft) + '1.2.840.113556.1.4.2': (format_uuid_le, validate_uuid_le), # objectGUID (Microsoft) + '1.2.840.113556.1.4.13': (format_ad_timestamp, validate_ad_timestamp), # builtinCreationTime (Microsoft) + '1.2.840.113556.1.4.26': (format_ad_timestamp, validate_ad_timestamp), # creationTime (Microsoft) + '1.2.840.113556.1.4.49': (format_ad_timestamp, validate_ad_timestamp), # badPasswordTime (Microsoft) + '1.2.840.113556.1.4.51': (format_ad_timestamp, validate_ad_timestamp), # lastLogoff (Microsoft) + '1.2.840.113556.1.4.52': (format_ad_timestamp, validate_ad_timestamp), # lastLogon (Microsoft) + '1.2.840.113556.1.4.60': (format_ad_timedelta, validate_ad_timedelta), # lockoutDuration (Microsoft) + '1.2.840.113556.1.4.61': (format_ad_timedelta, validate_ad_timedelta), # lockOutObservationWindow (Microsoft) + '1.2.840.113556.1.4.74': (format_ad_timedelta, validate_ad_timedelta), # maxPwdAge (Microsoft) + '1.2.840.113556.1.4.78': (format_ad_timedelta, validate_ad_timedelta), # minPwdAge (Microsoft) + '1.2.840.113556.1.4.96': (format_ad_timestamp, validate_zero_and_minus_one_and_positive_int), # pwdLastSet (Microsoft, can be set to -1 only) + '1.2.840.113556.1.4.146': (format_sid, validate_sid), # objectSid (Microsoft) + '1.2.840.113556.1.4.159': (format_ad_timestamp, validate_ad_timestamp), # accountExpires (Microsoft) + '1.2.840.113556.1.4.662': (format_ad_timestamp, validate_ad_timestamp), # lockoutTime (Microsoft) + '1.2.840.113556.1.4.1696': (format_ad_timestamp, validate_ad_timestamp), # lastLogonTimestamp (Microsoft) + '1.3.6.1.4.1.42.2.27.8.1.17': (format_time_with_0_year, validate_time_with_0_year) # pwdAccountLockedTime (Novell) +} + + +def find_attribute_helpers(attr_type, name, custom_formatter): + """ + Tries to format following the OIDs info and format_helper specification. + Search for attribute oid, then attribute name (can be multiple), then attribute syntax + Precedence is: + 1. attribute name + 2. attribute oid(from schema) + 3. attribute names (from oid_info) + 4. attribute syntax (from schema) + Custom formatters can be defined in Server object and have precedence over the standard_formatters + If no formatter is found the raw_value is returned as bytes. + Attributes defined as SINGLE_VALUE in schema are returned as a single object, otherwise are returned as a list of object + Formatter functions can return any kind of object + return a tuple (formatter, validator) + """ + formatter = None + if custom_formatter and isinstance(custom_formatter, dict): # if custom formatters are defined they have precedence over the standard formatters + if name in custom_formatter: # search for attribute name, as returned by the search operation + formatter = custom_formatter[name] + + if not formatter and attr_type and attr_type.oid in custom_formatter: # search for attribute oid as returned by schema + formatter = custom_formatter[attr_type.oid] + if not formatter and attr_type and attr_type.oid_info: + if isinstance(attr_type.oid_info[2], SEQUENCE_TYPES): # search for multiple names defined in oid_info + for attr_name in attr_type.oid_info[2]: + if attr_name in custom_formatter: + formatter = custom_formatter[attr_name] + break + elif attr_type.oid_info[2] in custom_formatter: # search for name defined in oid_info + formatter = custom_formatter[attr_type.oid_info[2]] + + if not formatter and attr_type and attr_type.syntax in custom_formatter: # search for syntax defined in schema + formatter = custom_formatter[attr_type.syntax] + + if not formatter and name in standard_formatter: # search for attribute name, as returned by the search operation + formatter = standard_formatter[name] + + if not formatter and attr_type and attr_type.oid in standard_formatter: # search for attribute oid as returned by schema + formatter = standard_formatter[attr_type.oid] + + if not formatter and attr_type and attr_type.oid_info: + if isinstance(attr_type.oid_info[2], SEQUENCE_TYPES): # search for multiple names defined in oid_info + for attr_name in attr_type.oid_info[2]: + if attr_name in standard_formatter: + formatter = standard_formatter[attr_name] + break + elif attr_type.oid_info[2] in standard_formatter: # search for name defined in oid_info + formatter = standard_formatter[attr_type.oid_info[2]] + if not formatter and attr_type and attr_type.syntax in standard_formatter: # search for syntax defined in schema + formatter = standard_formatter[attr_type.syntax] + + if formatter is None: + return None, None + + return formatter + + +def format_attribute_values(schema, name, values, custom_formatter): + if not values: # RFCs states that attributes must always have values, but a flaky server returns empty values too + return [] + + if not isinstance(values, SEQUENCE_TYPES): + values = [values] + + if schema and schema.attribute_types and name in schema.attribute_types: + attr_type = schema.attribute_types[name] + else: + attr_type = None + + attribute_helpers = find_attribute_helpers(attr_type, name, custom_formatter) + if not isinstance(attribute_helpers, tuple): # custom formatter + formatter = attribute_helpers + else: + formatter = format_unicode if not attribute_helpers[0] else attribute_helpers[0] + + formatted_values = [formatter(raw_value) for raw_value in values] # executes formatter + if formatted_values: + return formatted_values[0] if (attr_type and attr_type.single_value) else formatted_values + else: # RFCs states that attributes must always have values, but AD return empty values in DirSync + return [] + + +def find_attribute_validator(schema, name, custom_validator): + if schema and schema.attribute_types and name in schema.attribute_types: + attr_type = schema.attribute_types[name] + else: + attr_type = None + + attribute_helpers = find_attribute_helpers(attr_type, name, custom_validator) + if not isinstance(attribute_helpers, tuple): # custom validator + validator = attribute_helpers + else: + if not attribute_helpers[1]: + if attr_type and attr_type.single_value: + validator = validate_generic_single_value # validate only single value + else: + validator = always_valid # unknown syntax, accepts single and multi value + else: + validator = attribute_helpers[1] + return validator diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/validators.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/validators.py new file mode 100644 index 0000000..d30b80f --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/formatters/validators.py @@ -0,0 +1,502 @@ +""" +""" + +# Created on 2016.08.09 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . +from binascii import a2b_hex, hexlify +from datetime import datetime +from calendar import timegm +from uuid import UUID +from struct import pack + + +from ... import SEQUENCE_TYPES, STRING_TYPES, NUMERIC_TYPES, INTEGER_TYPES +from .formatters import format_time, format_ad_timestamp +from ...utils.conv import to_raw, to_unicode, ldap_escape_to_bytes, escape_bytes + +# Validators return True if value is valid, False if value is not valid, +# or a value different from True and False that is a valid value to substitute to the input value + + +def check_backslash(value): + if isinstance(value, (bytearray, bytes)): + if b'\\' in value: + value = value.replace(b'\\', b'\\5C') + elif isinstance(value, STRING_TYPES): + if '\\' in value: + value = value.replace('\\', '\\5C') + return value + + +def check_type(input_value, value_type): + if isinstance(input_value, value_type): + return True + + if isinstance(input_value, SEQUENCE_TYPES): + for value in input_value: + if not isinstance(value, value_type): + return False + return True + + return False + + +# noinspection PyUnusedLocal +def always_valid(input_value): + return True + + +def validate_generic_single_value(input_value): + if not isinstance(input_value, SEQUENCE_TYPES): + return True + + try: # object couldn't have a __len__ method + if len(input_value) == 1: + return True + except Exception: + pass + + return False + + +def validate_zero_and_minus_one_and_positive_int(input_value): + """Accept -1 and 0 only (used by pwdLastSet in AD) + """ + if not isinstance(input_value, SEQUENCE_TYPES): + if isinstance(input_value, NUMERIC_TYPES) or isinstance(input_value, STRING_TYPES): + return True if int(input_value) >= -1 else False + return False + else: + if len(input_value) == 1 and (isinstance(input_value[0], NUMERIC_TYPES) or isinstance(input_value[0], STRING_TYPES)): + return True if int(input_value[0]) >= -1 else False + + return False + + +def validate_integer(input_value): + if check_type(input_value, (float, bool)): + return False + if check_type(input_value, INTEGER_TYPES): + return True + + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] # builds a list of valid int values + from decimal import Decimal, InvalidOperation + for element in input_value: + try: #try to convert any type to int, an invalid conversion raise TypeError or ValueError, doublecheck with Decimal type, if both are valid and equal then then int() value is used + value = to_unicode(element) if isinstance(element, bytes) else element + decimal_value = Decimal(value) + int_value = int(value) + if decimal_value == int_value: + valid_values.append(int_value) + else: + return False + except (ValueError, TypeError, InvalidOperation): + return False + + if sequence: + return valid_values + else: + return valid_values[0] + + +def validate_bytes(input_value): + return check_type(input_value, bytes) + + +def validate_boolean(input_value): + # it could be a real bool or the string TRUE or FALSE, # only a single valued is allowed + if validate_generic_single_value(input_value): # valid only if a single value or a sequence with a single element + if isinstance(input_value, SEQUENCE_TYPES): + input_value = input_value[0] + if isinstance(input_value, bool): + if input_value: + return 'TRUE' + else: + return 'FALSE' + if str is not bytes and isinstance(input_value, bytes): # python3 try to converts bytes to string + input_value = to_unicode(input_value) + if isinstance(input_value, STRING_TYPES): + if input_value.lower() == 'true': + return 'TRUE' + elif input_value.lower() == 'false': + return 'FALSE' + return False + + +def validate_time_with_0_year(input_value): + # validates generalized time but accept a 0000 year too + # if datetime object doesn't have a timezone it's considered local time and is adjusted to UTC + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if str is not bytes and isinstance(element, bytes): # python3 try to converts bytes to string + element = to_unicode(element) + if isinstance(element, STRING_TYPES): # tries to check if it is already be a Generalized Time + if element.startswith('0000') or isinstance(format_time(to_raw(element)), datetime): # valid Generalized Time string + valid_values.append(element) + else: + return False + elif isinstance(element, datetime): + changed = True + if element.tzinfo: # a datetime with a timezone + valid_values.append(element.strftime('%Y%m%d%H%M%S%z')) + else: # datetime without timezone, assumed local and adjusted to UTC + offset = datetime.now() - datetime.utcnow() + valid_values.append((element - offset).strftime('%Y%m%d%H%M%SZ')) + else: + return False + + if changed: + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_time(input_value): + # if datetime object doesn't have a timezone it's considered local time and is adjusted to UTC + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if str is not bytes and isinstance(element, bytes): # python3 try to converts bytes to string + element = to_unicode(element) + if isinstance(element, STRING_TYPES): # tries to check if it is already be a Generalized Time + if isinstance(format_time(to_raw(element)), datetime): # valid Generalized Time string + valid_values.append(element) + else: + return False + elif isinstance(element, datetime): + changed = True + if element.tzinfo: # a datetime with a timezone + valid_values.append(element.strftime('%Y%m%d%H%M%S%z')) + else: # datetime without timezone, assumed local and adjusted to UTC + offset = datetime.now() - datetime.utcnow() + valid_values.append((element - offset).strftime('%Y%m%d%H%M%SZ')) + else: + return False + + if changed: + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_ad_timestamp(input_value): + """ + Active Directory stores date/time values as the number of 100-nanosecond intervals + that have elapsed since the 0 hour on January 1, 1601 till the date/time that is being stored. + The time is always stored in Greenwich Mean Time (GMT) in the Active Directory. + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if str is not bytes and isinstance(element, bytes): # python3 try to converts bytes to string + element = to_unicode(element) + if isinstance(element, NUMERIC_TYPES): + if 0 <= element <= 9223372036854775807: # min and max for the AD timestamp starting from 12:00 AM January 1, 1601 + valid_values.append(element) + else: + return False + elif isinstance(element, STRING_TYPES): # tries to check if it is already be a AD timestamp + if isinstance(format_ad_timestamp(to_raw(element)), datetime): # valid Generalized Time string + valid_values.append(element) + else: + return False + elif isinstance(element, datetime): + changed = True + if element.tzinfo: # a datetime with a timezone + valid_values.append(to_raw((timegm(element.utctimetuple()) + 11644473600) * 10000000, encoding='ascii')) + else: # datetime without timezone, assumed local and adjusted to UTC + offset = datetime.now() - datetime.utcnow() + valid_values.append(to_raw((timegm((element - offset).timetuple()) + 11644473600) * 10000000, encoding='ascii')) + else: + return False + + if changed: + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_ad_timedelta(input_value): + """ + Should be validated like an AD timestamp except that since it is a time + delta, it is stored as a negative number. + """ + if not isinstance(input_value, INTEGER_TYPES) or input_value > 0: + return False + return validate_ad_timestamp(input_value * -1) + + +def validate_guid(input_value): + """ + object guid in uuid format (Novell eDirectory) + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if isinstance(element, STRING_TYPES): + try: + valid_values.append(UUID(element).bytes) + changed = True + except ValueError: # try if the value is an escaped ldap byte sequence + try: + x = ldap_escape_to_bytes(element) + valid_values.append(UUID(bytes=x).bytes) + changed = True + continue + except ValueError: + if str is not bytes: # python 3 + pass + else: + valid_values.append(element) + continue + return False + elif isinstance(element, (bytes, bytearray)): # assumes bytes are valid + valid_values.append(element) + else: + return False + + if changed: + # valid_values = [check_backslash(value) for value in valid_values] + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_uuid(input_value): + """ + object entryUUID in uuid format + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if isinstance(element, STRING_TYPES): + try: + valid_values.append(str(UUID(element))) + changed = True + except ValueError: # try if the value is an escaped byte sequence + try: + valid_values.append(str(UUID(element.replace('\\', '')))) + changed = True + continue + except ValueError: + if str is not bytes: # python 3 + pass + else: + valid_values.append(element) + continue + return False + elif isinstance(element, (bytes, bytearray)): # assumes bytes are valid + valid_values.append(element) + else: + return False + + if changed: + # valid_values = [check_backslash(value) for value in valid_values] + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_uuid_le(input_value): + r""" + Active Directory stores objectGUID in uuid_le format, follows RFC4122 and MS-DTYP: + "{07039e68-4373-264d-a0a7-07039e684373}": string representation big endian, converted to little endian (with or without brace curles) + "689e030773434d26a7a007039e684373": packet representation, already in little endian + "\68\9e\03\07\73\43\4d\26\a7\a0\07\03\9e\68\43\73": bytes representation, already in little endian + byte sequence: already in little endian + + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + error = False + if isinstance(element, STRING_TYPES): + if element[0] == '{' and element[-1] == '}': + try: + valid_values.append(UUID(hex=element).bytes_le) # string representation, value in big endian, converts to little endian + changed = True + except ValueError: + error = True + elif '-' in element: + try: + valid_values.append(UUID(hex=element).bytes_le) # string representation, value in big endian, converts to little endian + changed = True + except ValueError: + error = True + elif '\\' in element: + try: + valid_values.append(UUID(bytes_le=ldap_escape_to_bytes(element)).bytes_le) # byte representation, value in little endian + changed = True + except ValueError: + error = True + elif '-' not in element: # value in little endian + try: + valid_values.append(UUID(bytes_le=a2b_hex(element)).bytes_le) # packet representation, value in little endian, converts to little endian + changed = True + except ValueError: + error = True + if error and (str is bytes): # python2 only assume value is bytes and valid + valid_values.append(element) # value is untouched, must be in little endian + elif isinstance(element, (bytes, bytearray)): # assumes bytes are valid uuid + valid_values.append(element) # value is untouched, must be in little endian + else: + return False + + if changed: + # valid_values = [check_backslash(value) for value in valid_values] + if sequence: + return valid_values + else: + return valid_values[0] + else: + return True + + +def validate_sid(input_value): + """ + SID= "S-1-" IdentifierAuthority 1*SubAuthority + IdentifierAuthority= IdentifierAuthorityDec / IdentifierAuthorityHex + ; If the identifier authority is < 2^32, the + ; identifier authority is represented as a decimal + ; number + ; If the identifier authority is >= 2^32, + ; the identifier authority is represented in + ; hexadecimal + IdentifierAuthorityDec = 1*10DIGIT + ; IdentifierAuthorityDec, top level authority of a + ; security identifier is represented as a decimal number + IdentifierAuthorityHex = "0x" 12HEXDIG + ; IdentifierAuthorityHex, the top-level authority of a + ; security identifier is represented as a hexadecimal number + SubAuthority= "-" 1*10DIGIT + ; Sub-Authority is always represented as a decimal number + ; No leading "0" characters are allowed when IdentifierAuthority + ; or SubAuthority is represented as a decimal number + ; All hexadecimal digits must be output in string format, + ; pre-pended by "0x" + + Revision (1 byte): An 8-bit unsigned integer that specifies the revision level of the SID. This value MUST be set to 0x01. + SubAuthorityCount (1 byte): An 8-bit unsigned integer that specifies the number of elements in the SubAuthority array. The maximum number of elements allowed is 15. + IdentifierAuthority (6 bytes): A SID_IDENTIFIER_AUTHORITY structure that indicates the authority under which the SID was created. It describes the entity that created the SID. The Identifier Authority value {0,0,0,0,0,5} denotes SIDs created by the NT SID authority. + SubAuthority (variable): A variable length array of unsigned 32-bit integers that uniquely identifies a principal relative to the IdentifierAuthority. Its length is determined by SubAuthorityCount. + + If you have a SID like S-a-b-c-d-e-f-g-... + + Then the bytes are + a (revision) + N (number of dashes minus two) + bbbbbb (six bytes of "b" treated as a 48-bit number in big-endian format) + cccc (four bytes of "c" treated as a 32-bit number in little-endian format) + dddd (four bytes of "d" treated as a 32-bit number in little-endian format) + eeee (four bytes of "e" treated as a 32-bit number in little-endian format) + ffff (four bytes of "f" treated as a 32-bit number in little-endian format) + + """ + if not isinstance(input_value, SEQUENCE_TYPES): + sequence = False + input_value = [input_value] + else: + sequence = True # indicates if a sequence must be returned + + valid_values = [] + changed = False + for element in input_value: + if isinstance(element, STRING_TYPES): + if element.startswith('S-'): + parts = element.split('-') + sid_bytes = pack('q', int(parts[2]))[2:] # authority (in dec) + else: + sid_bytes += pack('>q', int(parts[2], 16))[2:] # authority (in hex) + for sub_auth in parts[3:]: + sid_bytes += pack('. + +import ctypes + +from pyasn1.type.namedtype import NamedTypes, NamedType +from pyasn1.type.tag import Tag, tagClassApplication, tagFormatConstructed +from pyasn1.type.univ import Sequence, OctetString, Integer +from .rfc4511 import ResultCode, LDAPString +from .controls import build_control + + +class SicilyBindResponse(Sequence): + # SicilyBindResponse ::= [APPLICATION 1] SEQUENCE { + # + # resultCode ENUMERATED { + # success (0), + # protocolError (2), + # adminLimitExceeded (11), + # inappropriateAuthentication (48), + # invalidCredentials (49), + # busy (51), + # unavailable (52), + # unwillingToPerform (53), + # other (80) }, + # + # serverCreds OCTET STRING, + # errorMessage LDAPString } + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 1)) + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('serverCreds', OctetString()), + NamedType('errorMessage', LDAPString()) + ) + + +class DirSyncControlRequestValue(Sequence): + # DirSyncRequestValue ::= SEQUENCE { + # Flags integer + # MaxBytes integer + # Cookie OCTET STRING } + componentType = NamedTypes(NamedType('Flags', Integer()), + NamedType('MaxBytes', Integer()), + NamedType('Cookie', OctetString()) + ) + + +class DirSyncControlResponseValue(Sequence): + # DirSyncResponseValue ::= SEQUENCE { + # MoreResults INTEGER + # unused INTEGER + # CookieServer OCTET STRING + # } + componentType = NamedTypes(NamedType('MoreResults', Integer()), + NamedType('unused', Integer()), + NamedType('CookieServer', OctetString()) + ) + + +class SdFlags(Sequence): + # SDFlagsRequestValue ::= SEQUENCE { + # Flags INTEGER + # } + componentType = NamedTypes(NamedType('Flags', Integer()) + ) + + +class ExtendedDN(Sequence): + # A flag value 0 specifies that the GUID and SID values be returned in hexadecimal string + # A flag value of 1 will return the GUID and SID values in standard string format + componentType = NamedTypes(NamedType('option', Integer()) + ) + + +def dir_sync_control(criticality, object_security, ancestors_first, public_data_only, incremental_values, max_length, cookie): + control_value = DirSyncControlRequestValue() + flags = 0x0 + if object_security: + flags |= 0x00000001 + + if ancestors_first: + flags |= 0x00000800 + + if public_data_only: + flags |= 0x00002000 + + if incremental_values: + flags |= 0x80000000 + # converts flags to signed 32 bit (AD expects a 4 bytes long unsigned integer, but ASN.1 Integer type is signed + # so the BER encoder gives back a 5 bytes long signed integer + flags = ctypes.c_long(flags & 0xFFFFFFFF).value + + control_value.setComponentByName('Flags', flags) + control_value.setComponentByName('MaxBytes', max_length) + if cookie: + control_value.setComponentByName('Cookie', cookie) + else: + control_value.setComponentByName('Cookie', OctetString('')) + return build_control('1.2.840.113556.1.4.841', criticality, control_value) + + +def extended_dn_control(criticality=False, hex_format=False): + control_value = ExtendedDN() + control_value.setComponentByName('option', Integer(not hex_format)) + return build_control('1.2.840.113556.1.4.529', criticality, control_value) + + +def show_deleted_control(criticality=False): + return build_control('1.2.840.113556.1.4.417', criticality, value=None) + + +def security_descriptor_control(criticality=False, sdflags=0x0F): + sdcontrol = SdFlags() + sdcontrol.setComponentByName('Flags', sdflags) + return [build_control('1.2.840.113556.1.4.801', criticality, sdcontrol)] + +def persistent_search_control(criticality=False): + return build_control('1.2.840.113556.1.4.528', criticality, value=None) \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/novell.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/novell.py new file mode 100644 index 0000000..af8aeb3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/novell.py @@ -0,0 +1,141 @@ +""" +""" + +# Created on 2014.06.27 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString, Integer, Sequence, SequenceOf +from pyasn1.type.namedtype import NamedType, NamedTypes, OptionalNamedType +from pyasn1.type.tag import Tag, tagFormatSimple, tagClassUniversal, TagSet + +NMAS_LDAP_EXT_VERSION = 1 + + +class Identity(OctetString): + encoding = 'utf-8' + + +class LDAPDN(OctetString): + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 4)) + encoding = 'utf-8' + + +class Password(OctetString): + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 4)) + encoding = 'utf-8' + + +class LDAPOID(OctetString): + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 4)) + encoding = 'utf-8' + + +class GroupCookie(Integer): + tagSet = Integer.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 2)) + + +class NmasVer(Integer): + tagSet = Integer.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 2)) + + +class Error(Integer): + tagSet = Integer.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatSimple, 2)) + + +class NmasGetUniversalPasswordRequestValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('reqdn', Identity()) + ) + + +class NmasGetUniversalPasswordResponseValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('err', Error()), + OptionalNamedType('passwd', Password()) + ) + + +class NmasSetUniversalPasswordRequestValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('reqdn', Identity()), + NamedType('new_passwd', Password()) + ) + + +class NmasSetUniversalPasswordResponseValue(Sequence): + componentType = NamedTypes(NamedType('nmasver', NmasVer()), + NamedType('err', Error()) + ) + + +class ReplicaList(SequenceOf): + componentType = OctetString() + + +class ReplicaInfoRequestValue(Sequence): + tagSet = TagSet() + componentType = NamedTypes(NamedType('server_dn', LDAPDN()), + NamedType('partition_dn', LDAPDN()) + ) + + +class ReplicaInfoResponseValue(Sequence): + # tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + tagSet = TagSet() + componentType = NamedTypes(NamedType('partition_id', Integer()), + NamedType('replica_state', Integer()), + NamedType('modification_time', Integer()), + NamedType('purge_time', Integer()), + NamedType('local_partition_id', Integer()), + NamedType('partition_dn', LDAPDN()), + NamedType('replica_type', Integer()), + NamedType('flags', Integer()) + ) + + +class CreateGroupTypeRequestValue(Sequence): + componentType = NamedTypes(NamedType('createGroupType', LDAPOID()), + OptionalNamedType('createGroupValue', OctetString()) + ) + + +class CreateGroupTypeResponseValue(Sequence): + componentType = NamedTypes(NamedType('createGroupCookie', GroupCookie()), + OptionalNamedType('createGroupValue', OctetString()) + ) + + +class EndGroupTypeRequestValue(Sequence): + componentType = NamedTypes(NamedType('endGroupCookie', GroupCookie()), + OptionalNamedType('endGroupValue', OctetString()) + ) + + +class EndGroupTypeResponseValue(Sequence): + componentType = NamedTypes(OptionalNamedType('endGroupValue', OctetString()) + ) + + +class GroupingControlValue(Sequence): + componentType = NamedTypes(NamedType('groupingCookie', GroupCookie()), + OptionalNamedType('groupValue', OctetString()) + ) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/oid.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/oid.py new file mode 100644 index 0000000..6dfadd3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/oid.py @@ -0,0 +1,1208 @@ +""" +""" + +# Created on 2013.08.30 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import SEQUENCE_TYPES + +# Holds info about OIDs. +# Each OID info is a named tuple with the following attributes: +# oid - the OID number +# type - type of OID +# name - description of OID +# doc - reference document of OID +# +# Source of information is IANA ldap-parameters.txt, oid-registry and products documentation as of 2013.08.21 + + +# OID database definition +OID_CONTROL = 'CONTROL' +OID_EXTENSION = 'EXTENSION' +OID_FEATURE = 'FEATURE' +OID_UNSOLICITED_NOTICE = 'UNSOLICITED_NOTICE' +OID_ATTRIBUTE_TYPE = 'ATTRIBUTE_TYPE' +OID_DIT_CONTENT_RULE = 'DIT_CONTENT_RULE' +OID_LDAP_URL_EXTENSION = 'LDAP_URL_EXTENSION' +OID_FAMILY = 'FAMILY' +OID_MATCHING_RULE = 'MATCHING_RULE' +OID_NAME_FORM = 'NAME_FORM' +OID_OBJECT_CLASS = 'OBJECT_CLASS' +OID_ADMINISTRATIVE_ROLE = 'ADMINISTRATIVE_ROLE' +OID_LDAP_SYNTAX = 'LDAP_SYNTAX' + +# class kind +CLASS_STRUCTURAL = 'STRUCTURAL' +CLASS_ABSTRACT = 'ABSTRACT' +CLASS_AUXILIARY = 'AUXILIARY' + +# attribute kind +ATTRIBUTE_USER_APPLICATION = 'USER_APPLICATION' +ATTRIBUTE_DIRECTORY_OPERATION = 'DIRECTORY_OPERATION' +ATTRIBUTE_DISTRIBUTED_OPERATION = 'DISTRIBUTED_OPERATION' +ATTRIBUTE_DSA_OPERATION = 'DSA_OPERATION' + + +def constant_to_oid_kind(oid_kind): + if oid_kind == OID_CONTROL: + return 'Control' + elif oid_kind == OID_EXTENSION: + return 'Extension' + elif oid_kind == OID_FEATURE: + return 'Feature' + elif oid_kind == OID_UNSOLICITED_NOTICE: + return 'Unsolicited Notice' + elif oid_kind == OID_ATTRIBUTE_TYPE: + return 'Attribute Type' + elif oid_kind == OID_DIT_CONTENT_RULE: + return 'DIT Content Rule' + elif oid_kind == OID_LDAP_URL_EXTENSION: + return 'LDAP URL Extension' + elif oid_kind == OID_FAMILY: + return 'Family' + elif oid_kind == OID_MATCHING_RULE: + return 'Matching Rule' + elif oid_kind == OID_NAME_FORM: + return 'Name Form' + elif oid_kind == OID_OBJECT_CLASS: + return 'Object Class' + elif oid_kind == OID_ADMINISTRATIVE_ROLE: + return 'Administrative Role' + elif oid_kind == OID_LDAP_SYNTAX: + return 'LDAP Syntax' + else: + return 'Unknown' + + +def decode_oids(sequence): + if sequence: + return sorted([Oids.get(oid, (oid, None, None, None)) for oid in sequence if oid]) + return list() + + +def decode_syntax(syntax): + if not syntax: + return None + return Oids.get(syntax, None) + + +def oid_to_string(oid): + s = oid[0] + if oid[2]: + s += ' - ' + ((', '.join(oid[2])) if isinstance(oid[2], SEQUENCE_TYPES) else oid[2]) + s += (' - ' + constant_to_oid_kind(oid[1])) if oid[1] is not None else '' + s += (' - ' + oid[3]) if oid[3] else '' + + return s + +# tuple structure: (oid, kind, name, docs) + +# noinspection PyPep8 +Oids = { # administrative role + '2.5.23.1': ('2.5.23.1', OID_ADMINISTRATIVE_ROLE, 'autonomousArea', 'RFC3672'), + '2.5.23.2': ('2.5.23.2', OID_ADMINISTRATIVE_ROLE, 'accessControlSpecificArea', 'RFC3672'), + '2.5.23.3': ('2.5.23.3', OID_ADMINISTRATIVE_ROLE, 'accessControlInnerArea', 'RFC3672'), + '2.5.23.4': ('2.5.23.4', OID_ADMINISTRATIVE_ROLE, 'subschemaAdminSpecificArea', 'RFC3672'), + '2.5.23.5': ('2.5.23.5', OID_ADMINISTRATIVE_ROLE, 'collectiveAttributeSpecificArea', 'RFC3672'), + '2.5.23.6': ('2.5.23.6', OID_ADMINISTRATIVE_ROLE, 'collectiveAttributeInnerArea', 'RFC3672'), + + # attributes type + '0.9.2342.19200300.100.1.1': ('0.9.2342.19200300.100.1.1', OID_ATTRIBUTE_TYPE, ['uid', 'userId'], 'RFC4519'), + '0.9.2342.19200300.100.1.2': ('0.9.2342.19200300.100.1.2', OID_ATTRIBUTE_TYPE, 'textEncodedORAddress', 'RFC1274'), + '0.9.2342.19200300.100.1.3': ('0.9.2342.19200300.100.1.3', OID_ATTRIBUTE_TYPE, ['mail', 'RFC822Mailbox'], 'RFC4524'), + '0.9.2342.19200300.100.1.4': ('0.9.2342.19200300.100.1.4', OID_ATTRIBUTE_TYPE, 'info', 'RFC4524'), + '0.9.2342.19200300.100.1.5': ('0.9.2342.19200300.100.1.5', OID_ATTRIBUTE_TYPE, ['drink', 'favouriteDrink'], 'RFC4524'), + '0.9.2342.19200300.100.1.6': ('0.9.2342.19200300.100.1.6', OID_ATTRIBUTE_TYPE, 'roomNumber', 'RFC4524'), + '0.9.2342.19200300.100.1.7': ('0.9.2342.19200300.100.1.7', OID_ATTRIBUTE_TYPE, 'photo', 'RFC1274'), + '0.9.2342.19200300.100.1.8': ('0.9.2342.19200300.100.1.8', OID_ATTRIBUTE_TYPE, 'userClass', 'RFC4524'), + '0.9.2342.19200300.100.1.9': ('0.9.2342.19200300.100.1.9', OID_ATTRIBUTE_TYPE, 'host', 'RFC4524'), + '0.9.2342.19200300.100.1.10': ('0.9.2342.19200300.100.1.10', OID_ATTRIBUTE_TYPE, 'manager', 'RFC4524'), + '0.9.2342.19200300.100.1.11': ('0.9.2342.19200300.100.1.11', OID_ATTRIBUTE_TYPE, 'documentIdentifier', 'RFC4524'), + '0.9.2342.19200300.100.1.12': ('0.9.2342.19200300.100.1.12', OID_ATTRIBUTE_TYPE, 'documentTitle', 'RFC4524'), + '0.9.2342.19200300.100.1.13': ('0.9.2342.19200300.100.1.13', OID_ATTRIBUTE_TYPE, 'documentVersion', 'RFC4524'), + '0.9.2342.19200300.100.1.14': ('0.9.2342.19200300.100.1.14', OID_ATTRIBUTE_TYPE, 'documentAuthor', 'RFC4524'), + '0.9.2342.19200300.100.1.15': ('0.9.2342.19200300.100.1.15', OID_ATTRIBUTE_TYPE, 'documentLocation', 'RFC4524'), + '0.9.2342.19200300.100.1.20': ('0.9.2342.19200300.100.1.20', OID_ATTRIBUTE_TYPE, ['homePhone', 'homeTelephone'], 'RFC4524'), + '0.9.2342.19200300.100.1.21': ('0.9.2342.19200300.100.1.21', OID_ATTRIBUTE_TYPE, 'secretary', 'RFC4524'), + '0.9.2342.19200300.100.1.22': ('0.9.2342.19200300.100.1.22', OID_ATTRIBUTE_TYPE, 'otherMailbox', 'RFC1274'), + '0.9.2342.19200300.100.1.23': ('0.9.2342.19200300.100.1.23', OID_ATTRIBUTE_TYPE, 'lastModifiedTime', 'RFC1274'), + '0.9.2342.19200300.100.1.24': ('0.9.2342.19200300.100.1.24', OID_ATTRIBUTE_TYPE, 'lastModifiedBy', 'RFC1274'), + '0.9.2342.19200300.100.1.25': ('0.9.2342.19200300.100.1.25', OID_ATTRIBUTE_TYPE, ['DC', 'domainComponent'], 'RFC4519'), + '0.9.2342.19200300.100.1.26': ('0.9.2342.19200300.100.1.26', OID_ATTRIBUTE_TYPE, 'aRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.27': ('0.9.2342.19200300.100.1.27', OID_ATTRIBUTE_TYPE, 'mDRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.28': ('0.9.2342.19200300.100.1.28', OID_ATTRIBUTE_TYPE, 'mXRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.29': ('0.9.2342.19200300.100.1.29', OID_ATTRIBUTE_TYPE, 'nSRecord', 'RFC1274'), + '0.9.2342.19200300.100.1.30': ('0.9.2342.19200300.100.1.30', OID_ATTRIBUTE_TYPE, 'sOARecord', 'RFC1274'), + '0.9.2342.19200300.100.1.31': ('0.9.2342.19200300.100.1.31', OID_ATTRIBUTE_TYPE, 'cNAMERecord', 'RFC1274'), + '0.9.2342.19200300.100.1.37': ('0.9.2342.19200300.100.1.37', OID_ATTRIBUTE_TYPE, 'associatedDomain', 'RFC4524'), + '0.9.2342.19200300.100.1.38': ('0.9.2342.19200300.100.1.38', OID_ATTRIBUTE_TYPE, 'associatedName', 'RFC4524'), + '0.9.2342.19200300.100.1.39': ('0.9.2342.19200300.100.1.39', OID_ATTRIBUTE_TYPE, 'homePostalAddress', 'RFC4524'), + '0.9.2342.19200300.100.1.40': ('0.9.2342.19200300.100.1.40', OID_ATTRIBUTE_TYPE, 'personalTitle', 'RFC4524'), + '0.9.2342.19200300.100.1.41': ('0.9.2342.19200300.100.1.41', OID_ATTRIBUTE_TYPE, ['mobile', 'mobileTelephoneNumber'], 'RFC4524'), + '0.9.2342.19200300.100.1.42': ('0.9.2342.19200300.100.1.42', OID_ATTRIBUTE_TYPE, ['pager', 'pagerTelephoneNumber'], 'RFC4524'), + '0.9.2342.19200300.100.1.43': ('0.9.2342.19200300.100.1.43', OID_ATTRIBUTE_TYPE, ['co', 'friendlyCountryName'], 'RFC4524'), + '0.9.2342.19200300.100.1.44': ('0.9.2342.19200300.100.1.44', OID_ATTRIBUTE_TYPE, 'uniqueIdentifier', 'RFC4524'), + '0.9.2342.19200300.100.1.45': ('0.9.2342.19200300.100.1.45', OID_ATTRIBUTE_TYPE, 'organizationalStatus', 'RFC4524'), + '0.9.2342.19200300.100.1.46': ('0.9.2342.19200300.100.1.46', OID_ATTRIBUTE_TYPE, 'janetMailbox', 'RFC1274'), + '0.9.2342.19200300.100.1.47': ('0.9.2342.19200300.100.1.47', OID_ATTRIBUTE_TYPE, 'mailPreferenceOption', 'RFC1274'), + '0.9.2342.19200300.100.1.48': ('0.9.2342.19200300.100.1.48', OID_ATTRIBUTE_TYPE, 'buildingName', 'RFC4524'), + '0.9.2342.19200300.100.1.49': ('0.9.2342.19200300.100.1.49', OID_ATTRIBUTE_TYPE, 'dSAQuality', 'RFC1274'), + '0.9.2342.19200300.100.1.50': ('0.9.2342.19200300.100.1.50', OID_ATTRIBUTE_TYPE, 'singleLevelQuality', 'RFC4524'), + '0.9.2342.19200300.100.1.51': ('0.9.2342.19200300.100.1.51', OID_ATTRIBUTE_TYPE, 'subtreeMinimumQuality', 'RFC1274'), + '0.9.2342.19200300.100.1.52': ('0.9.2342.19200300.100.1.52', OID_ATTRIBUTE_TYPE, 'subtreeMaximumQuality', 'RFC1274'), + '0.9.2342.19200300.100.1.53': ('0.9.2342.19200300.100.1.53', OID_ATTRIBUTE_TYPE, 'personalSignature', 'RFC1274'), + '0.9.2342.19200300.100.1.54': ('0.9.2342.19200300.100.1.54', OID_ATTRIBUTE_TYPE, 'dITRedirect', 'RFC1274'), + '0.9.2342.19200300.100.1.55': ('0.9.2342.19200300.100.1.55', OID_ATTRIBUTE_TYPE, 'audio', 'RFC1274'), + '0.9.2342.19200300.100.1.56': ('0.9.2342.19200300.100.1.56', OID_ATTRIBUTE_TYPE, 'documentPublisher', 'RFC4524'), + '0.9.2342.19200300.100.1.60': ('0.9.2342.19200300.100.1.60', OID_ATTRIBUTE_TYPE, 'jpegPhoto', 'RFC2798'), + '1.2.840.113549.1.9.1': ('1.2.840.113549.1.9.1', OID_ATTRIBUTE_TYPE, ['email', 'emailAddress'], 'RFC3280'), + '1.2.840.113556.1.4.478': ('1.2.840.113556.1.4.478', OID_ATTRIBUTE_TYPE, 'calCalURI', 'RFC2739'), + '1.2.840.113556.1.4.479': ('1.2.840.113556.1.4.479', OID_ATTRIBUTE_TYPE, 'calFBURL', 'RFC2739'), + '1.2.840.113556.1.4.480': ('1.2.840.113556.1.4.480', OID_ATTRIBUTE_TYPE, 'calCAPURI', 'RFC2739'), + '1.2.840.113556.1.4.481': ('1.2.840.113556.1.4.481', OID_ATTRIBUTE_TYPE, 'calCalAdrURI', 'RFC2739'), + '1.2.840.113556.1.4.482': ('1.2.840.113556.1.4.482', OID_ATTRIBUTE_TYPE, 'calOtherCalURIs', 'RFC2739'), + '1.2.840.113556.1.4.483': ('1.2.840.113556.1.4.483', OID_ATTRIBUTE_TYPE, 'calOtherFBURLs', 'RFC2739'), + '1.2.840.113556.1.4.484': ('1.2.840.113556.1.4.484', OID_ATTRIBUTE_TYPE, 'calOtherCAPURIs', 'RFC2739'), + '1.2.840.113556.1.4.485': ('1.2.840.113556.1.4.485', OID_ATTRIBUTE_TYPE, 'calOtherCalAdrURIs', 'RFC2739'), + '1.3.18.0.2.4.1107': ('1.3.18.0.2.4.1107', OID_ATTRIBUTE_TYPE, 'printer-xri-supported', 'RFC3712'), + '1.3.18.0.2.4.1108': ('1.3.18.0.2.4.1108', OID_ATTRIBUTE_TYPE, 'printer-aliases', 'RFC3712'), + '1.3.18.0.2.4.1109': ('1.3.18.0.2.4.1109', OID_ATTRIBUTE_TYPE, 'printer-charset-configured', 'RFC3712'), + '1.3.18.0.2.4.1110': ('1.3.18.0.2.4.1110', OID_ATTRIBUTE_TYPE, 'printer-job-priority-supported', 'RFC3712'), + '1.3.18.0.2.4.1111': ('1.3.18.0.2.4.1111', OID_ATTRIBUTE_TYPE, 'printer-job-k-octets-supported', 'RFC3712'), + '1.3.18.0.2.4.1112': ('1.3.18.0.2.4.1112', OID_ATTRIBUTE_TYPE, 'printer-current-operator', 'RFC3712'), + '1.3.18.0.2.4.1113': ('1.3.18.0.2.4.1113', OID_ATTRIBUTE_TYPE, 'printer-service-person', 'RFC3712'), + '1.3.18.0.2.4.1114': ('1.3.18.0.2.4.1114', OID_ATTRIBUTE_TYPE, 'printer-delivery-orientation-supported', 'RFC3712'), + '1.3.18.0.2.4.1115': ('1.3.18.0.2.4.1115', OID_ATTRIBUTE_TYPE, 'printer-stacking-order-supported', 'RFC3712'), + '1.3.18.0.2.4.1116': ('1.3.18.0.2.4.1116', OID_ATTRIBUTE_TYPE, 'printer-output-features-supported', 'RFC3712'), + '1.3.18.0.2.4.1117': ('1.3.18.0.2.4.1117', OID_ATTRIBUTE_TYPE, 'printer-media-local-supported', 'RFC3712'), + '1.3.18.0.2.4.1118': ('1.3.18.0.2.4.1118', OID_ATTRIBUTE_TYPE, 'printer-copies-supported', 'RFC3712'), + '1.3.18.0.2.4.1119': ('1.3.18.0.2.4.1119', OID_ATTRIBUTE_TYPE, 'printer-natural-language-configured', 'RFC3712'), + '1.3.18.0.2.4.1120': ('1.3.18.0.2.4.1120', OID_ATTRIBUTE_TYPE, 'printer-print-quality-supported', 'RFC3712'), + '1.3.18.0.2.4.1121': ('1.3.18.0.2.4.1121', OID_ATTRIBUTE_TYPE, 'printer-resolution-supported', 'RFC3712'), + '1.3.18.0.2.4.1122': ('1.3.18.0.2.4.1122', OID_ATTRIBUTE_TYPE, 'printer-media-supported', 'RFC3712'), + '1.3.18.0.2.4.1123': ('1.3.18.0.2.4.1123', OID_ATTRIBUTE_TYPE, 'printer-sides-supported', 'RFC3712'), + '1.3.18.0.2.4.1124': ('1.3.18.0.2.4.1124', OID_ATTRIBUTE_TYPE, 'printer-number-up-supported', 'RFC3712'), + '1.3.18.0.2.4.1125': ('1.3.18.0.2.4.1125', OID_ATTRIBUTE_TYPE, 'printer-finishings-supported', 'RFC3712'), + '1.3.18.0.2.4.1126': ('1.3.18.0.2.4.1126', OID_ATTRIBUTE_TYPE, 'printer-pages-per-minute-color', 'RFC3712'), + '1.3.18.0.2.4.1127': ('1.3.18.0.2.4.1127', OID_ATTRIBUTE_TYPE, 'printer-pages-per-minute', 'RFC3712'), + '1.3.18.0.2.4.1128': ('1.3.18.0.2.4.1128', OID_ATTRIBUTE_TYPE, 'printer-compression-supported', 'RFC3712'), + '1.3.18.0.2.4.1129': ('1.3.18.0.2.4.1129', OID_ATTRIBUTE_TYPE, 'printer-color-supported', 'RFC3712'), + '1.3.18.0.2.4.1130': ('1.3.18.0.2.4.1130', OID_ATTRIBUTE_TYPE, 'printer-document-format-supported', 'RFC3712'), + '1.3.18.0.2.4.1131': ('1.3.18.0.2.4.1131', OID_ATTRIBUTE_TYPE, 'printer-charset-supported', 'RFC3712'), + '1.3.18.0.2.4.1132': ('1.3.18.0.2.4.1132', OID_ATTRIBUTE_TYPE, 'printer-multiple-document-jobs-supported', 'RFC3712'), + '1.3.18.0.2.4.1133': ('1.3.18.0.2.4.1133', OID_ATTRIBUTE_TYPE, 'printer-ipp-versions-supported', 'RFC3712'), + '1.3.18.0.2.4.1134': ('1.3.18.0.2.4.1134', OID_ATTRIBUTE_TYPE, 'printer-more-info', 'RFC3712'), + '1.3.18.0.2.4.1135': ('1.3.18.0.2.4.1135', OID_ATTRIBUTE_TYPE, 'printer-name', 'RFC3712'), + '1.3.18.0.2.4.1136': ('1.3.18.0.2.4.1136', OID_ATTRIBUTE_TYPE, 'printer-location', 'RFC3712'), + '1.3.18.0.2.4.1137': ('1.3.18.0.2.4.1137', OID_ATTRIBUTE_TYPE, 'printer-generated-natural-language-supported', 'RFC3712'), + '1.3.18.0.2.4.1138': ('1.3.18.0.2.4.1138', OID_ATTRIBUTE_TYPE, 'printer-make-and-model', 'RFC3712'), + '1.3.18.0.2.4.1139': ('1.3.18.0.2.4.1139', OID_ATTRIBUTE_TYPE, 'printer-info', 'RFC3712'), + '1.3.18.0.2.4.1140': ('1.3.18.0.2.4.1140', OID_ATTRIBUTE_TYPE, 'printer-uri', 'RFC3712'), + '1.3.6.1.1.10.4.1': ('1.3.6.1.1.10.4.1', OID_ATTRIBUTE_TYPE, 'uddiBusinessKey', 'RFC4403'), + '1.3.6.1.1.10.4.2': ('1.3.6.1.1.10.4.2', OID_ATTRIBUTE_TYPE, 'uddiAuthorizedName', 'RFC4403'), + '1.3.6.1.1.10.4.3': ('1.3.6.1.1.10.4.3', OID_ATTRIBUTE_TYPE, 'uddiOperator', 'RFC4403'), + '1.3.6.1.1.10.4.4': ('1.3.6.1.1.10.4.4', OID_ATTRIBUTE_TYPE, 'uddiName', 'RFC4403'), + '1.3.6.1.1.10.4.5': ('1.3.6.1.1.10.4.5', OID_ATTRIBUTE_TYPE, 'uddiDescription', 'RFC4403'), + '1.3.6.1.1.10.4.6': ('1.3.6.1.1.10.4.6', OID_ATTRIBUTE_TYPE, 'uddiDiscoveryURLs', 'RFC4403'), + '1.3.6.1.1.10.4.7': ('1.3.6.1.1.10.4.7', OID_ATTRIBUTE_TYPE, 'uddiUseType', 'RFC4403'), + '1.3.6.1.1.10.4.8': ('1.3.6.1.1.10.4.8', OID_ATTRIBUTE_TYPE, 'uddiPersonName', 'RFC4403'), + '1.3.6.1.1.10.4.9': ('1.3.6.1.1.10.4.9', OID_ATTRIBUTE_TYPE, 'uddiPhone', 'RFC4403'), + '1.3.6.1.1.10.4.10': ('1.3.6.1.1.10.4.10', OID_ATTRIBUTE_TYPE, 'uddiEMail', 'RFC4403'), + '1.3.6.1.1.10.4.11': ('1.3.6.1.1.10.4.11', OID_ATTRIBUTE_TYPE, 'uddiSortCode', 'RFC4403'), + '1.3.6.1.1.10.4.12': ('1.3.6.1.1.10.4.12', OID_ATTRIBUTE_TYPE, 'uddiTModelKey', 'RFC4403'), + '1.3.6.1.1.10.4.13': ('1.3.6.1.1.10.4.13', OID_ATTRIBUTE_TYPE, 'uddiAddressLine', 'RFC4403'), + '1.3.6.1.1.10.4.14': ('1.3.6.1.1.10.4.14', OID_ATTRIBUTE_TYPE, 'uddiIdentifierBag', 'RFC4403'), + '1.3.6.1.1.10.4.15': ('1.3.6.1.1.10.4.15', OID_ATTRIBUTE_TYPE, 'uddiCategoryBag', 'RFC4403'), + '1.3.6.1.1.10.4.16': ('1.3.6.1.1.10.4.16', OID_ATTRIBUTE_TYPE, 'uddiKeyedReference', 'RFC4403'), + '1.3.6.1.1.10.4.17': ('1.3.6.1.1.10.4.17', OID_ATTRIBUTE_TYPE, 'uddiServiceKey', 'RFC4403'), + '1.3.6.1.1.10.4.18': ('1.3.6.1.1.10.4.18', OID_ATTRIBUTE_TYPE, 'uddiBindingKey', 'RFC4403'), + '1.3.6.1.1.10.4.19': ('1.3.6.1.1.10.4.19', OID_ATTRIBUTE_TYPE, 'uddiAccessPoint', 'RFC4403'), + '1.3.6.1.1.10.4.20': ('1.3.6.1.1.10.4.20', OID_ATTRIBUTE_TYPE, 'uddiHostingRedirector', 'RFC4403'), + '1.3.6.1.1.10.4.21': ('1.3.6.1.1.10.4.21', OID_ATTRIBUTE_TYPE, 'uddiInstanceDescription', 'RFC4403'), + '1.3.6.1.1.10.4.22': ('1.3.6.1.1.10.4.22', OID_ATTRIBUTE_TYPE, 'uddiInstanceParms', 'RFC4403'), + '1.3.6.1.1.10.4.23': ('1.3.6.1.1.10.4.23', OID_ATTRIBUTE_TYPE, 'uddiOverviewDescription', 'RFC4403'), + '1.3.6.1.1.10.4.24': ('1.3.6.1.1.10.4.24', OID_ATTRIBUTE_TYPE, 'uddiOverviewURL', 'RFC4403'), + '1.3.6.1.1.10.4.25': ('1.3.6.1.1.10.4.25', OID_ATTRIBUTE_TYPE, 'uddiFromKey', 'RFC4403'), + '1.3.6.1.1.10.4.26': ('1.3.6.1.1.10.4.26', OID_ATTRIBUTE_TYPE, 'uddiToKey', 'RFC4403'), + '1.3.6.1.1.10.4.27': ('1.3.6.1.1.10.4.27', OID_ATTRIBUTE_TYPE, 'uddiUUID', 'RFC4403'), + '1.3.6.1.1.10.4.28': ('1.3.6.1.1.10.4.28', OID_ATTRIBUTE_TYPE, 'uddiIsHidden', 'RFC4403'), + '1.3.6.1.1.10.4.29': ('1.3.6.1.1.10.4.29', OID_ATTRIBUTE_TYPE, 'uddiIsProjection', 'RFC4403'), + '1.3.6.1.1.10.4.30': ('1.3.6.1.1.10.4.30', OID_ATTRIBUTE_TYPE, 'uddiLang', 'RFC4403'), + '1.3.6.1.1.10.4.31': ('1.3.6.1.1.10.4.31', OID_ATTRIBUTE_TYPE, 'uddiv3BusinessKey', 'RFC4403'), + '1.3.6.1.1.10.4.32': ('1.3.6.1.1.10.4.32', OID_ATTRIBUTE_TYPE, 'uddiv3ServiceKey', 'RFC4403'), + '1.3.6.1.1.10.4.33': ('1.3.6.1.1.10.4.33', OID_ATTRIBUTE_TYPE, 'uddiv3BindingKey', 'RFC4403'), + '1.3.6.1.1.10.4.34': ('1.3.6.1.1.10.4.34', OID_ATTRIBUTE_TYPE, 'uddiv3TmodelKey', 'RFC4403'), + '1.3.6.1.1.10.4.35': ('1.3.6.1.1.10.4.35', OID_ATTRIBUTE_TYPE, 'uddiv3DigitalSignature', 'RFC4403'), + '1.3.6.1.1.10.4.36': ('1.3.6.1.1.10.4.36', OID_ATTRIBUTE_TYPE, 'uddiv3NodeId', 'RFC4403'), + '1.3.6.1.1.10.4.37': ('1.3.6.1.1.10.4.37', OID_ATTRIBUTE_TYPE, 'uddiv3EntityModificationTime', 'RFC4403'), + '1.3.6.1.1.10.4.38': ('1.3.6.1.1.10.4.38', OID_ATTRIBUTE_TYPE, 'uddiv3SubscriptionKey', 'RFC4403'), + '1.3.6.1.1.10.4.39': ('1.3.6.1.1.10.4.39', OID_ATTRIBUTE_TYPE, 'uddiv3SubscriptionFilter', 'RFC4403'), + '1.3.6.1.1.10.4.40': ('1.3.6.1.1.10.4.40', OID_ATTRIBUTE_TYPE, 'uddiv3NotificationInterval', 'RFC4403'), + '1.3.6.1.1.10.4.41': ('1.3.6.1.1.10.4.41', OID_ATTRIBUTE_TYPE, 'uddiv3MaxEntities', 'RFC4403'), + '1.3.6.1.1.10.4.42': ('1.3.6.1.1.10.4.42', OID_ATTRIBUTE_TYPE, 'uddiv3ExpiresAfter', 'RFC4403'), + '1.3.6.1.1.10.4.43': ('1.3.6.1.1.10.4.43', OID_ATTRIBUTE_TYPE, 'uddiv3BriefResponse', 'RFC4403'), + '1.3.6.1.1.10.4.44': ('1.3.6.1.1.10.4.44', OID_ATTRIBUTE_TYPE, 'uddiv3EntityKey', 'RFC4403'), + '1.3.6.1.1.10.4.45': ('1.3.6.1.1.10.4.45', OID_ATTRIBUTE_TYPE, 'uddiv3EntityCreationTime', 'RFC4403'), + '1.3.6.1.1.10.4.46': ('1.3.6.1.1.10.4.46', OID_ATTRIBUTE_TYPE, 'uddiv3EntityDeletionTime', 'RFC4403'), + '1.3.6.1.1.11.2.1': ('1.3.6.1.1.11.2.1', OID_ATTRIBUTE_TYPE, 'vPIMTelephoneNumber', 'RFC4237'), + '1.3.6.1.1.11.2.2': ('1.3.6.1.1.11.2.2', OID_ATTRIBUTE_TYPE, 'vPIMRfc822Mailbox', 'RFC4237'), + '1.3.6.1.1.11.2.3': ('1.3.6.1.1.11.2.3', OID_ATTRIBUTE_TYPE, 'vPIMSpokenName', 'RFC4237'), + '1.3.6.1.1.11.2.4': ('1.3.6.1.1.11.2.4', OID_ATTRIBUTE_TYPE, 'vPIMSupportedUABehaviors', 'RFC4237'), + '1.3.6.1.1.11.2.5': ('1.3.6.1.1.11.2.5', OID_ATTRIBUTE_TYPE, 'vPIMSupportedAudioMediaTypes', 'RFC4237'), + '1.3.6.1.1.11.2.6': ('1.3.6.1.1.11.2.6', OID_ATTRIBUTE_TYPE, 'vPIMSupportedMessageContext', 'RFC4237'), + '1.3.6.1.1.11.2.7': ('1.3.6.1.1.11.2.7', OID_ATTRIBUTE_TYPE, 'vPIMTextName', 'RFC4237'), + '1.3.6.1.1.11.2.8': ('1.3.6.1.1.11.2.8', OID_ATTRIBUTE_TYPE, 'vPIMExtendedAbsenceStatus', 'RFC4237'), + '1.3.6.1.1.11.2.9': ('1.3.6.1.1.11.2.9', OID_ATTRIBUTE_TYPE, 'vPIMMaxMessageSize', 'RFC4237'), + '1.3.6.1.1.11.2.10': ('1.3.6.1.1.11.2.10', OID_ATTRIBUTE_TYPE, 'vPIMSubMailboxes', 'RFC4237'), + '1.3.6.1.1.16.4': ('1.3.6.1.1.16.4', OID_ATTRIBUTE_TYPE, 'entryUUID', 'RFC4530'), + '1.3.6.1.1.20': ('1.3.6.1.1.20', OID_ATTRIBUTE_TYPE, 'entryDN', 'RFC5020'), + '1.3.6.1.1.6.2.3': ('1.3.6.1.1.6.2.3', OID_ATTRIBUTE_TYPE, 'pcimKeywords', 'RFC3703'), + '1.3.6.1.1.6.2.4': ('1.3.6.1.1.6.2.4', OID_ATTRIBUTE_TYPE, 'pcimGroupName', 'RFC3703'), + '1.3.6.1.1.6.2.5': ('1.3.6.1.1.6.2.5', OID_ATTRIBUTE_TYPE, 'pcimRuleName', 'RFC3703'), + '1.3.6.1.1.6.2.6': ('1.3.6.1.1.6.2.6', OID_ATTRIBUTE_TYPE, 'pcimRuleEnabled', 'RFC3703'), + '1.3.6.1.1.6.2.7': ('1.3.6.1.1.6.2.7', OID_ATTRIBUTE_TYPE, 'pcimRuleConditionListType', 'RFC3703'), + '1.3.6.1.1.6.2.8': ('1.3.6.1.1.6.2.8', OID_ATTRIBUTE_TYPE, 'pcimRuleConditionList', 'RFC3703'), + '1.3.6.1.1.6.2.9': ('1.3.6.1.1.6.2.9', OID_ATTRIBUTE_TYPE, 'pcimRuleActionList', 'RFC3703'), + '1.3.6.1.1.6.2.10': ('1.3.6.1.1.6.2.10', OID_ATTRIBUTE_TYPE, 'pcimRuleValidityPeriodList', 'RFC3703'), + '1.3.6.1.1.6.2.11': ('1.3.6.1.1.6.2.11', OID_ATTRIBUTE_TYPE, 'pcimRuleUsage', 'RFC3703'), + '1.3.6.1.1.6.2.12': ('1.3.6.1.1.6.2.12', OID_ATTRIBUTE_TYPE, 'pcimRulePriority', 'RFC3703'), + '1.3.6.1.1.6.2.13': ('1.3.6.1.1.6.2.13', OID_ATTRIBUTE_TYPE, 'pcimRuleMandatory', 'RFC3703'), + '1.3.6.1.1.6.2.14': ('1.3.6.1.1.6.2.14', OID_ATTRIBUTE_TYPE, 'pcimRuleSequencedActions', 'RFC3703'), + '1.3.6.1.1.6.2.15': ('1.3.6.1.1.6.2.15', OID_ATTRIBUTE_TYPE, 'pcimRoles', 'RFC3703'), + '1.3.6.1.1.6.2.16': ('1.3.6.1.1.6.2.16', OID_ATTRIBUTE_TYPE, 'pcimConditionGroupNumber', 'RFC3703'), + '1.3.6.1.1.6.2.17': ('1.3.6.1.1.6.2.17', OID_ATTRIBUTE_TYPE, 'pcimConditionNegated', 'RFC3703'), + '1.3.6.1.1.6.2.18': ('1.3.6.1.1.6.2.18', OID_ATTRIBUTE_TYPE, 'pcimConditionName', 'RFC3703'), + '1.3.6.1.1.6.2.19': ('1.3.6.1.1.6.2.19', OID_ATTRIBUTE_TYPE, 'pcimConditionDN', 'RFC3703'), + '1.3.6.1.1.6.2.20': ('1.3.6.1.1.6.2.20', OID_ATTRIBUTE_TYPE, 'pcimValidityConditionName', 'RFC3703'), + '1.3.6.1.1.6.2.21': ('1.3.6.1.1.6.2.21', OID_ATTRIBUTE_TYPE, 'pcimTimePeriodConditionDN', 'RFC3703'), + '1.3.6.1.1.6.2.22': ('1.3.6.1.1.6.2.22', OID_ATTRIBUTE_TYPE, 'pcimActionName', 'RFC3703'), + '1.3.6.1.1.6.2.23': ('1.3.6.1.1.6.2.23', OID_ATTRIBUTE_TYPE, 'pcimActionOrder', 'RFC3703'), + '1.3.6.1.1.6.2.24': ('1.3.6.1.1.6.2.24', OID_ATTRIBUTE_TYPE, 'pcimActionDN', 'RFC3703'), + '1.3.6.1.1.6.2.25': ('1.3.6.1.1.6.2.25', OID_ATTRIBUTE_TYPE, 'pcimTPCTime', 'RFC3703'), + '1.3.6.1.1.6.2.26': ('1.3.6.1.1.6.2.26', OID_ATTRIBUTE_TYPE, 'pcimTPCMonthOfYearMask', 'RFC3703'), + '1.3.6.1.1.6.2.27': ('1.3.6.1.1.6.2.27', OID_ATTRIBUTE_TYPE, 'pcimTPCDayOfMonthMask', 'RFC3703'), + '1.3.6.1.1.6.2.28': ('1.3.6.1.1.6.2.28', OID_ATTRIBUTE_TYPE, 'pcimTPCDayOfWeekMask', 'RFC3703'), + '1.3.6.1.1.6.2.29': ('1.3.6.1.1.6.2.29', OID_ATTRIBUTE_TYPE, 'pcimTPCTimeOfDayMask', 'RFC3703'), + '1.3.6.1.1.6.2.30': ('1.3.6.1.1.6.2.30', OID_ATTRIBUTE_TYPE, 'pcimTPCLocalOrUtcTime', 'RFC3703'), + '1.3.6.1.1.6.2.31': ('1.3.6.1.1.6.2.31', OID_ATTRIBUTE_TYPE, 'pcimVendorConstraintData', 'RFC3703'), + '1.3.6.1.1.6.2.32': ('1.3.6.1.1.6.2.32', OID_ATTRIBUTE_TYPE, 'pcimVendorConstraintEncoding', 'RFC3703'), + '1.3.6.1.1.6.2.33': ('1.3.6.1.1.6.2.33', OID_ATTRIBUTE_TYPE, 'pcimVendorActionData', 'RFC3703'), + '1.3.6.1.1.6.2.34': ('1.3.6.1.1.6.2.34', OID_ATTRIBUTE_TYPE, 'pcimVendorActionEncoding', 'RFC3703'), + '1.3.6.1.1.6.2.35': ('1.3.6.1.1.6.2.35', OID_ATTRIBUTE_TYPE, 'pcimPolicyInstanceName', 'RFC3703'), + '1.3.6.1.1.6.2.36': ('1.3.6.1.1.6.2.36', OID_ATTRIBUTE_TYPE, 'pcimRepositoryName', 'RFC3703'), + '1.3.6.1.1.6.2.37': ('1.3.6.1.1.6.2.37', OID_ATTRIBUTE_TYPE, 'pcimSubtreesAuxContainedSet', 'RFC3703'), + '1.3.6.1.1.6.2.38': ('1.3.6.1.1.6.2.38', OID_ATTRIBUTE_TYPE, 'pcimGroupsAuxContainedSet', 'RFC3703'), + '1.3.6.1.1.6.2.39': ('1.3.6.1.1.6.2.39', OID_ATTRIBUTE_TYPE, 'pcimRulesAuxContainedSet', 'RFC3703'), + '1.3.6.1.1.9.2.1': ('1.3.6.1.1.9.2.1', OID_ATTRIBUTE_TYPE, 'pcelsPolicySetName', 'RFC4104'), + '1.3.6.1.1.9.2.2': ('1.3.6.1.1.9.2.2', OID_ATTRIBUTE_TYPE, 'pcelsDecisionStrategy', 'RFC4104'), + '1.3.6.1.1.9.2.3': ('1.3.6.1.1.9.2.3', OID_ATTRIBUTE_TYPE, 'pcelsPolicySetList', 'RFC4104'), + '1.3.6.1.1.9.2.4': ('1.3.6.1.1.9.2.4', OID_ATTRIBUTE_TYPE, 'pcelsPriority', 'RFC4104'), + '1.3.6.1.1.9.2.5': ('1.3.6.1.1.9.2.5', OID_ATTRIBUTE_TYPE, 'pcelsPolicySetDN', 'RFC4104'), + '1.3.6.1.1.9.2.6': ('1.3.6.1.1.9.2.6', OID_ATTRIBUTE_TYPE, 'pcelsConditionListType', 'RFC4104'), + '1.3.6.1.1.9.2.7': ('1.3.6.1.1.9.2.7', OID_ATTRIBUTE_TYPE, 'pcelsConditionList', 'RFC4104'), + '1.3.6.1.1.9.2.8': ('1.3.6.1.1.9.2.8', OID_ATTRIBUTE_TYPE, 'pcelsActionList', 'RFC4104'), + '1.3.6.1.1.9.2.9': ('1.3.6.1.1.9.2.9', OID_ATTRIBUTE_TYPE, 'pcelsSequencedActions', 'RFC4104'), + '1.3.6.1.1.9.2.10': ('1.3.6.1.1.9.2.10', OID_ATTRIBUTE_TYPE, 'pcelsExecutionStrategy', 'RFC4104'), + '1.3.6.1.1.9.2.11': ('1.3.6.1.1.9.2.11', OID_ATTRIBUTE_TYPE, 'pcelsVariableDN', 'RFC4104'), + '1.3.6.1.1.9.2.12': ('1.3.6.1.1.9.2.12', OID_ATTRIBUTE_TYPE, 'pcelsValueDN', 'RFC4104'), + '1.3.6.1.1.9.2.13': ('1.3.6.1.1.9.2.13', OID_ATTRIBUTE_TYPE, 'pcelsIsMirrored', 'RFC4104'), + '1.3.6.1.1.9.2.14': ('1.3.6.1.1.9.2.14', OID_ATTRIBUTE_TYPE, 'pcelsVariableName', 'RFC4104'), + '1.3.6.1.1.9.2.15': ('1.3.6.1.1.9.2.15', OID_ATTRIBUTE_TYPE, 'pcelsExpectedValueList', 'RFC4104'), + '1.3.6.1.1.9.2.16': ('1.3.6.1.1.9.2.16', OID_ATTRIBUTE_TYPE, 'pcelsVariableModelClass', 'RFC4104'), + '1.3.6.1.1.9.2.17': ('1.3.6.1.1.9.2.17', OID_ATTRIBUTE_TYPE, 'pcelsVariableModelProperty', 'RFC4104'), + '1.3.6.1.1.9.2.18': ('1.3.6.1.1.9.2.18', OID_ATTRIBUTE_TYPE, 'pcelsExpectedValueTypes', 'RFC4104'), + '1.3.6.1.1.9.2.19': ('1.3.6.1.1.9.2.19', OID_ATTRIBUTE_TYPE, 'pcelsValueName', 'RFC4104'), + '1.3.6.1.1.9.2.20': ('1.3.6.1.1.9.2.20', OID_ATTRIBUTE_TYPE, 'pcelsIPv4AddrList', 'RFC4104'), + '1.3.6.1.1.9.2.21': ('1.3.6.1.1.9.2.21', OID_ATTRIBUTE_TYPE, 'pcelsIPv6AddrList', 'RFC4104'), + '1.3.6.1.1.9.2.22': ('1.3.6.1.1.9.2.22', OID_ATTRIBUTE_TYPE, 'pcelsMACAddrList', 'RFC4104'), + '1.3.6.1.1.9.2.23': ('1.3.6.1.1.9.2.23', OID_ATTRIBUTE_TYPE, 'pcelsStringList', 'RFC4104'), + '1.3.6.1.1.9.2.24': ('1.3.6.1.1.9.2.24', OID_ATTRIBUTE_TYPE, 'pcelsBitStringList', 'RFC4104'), + '1.3.6.1.1.9.2.25': ('1.3.6.1.1.9.2.25', OID_ATTRIBUTE_TYPE, 'pcelsIntegerList', 'RFC4104'), + '1.3.6.1.1.9.2.26': ('1.3.6.1.1.9.2.26', OID_ATTRIBUTE_TYPE, 'pcelsBoolean', 'RFC4104'), + '1.3.6.1.1.9.2.27': ('1.3.6.1.1.9.2.27', OID_ATTRIBUTE_TYPE, 'pcelsReusableContainerName', 'RFC4104'), + '1.3.6.1.1.9.2.28': ('1.3.6.1.1.9.2.28', OID_ATTRIBUTE_TYPE, 'pcelsReusableContainerList', 'RFC4104'), + '1.3.6.1.1.9.2.29': ('1.3.6.1.1.9.2.29', OID_ATTRIBUTE_TYPE, 'pcelsRole', 'RFC4104'), + '1.3.6.1.1.9.2.30': ('1.3.6.1.1.9.2.30', OID_ATTRIBUTE_TYPE, 'pcelsRoleCollectionName', 'RFC4104'), + '1.3.6.1.1.9.2.31': ('1.3.6.1.1.9.2.31', OID_ATTRIBUTE_TYPE, 'pcelsElementList', 'RFC4104'), + '1.3.6.1.1.9.2.32': ('1.3.6.1.1.9.2.32', OID_ATTRIBUTE_TYPE, 'pcelsFilterName', 'RFC4104'), + '1.3.6.1.1.9.2.33': ('1.3.6.1.1.9.2.33', OID_ATTRIBUTE_TYPE, 'pcelsFilterIsNegated', 'RFC4104'), + '1.3.6.1.1.9.2.34': ('1.3.6.1.1.9.2.34', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrVersion', 'RFC4104'), + '1.3.6.1.1.9.2.35': ('1.3.6.1.1.9.2.35', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourceAddress', 'RFC4104'), + '1.3.6.1.1.9.2.36': ('1.3.6.1.1.9.2.36', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourceAddressEndOfRange', 'RFC4104'), + '1.3.6.1.1.9.2.37': ('1.3.6.1.1.9.2.37', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourceMask', 'RFC4104'), + '1.3.6.1.1.9.2.38': ('1.3.6.1.1.9.2.38', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestAddress', 'RFC4104'), + '1.3.6.1.1.9.2.39': ('1.3.6.1.1.9.2.39', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestAddressEndOfRange', 'RFC4104'), + '1.3.6.1.1.9.2.40': ('1.3.6.1.1.9.2.40', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestMask', 'RFC4104'), + '1.3.6.1.1.9.2.41': ('1.3.6.1.1.9.2.41', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrProtocolID', 'RFC4104'), + '1.3.6.1.1.9.2.42': ('1.3.6.1.1.9.2.42', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourcePortStart', 'RFC4104'), + '1.3.6.1.1.9.2.43': ('1.3.6.1.1.9.2.43', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrSourcePortEnd', 'RFC4104'), + '1.3.6.1.1.9.2.44': ('1.3.6.1.1.9.2.44', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestPortStart', 'RFC4104'), + '1.3.6.1.1.9.2.45': ('1.3.6.1.1.9.2.45', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDestPortEnd', 'RFC4104'), + '1.3.6.1.1.9.2.46': ('1.3.6.1.1.9.2.46', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrDSCPList', 'RFC4104'), + '1.3.6.1.1.9.2.47': ('1.3.6.1.1.9.2.47', OID_ATTRIBUTE_TYPE, 'pcelsIPHdrFlowLabel', 'RFC4104'), + '1.3.6.1.1.9.2.48': ('1.3.6.1.1.9.2.48', OID_ATTRIBUTE_TYPE, 'pcels8021HdrSourceMACAddress', 'RFC4104'), + '1.3.6.1.1.9.2.49': ('1.3.6.1.1.9.2.49', OID_ATTRIBUTE_TYPE, 'pcels8021HdrSourceMACMask', 'RFC4104'), + '1.3.6.1.1.9.2.50': ('1.3.6.1.1.9.2.50', OID_ATTRIBUTE_TYPE, 'pcels8021HdrDestMACAddress', 'RFC4104'), + '1.3.6.1.1.9.2.51': ('1.3.6.1.1.9.2.51', OID_ATTRIBUTE_TYPE, 'pcels8021HdrDestMACMask', 'RFC4104'), + '1.3.6.1.1.9.2.52': ('1.3.6.1.1.9.2.52', OID_ATTRIBUTE_TYPE, 'pcels8021HdrProtocolID', 'RFC4104'), + '1.3.6.1.1.9.2.53': ('1.3.6.1.1.9.2.53', OID_ATTRIBUTE_TYPE, 'pcels8021HdrPriority', 'RFC4104'), + '1.3.6.1.1.9.2.54': ('1.3.6.1.1.9.2.54', OID_ATTRIBUTE_TYPE, 'pcels8021HdrVLANID', 'RFC4104'), + '1.3.6.1.1.9.2.55': ('1.3.6.1.1.9.2.55', OID_ATTRIBUTE_TYPE, 'pcelsFilterListName', 'RFC4104'), + '1.3.6.1.1.9.2.56': ('1.3.6.1.1.9.2.56', OID_ATTRIBUTE_TYPE, 'pcelsFilterDirection', 'RFC4104'), + '1.3.6.1.1.9.2.57': ('1.3.6.1.1.9.2.57', OID_ATTRIBUTE_TYPE, 'pcelsFilterEntryList', 'RFC4104'), + '1.3.6.1.1.9.2.58': ('1.3.6.1.1.9.2.58', OID_ATTRIBUTE_TYPE, 'pcelsVendorVariableData', 'RFC4104'), + '1.3.6.1.1.9.2.59': ('1.3.6.1.1.9.2.59', OID_ATTRIBUTE_TYPE, 'pcelsVendorVariableEncoding', 'RFC4104'), + '1.3.6.1.1.9.2.60': ('1.3.6.1.1.9.2.60', OID_ATTRIBUTE_TYPE, 'pcelsVendorValueData', 'RFC4104'), + '1.3.6.1.1.9.2.61': ('1.3.6.1.1.9.2.61', OID_ATTRIBUTE_TYPE, 'pcelsVendorValueEncoding', 'RFC4104'), + '1.3.6.1.1.9.2.62': ('1.3.6.1.1.9.2.62', OID_ATTRIBUTE_TYPE, 'pcelsRuleValidityPeriodList', 'RFC4104'), + '1.3.6.1.4.1.11.1.3.1.1.0': ('1.3.6.1.4.1.11.1.3.1.1.0', OID_ATTRIBUTE_TYPE, 'defaultServerList', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.1': ('1.3.6.1.4.1.11.1.3.1.1.1', OID_ATTRIBUTE_TYPE, 'defaultSearchBase', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.2': ('1.3.6.1.4.1.11.1.3.1.1.2', OID_ATTRIBUTE_TYPE, 'preferredServerList', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.3': ('1.3.6.1.4.1.11.1.3.1.1.3', OID_ATTRIBUTE_TYPE, 'search_time_limit', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.4': ('1.3.6.1.4.1.11.1.3.1.1.4', OID_ATTRIBUTE_TYPE, 'bindTimeLimit', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.5': ('1.3.6.1.4.1.11.1.3.1.1.5', OID_ATTRIBUTE_TYPE, 'followReferrals', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.6': ('1.3.6.1.4.1.11.1.3.1.1.6', OID_ATTRIBUTE_TYPE, 'authenticationMethod', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.7': ('1.3.6.1.4.1.11.1.3.1.1.7', OID_ATTRIBUTE_TYPE, 'profileTTL', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.9': ('1.3.6.1.4.1.11.1.3.1.1.9', OID_ATTRIBUTE_TYPE, 'attributeMap', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.10': ('1.3.6.1.4.1.11.1.3.1.1.10', OID_ATTRIBUTE_TYPE, 'credentialLevel', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.11': ('1.3.6.1.4.1.11.1.3.1.1.11', OID_ATTRIBUTE_TYPE, 'objectclassMap', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.12': ('1.3.6.1.4.1.11.1.3.1.1.12', OID_ATTRIBUTE_TYPE, 'defaultSearchScope', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.13': ('1.3.6.1.4.1.11.1.3.1.1.13', OID_ATTRIBUTE_TYPE, 'serviceCredentialLevel', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.14': ('1.3.6.1.4.1.11.1.3.1.1.14', OID_ATTRIBUTE_TYPE, 'serviceSearchDescriptor', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.15': ('1.3.6.1.4.1.11.1.3.1.1.15', OID_ATTRIBUTE_TYPE, 'serviceAuthenticationMethod', 'RFC4876'), + '1.3.6.1.4.1.11.1.3.1.1.16': ('1.3.6.1.4.1.11.1.3.1.1.16', OID_ATTRIBUTE_TYPE, 'dereferenceAliases', 'RFC4876'), + '1.3.6.1.4.1.1466.101.119.3': ('1.3.6.1.4.1.1466.101.119.3', OID_ATTRIBUTE_TYPE, 'entryTtl', 'RFC2589'), + '1.3.6.1.4.1.1466.101.119.4': ('1.3.6.1.4.1.1466.101.119.4', OID_ATTRIBUTE_TYPE, 'dynamicSubtrees', 'RFC2589'), + '1.3.6.1.4.1.1466.101.120.1': ('1.3.6.1.4.1.1466.101.120.1', OID_ATTRIBUTE_TYPE, 'administratorsAddress', 'Mark_Wahl'), + '1.3.6.1.4.1.1466.101.120.5': ('1.3.6.1.4.1.1466.101.120.5', OID_ATTRIBUTE_TYPE, 'namingContexts', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.6': ('1.3.6.1.4.1.1466.101.120.6', OID_ATTRIBUTE_TYPE, 'altServer', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.7': ('1.3.6.1.4.1.1466.101.120.7', OID_ATTRIBUTE_TYPE, 'supportedExtension', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.13': ('1.3.6.1.4.1.1466.101.120.13', OID_ATTRIBUTE_TYPE, 'supportedControl', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.14': ('1.3.6.1.4.1.1466.101.120.14', OID_ATTRIBUTE_TYPE, 'supportedSASLMechanisms', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.15': ('1.3.6.1.4.1.1466.101.120.15', OID_ATTRIBUTE_TYPE, 'supportedLDAPVersion', 'RFC4512'), + '1.3.6.1.4.1.1466.101.120.16': ('1.3.6.1.4.1.1466.101.120.16', OID_ATTRIBUTE_TYPE, 'ldapSyntaxes', 'RFC4512'), + '1.3.6.1.4.1.16572.2.2.1': ('1.3.6.1.4.1.16572.2.2.1', OID_ATTRIBUTE_TYPE, 'providerCertificateHash', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.2': ('1.3.6.1.4.1.16572.2.2.2', OID_ATTRIBUTE_TYPE, 'providerCertificate', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.3': ('1.3.6.1.4.1.16572.2.2.3', OID_ATTRIBUTE_TYPE, 'providerName', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.4': ('1.3.6.1.4.1.16572.2.2.4', OID_ATTRIBUTE_TYPE, 'mailReceipt', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.5': ('1.3.6.1.4.1.16572.2.2.5', OID_ATTRIBUTE_TYPE, 'managedDomains', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.6': ('1.3.6.1.4.1.16572.2.2.6', OID_ATTRIBUTE_TYPE, 'LDIFLocationURL', 'RFC6109'), + '1.3.6.1.4.1.16572.2.2.7': ('1.3.6.1.4.1.16572.2.2.7', OID_ATTRIBUTE_TYPE, 'providerUnit', 'RFC6109'), + '1.3.6.1.4.1.250.1.57': ('1.3.6.1.4.1.250.1.57', OID_ATTRIBUTE_TYPE, 'labeledURI', 'RFC2079'), + '1.3.6.1.4.1.31103.1.1': ('1.3.6.1.4.1.31103.1.1', OID_ATTRIBUTE_TYPE, 'fedfsUuid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.2': ('1.3.6.1.4.1.31103.1.2', OID_ATTRIBUTE_TYPE, 'fedfsNetAddr', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.3': ('1.3.6.1.4.1.31103.1.3', OID_ATTRIBUTE_TYPE, 'fedfsNetPort', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.4': ('1.3.6.1.4.1.31103.1.4', OID_ATTRIBUTE_TYPE, 'fedfsFsnUuid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.5': ('1.3.6.1.4.1.31103.1.5', OID_ATTRIBUTE_TYPE, 'fedfsNsdbName', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.6': ('1.3.6.1.4.1.31103.1.6', OID_ATTRIBUTE_TYPE, 'fedfsNsdbPort', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.7': ('1.3.6.1.4.1.31103.1.7', OID_ATTRIBUTE_TYPE, 'fedfsNcePrefix', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.8': ('1.3.6.1.4.1.31103.1.8', OID_ATTRIBUTE_TYPE, 'fedfsFslUuid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.9': ('1.3.6.1.4.1.31103.1.9', OID_ATTRIBUTE_TYPE, 'fedfsFslHost', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.10': ('1.3.6.1.4.1.31103.1.10', OID_ATTRIBUTE_TYPE, 'fedfsFslPort', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.11': ('1.3.6.1.4.1.31103.1.11', OID_ATTRIBUTE_TYPE, 'fedfsFslTTL', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.12': ('1.3.6.1.4.1.31103.1.12', OID_ATTRIBUTE_TYPE, 'fedfsAnnotation', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.13': ('1.3.6.1.4.1.31103.1.13', OID_ATTRIBUTE_TYPE, 'fedfsDescr', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.14': ('1.3.6.1.4.1.31103.1.14', OID_ATTRIBUTE_TYPE, 'fedfsNceDN', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.15': ('1.3.6.1.4.1.31103.1.15', OID_ATTRIBUTE_TYPE, 'fedfsFsnTTL', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.100': ('1.3.6.1.4.1.31103.1.100', OID_ATTRIBUTE_TYPE, 'fedfsNfsPath', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.101': ('1.3.6.1.4.1.31103.1.101', OID_ATTRIBUTE_TYPE, 'fedfsNfsMajorVer', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.102': ('1.3.6.1.4.1.31103.1.102', OID_ATTRIBUTE_TYPE, 'fedfsNfsMinorVer', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.103': ('1.3.6.1.4.1.31103.1.103', OID_ATTRIBUTE_TYPE, 'fedfsNfsCurrency', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.104': ('1.3.6.1.4.1.31103.1.104', OID_ATTRIBUTE_TYPE, 'fedfsNfsGenFlagWritable', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.105': ('1.3.6.1.4.1.31103.1.105', OID_ATTRIBUTE_TYPE, 'fedfsNfsGenFlagGoing', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.106': ('1.3.6.1.4.1.31103.1.106', OID_ATTRIBUTE_TYPE, 'fedfsNfsGenFlagSplit', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.107': ('1.3.6.1.4.1.31103.1.107', OID_ATTRIBUTE_TYPE, 'fedfsNfsTransFlagRdma', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.108': ('1.3.6.1.4.1.31103.1.108', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassSimul', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.109': ('1.3.6.1.4.1.31103.1.109', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassHandle', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.110': ('1.3.6.1.4.1.31103.1.110', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassFileid', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.111': ('1.3.6.1.4.1.31103.1.111', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassWritever', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.112': ('1.3.6.1.4.1.31103.1.112', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassChange', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.113': ('1.3.6.1.4.1.31103.1.113', OID_ATTRIBUTE_TYPE, 'fedfsNfsClassReaddir', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.114': ('1.3.6.1.4.1.31103.1.114', OID_ATTRIBUTE_TYPE, 'fedfsNfsReadRank', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.115': ('1.3.6.1.4.1.31103.1.115', OID_ATTRIBUTE_TYPE, 'fedfsNfsReadOrder', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.116': ('1.3.6.1.4.1.31103.1.116', OID_ATTRIBUTE_TYPE, 'fedfsNfsWriteRank', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.117': ('1.3.6.1.4.1.31103.1.117', OID_ATTRIBUTE_TYPE, 'fedfsNfsWriteOrder', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.118': ('1.3.6.1.4.1.31103.1.118', OID_ATTRIBUTE_TYPE, 'fedfsNfsVarSub', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.119': ('1.3.6.1.4.1.31103.1.119', OID_ATTRIBUTE_TYPE, 'fedfsNfsValidFor', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.120': ('1.3.6.1.4.1.31103.1.120', OID_ATTRIBUTE_TYPE, 'fedfsNfsURI', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.4203.1.3.5': ('1.3.6.1.4.1.4203.1.3.5', OID_ATTRIBUTE_TYPE, 'supportedFeatures', 'RFC4512'), + '1.3.6.1.4.1.453.7.2.1': ('1.3.6.1.4.1.453.7.2.1', OID_ATTRIBUTE_TYPE, 'textTableKey', 'RFC2293'), + '1.3.6.1.4.1.453.7.2.2': ('1.3.6.1.4.1.453.7.2.2', OID_ATTRIBUTE_TYPE, 'textTableValue', 'RFC2293'), + '1.3.6.1.4.1.453.7.2.3': ('1.3.6.1.4.1.453.7.2.3', OID_ATTRIBUTE_TYPE, ['associatedX400Gateway', 'distinguishedNameTableKey'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.2.6': ('1.3.6.1.4.1.453.7.2.6', OID_ATTRIBUTE_TYPE, 'associatedORAddress', 'RFC2164'), + '1.3.6.1.4.1.453.7.2.7': ('1.3.6.1.4.1.453.7.2.7', OID_ATTRIBUTE_TYPE, 'oRAddressComponentType', 'RFC2164'), + '1.3.6.1.4.1.453.7.2.8': ('1.3.6.1.4.1.453.7.2.8', OID_ATTRIBUTE_TYPE, 'associatedInternetGateway', 'RFC2164'), + '1.3.6.1.4.1.453.7.2.9': ('1.3.6.1.4.1.453.7.2.9', OID_ATTRIBUTE_TYPE, 'mcgamTables', 'RFC2164'), + '2.16.840.1.113730.3.1.34': ('2.16.840.1.113730.3.1.34', OID_ATTRIBUTE_TYPE, 'ref', 'RFC3296'), + '2.5.18.1': ('2.5.18.1', OID_ATTRIBUTE_TYPE, 'createTimestamp', 'RFC4512'), + '2.5.18.2': ('2.5.18.2', OID_ATTRIBUTE_TYPE, 'modifyTimestamp', 'RFC4512'), + '2.5.18.3': ('2.5.18.3', OID_ATTRIBUTE_TYPE, 'creatorsName', 'RFC4512'), + '2.5.18.4': ('2.5.18.4', OID_ATTRIBUTE_TYPE, 'modifiersName', 'RFC4512'), + '2.5.18.5': ('2.5.18.5', OID_ATTRIBUTE_TYPE, 'administrativeRole', 'RFC3672'), + '2.5.18.6': ('2.5.18.6', OID_ATTRIBUTE_TYPE, 'subtreeSpecification', 'RFC3672'), + '2.5.18.7': ('2.5.18.7', OID_ATTRIBUTE_TYPE, 'collectiveExclusions', 'RFC3671'), + '2.5.18.10': ('2.5.18.10', OID_ATTRIBUTE_TYPE, 'subschemaSubentry', 'RFC4512'), + '2.5.18.12': ('2.5.18.12', OID_ATTRIBUTE_TYPE, 'collectiveAttributeSubentries', 'RFC3671'), + '2.5.21.1': ('2.5.21.1', OID_ATTRIBUTE_TYPE, 'dITStructureRules', 'RFC4512'), + '2.5.21.2': ('2.5.21.2', OID_ATTRIBUTE_TYPE, 'dITContentRules', 'RFC4512'), + '2.5.21.4': ('2.5.21.4', OID_ATTRIBUTE_TYPE, 'matchingRules', 'RFC4512'), + '2.5.21.5': ('2.5.21.5', OID_ATTRIBUTE_TYPE, 'attributeTypes', 'RFC4512'), + '2.5.21.6': ('2.5.21.6', OID_ATTRIBUTE_TYPE, 'objectClasses', 'RFC4512'), + '2.5.21.7': ('2.5.21.7', OID_ATTRIBUTE_TYPE, 'nameForms', 'RFC4512'), + '2.5.21.8': ('2.5.21.8', OID_ATTRIBUTE_TYPE, 'matchingRuleUse', 'RFC4512'), + '2.5.21.9': ('2.5.21.9', OID_ATTRIBUTE_TYPE, 'structuralObjectClass', 'RFC4512'), + '2.5.21.10': ('2.5.21.10', OID_ATTRIBUTE_TYPE, 'governingStructureRule', 'RFC4512'), + '2.5.4.0': ('2.5.4.0', OID_ATTRIBUTE_TYPE, 'objectClass', 'RFC4512'), + '2.5.4.1': ('2.5.4.1', OID_ATTRIBUTE_TYPE, ['aliasedEntryName', 'aliasedObjectName'], 'X.501-RFC4512'), + '2.5.4.2': ('2.5.4.2', OID_ATTRIBUTE_TYPE, 'knowledgeInformation', 'RFC2256'), + '2.5.4.3': ('2.5.4.3', OID_ATTRIBUTE_TYPE, ['cn', 'commonName'], 'RFC4519'), + '2.5.4.4': ('2.5.4.4', OID_ATTRIBUTE_TYPE, ['sn', 'surname'], 'RFC4519'), + '2.5.4.5': ('2.5.4.5', OID_ATTRIBUTE_TYPE, 'serialNumber', 'RFC4519'), + '2.5.4.6': ('2.5.4.6', OID_ATTRIBUTE_TYPE, ['c', 'countryName'], 'RFC4519'), + '2.5.4.7': ('2.5.4.7', OID_ATTRIBUTE_TYPE, ['L', 'localityName'], 'RFC4519'), + '2.5.4.7.1': ('2.5.4.7.1', OID_ATTRIBUTE_TYPE, 'c-l', 'RFC3671'), + '2.5.4.8': ('2.5.4.8', OID_ATTRIBUTE_TYPE, ['st', 'stateOrProvinceName'], 'RFC4519-RFC2256'), + '2.5.4.8.1': ('2.5.4.8.1', OID_ATTRIBUTE_TYPE, 'c-st', 'RFC3671'), + '2.5.4.9': ('2.5.4.9', OID_ATTRIBUTE_TYPE, ['street', 'streetAddress'], 'RFC4519-RFC2256'), + '2.5.4.9.1': ('2.5.4.9.1', OID_ATTRIBUTE_TYPE, 'c-street', 'RFC3671'), + '2.5.4.10': ('2.5.4.10', OID_ATTRIBUTE_TYPE, ['o', 'organizationName'], 'RFC4519'), + '2.5.4.10.1': ('2.5.4.10.1', OID_ATTRIBUTE_TYPE, 'c-o', 'RFC3671'), + '2.5.4.11': ('2.5.4.11', OID_ATTRIBUTE_TYPE, ['ou', 'organizationalUnitName'], 'RFC4519'), + '2.5.4.11.1': ('2.5.4.11.1', OID_ATTRIBUTE_TYPE, 'c-ou', 'RFC3671'), + '2.5.4.12': ('2.5.4.12', OID_ATTRIBUTE_TYPE, 'title', 'RFC4519'), + '2.5.4.13': ('2.5.4.13', OID_ATTRIBUTE_TYPE, 'description', 'RFC4519'), + '2.5.4.14': ('2.5.4.14', OID_ATTRIBUTE_TYPE, 'searchGuide', 'RFC4519'), + '2.5.4.15': ('2.5.4.15', OID_ATTRIBUTE_TYPE, 'businessCategory', 'RFC4519'), + '2.5.4.16': ('2.5.4.16', OID_ATTRIBUTE_TYPE, 'postalAddress', 'RFC4519'), + '2.5.4.16.1': ('2.5.4.16.1', OID_ATTRIBUTE_TYPE, 'c-PostalAddress', 'RFC3671'), + '2.5.4.17': ('2.5.4.17', OID_ATTRIBUTE_TYPE, 'postalCode', 'RFC4519'), + '2.5.4.17.1': ('2.5.4.17.1', OID_ATTRIBUTE_TYPE, 'c-PostalCode', 'RFC3671'), + '2.5.4.18': ('2.5.4.18', OID_ATTRIBUTE_TYPE, 'postOfficeBox', 'RFC4519'), + '2.5.4.18.1': ('2.5.4.18.1', OID_ATTRIBUTE_TYPE, 'c-PostOfficeBox', 'RFC3671'), + '2.5.4.19': ('2.5.4.19', OID_ATTRIBUTE_TYPE, 'physicalDeliveryOfficeName', 'RFC4519'), + '2.5.4.19.1': ('2.5.4.19.1', OID_ATTRIBUTE_TYPE, 'c-PhysicalDeliveryOffice', 'RFC3671'), + '2.5.4.20': ('2.5.4.20', OID_ATTRIBUTE_TYPE, 'telephoneNumber', 'RFC4519'), + '2.5.4.20.1': ('2.5.4.20.1', OID_ATTRIBUTE_TYPE, 'c-TelephoneNumber', 'RFC3671'), + '2.5.4.21': ('2.5.4.21', OID_ATTRIBUTE_TYPE, 'telexNumber', 'RFC4519'), + '2.5.4.21.1': ('2.5.4.21.1', OID_ATTRIBUTE_TYPE, 'c-TelexNumber', 'RFC3671'), + '2.5.4.22': ('2.5.4.22', OID_ATTRIBUTE_TYPE, 'teletexTerminalIdentifier', 'RFC4519'), + '2.5.4.23': ('2.5.4.23', OID_ATTRIBUTE_TYPE, 'facsimileTelephoneNumber', 'RFC4519'), + '2.5.4.23.1': ('2.5.4.23.1', OID_ATTRIBUTE_TYPE, 'c-FacsimileTelephoneNumber', 'RFC3671'), + '2.5.4.24': ('2.5.4.24', OID_ATTRIBUTE_TYPE, 'x121Address', 'RFC4519'), + '2.5.4.25': ('2.5.4.25', OID_ATTRIBUTE_TYPE, 'internationaliSDNNumber', 'RFC4519'), + '2.5.4.25.1': ('2.5.4.25.1', OID_ATTRIBUTE_TYPE, 'c-InternationalISDNNumber', 'RFC3671'), + '2.5.4.26': ('2.5.4.26', OID_ATTRIBUTE_TYPE, 'registeredAddress', 'RFC4519'), + '2.5.4.27': ('2.5.4.27', OID_ATTRIBUTE_TYPE, 'destinationIndicator', 'RFC4519'), + '2.5.4.28': ('2.5.4.28', OID_ATTRIBUTE_TYPE, 'preferredDeliveryMethod', 'RFC4519'), + '2.5.4.29': ('2.5.4.29', OID_ATTRIBUTE_TYPE, 'presentationAddress', 'RFC2256'), + '2.5.4.30': ('2.5.4.30', OID_ATTRIBUTE_TYPE, 'supportedApplicationContext', 'RFC2256'), + '2.5.4.31': ('2.5.4.31', OID_ATTRIBUTE_TYPE, 'member', 'RFC4519'), + '2.5.4.32': ('2.5.4.32', OID_ATTRIBUTE_TYPE, 'owner', 'RFC4519'), + '2.5.4.33': ('2.5.4.33', OID_ATTRIBUTE_TYPE, 'roleOccupant', 'RFC4519'), + '2.5.4.34': ('2.5.4.34', OID_ATTRIBUTE_TYPE, 'seeAlso', 'RFC4519'), + '2.5.4.35': ('2.5.4.35', OID_ATTRIBUTE_TYPE, 'userPassword', 'RFC4519'), + '2.5.4.36': ('2.5.4.36', OID_ATTRIBUTE_TYPE, 'userCertificate', 'RFC4523'), + '2.5.4.37': ('2.5.4.37', OID_ATTRIBUTE_TYPE, 'cACertificate', 'RFC4523'), + '2.5.4.38': ('2.5.4.38', OID_ATTRIBUTE_TYPE, 'authorityRevocationList', 'RFC4523'), + '2.5.4.39': ('2.5.4.39', OID_ATTRIBUTE_TYPE, 'certificateRevocationList', 'RFC4523'), + '2.5.4.40': ('2.5.4.40', OID_ATTRIBUTE_TYPE, 'crossCertificatePair', 'RFC4523'), + '2.5.4.41': ('2.5.4.41', OID_ATTRIBUTE_TYPE, 'name', 'RFC4519'), + '2.5.4.42': ('2.5.4.42', OID_ATTRIBUTE_TYPE, 'givenName', 'RFC4519'), + '2.5.4.43': ('2.5.4.43', OID_ATTRIBUTE_TYPE, 'initials', 'RFC4519'), + '2.5.4.44': ('2.5.4.44', OID_ATTRIBUTE_TYPE, 'generationQualifier', 'RFC4519'), + '2.5.4.45': ('2.5.4.45', OID_ATTRIBUTE_TYPE, 'x500UniqueIdentifier', 'RFC4519'), + '2.5.4.46': ('2.5.4.46', OID_ATTRIBUTE_TYPE, 'dnQualifier', 'RFC4519'), + '2.5.4.47': ('2.5.4.47', OID_ATTRIBUTE_TYPE, 'enhancedSearchGuide', 'RFC4519'), + '2.5.4.48': ('2.5.4.48', OID_ATTRIBUTE_TYPE, 'protocolInformation', 'RFC2256'), + '2.5.4.49': ('2.5.4.49', OID_ATTRIBUTE_TYPE, 'distinguishedName', 'RFC4519'), + '2.5.4.50': ('2.5.4.50', OID_ATTRIBUTE_TYPE, 'uniqueMember', 'RFC4519'), + '2.5.4.51': ('2.5.4.51', OID_ATTRIBUTE_TYPE, 'houseIdentifier', 'RFC4519'), + '2.5.4.52': ('2.5.4.52', OID_ATTRIBUTE_TYPE, 'supportedAlgorithms', 'RFC4523'), + '2.5.4.53': ('2.5.4.53', OID_ATTRIBUTE_TYPE, 'deltaRevocationList', 'RFC4523'), + '2.5.4.54': ('2.5.4.54', OID_ATTRIBUTE_TYPE, 'dmdName', 'RFC2256'), + '2.5.4.65': ('2.5.4.65', OID_ATTRIBUTE_TYPE, 'pseudonym', 'RFC3280'), + '2.16.840.1.113719.1.1.4.1.501': ('2.16.840.1.113719.1.1.4.1.501', OID_ATTRIBUTE_TYPE, 'GUID', 'NOVELL'), + '2.16.840.1.113719.1.27.4.50': ('2.16.840.1.113719.1.27.4.50', OID_ATTRIBUTE_TYPE, 'localEntryID', 'NOVELL'), + '2.16.840.1.113730.3.8.3.1': ('2.16.840.1.113730.3.8.3.1', OID_ATTRIBUTE_TYPE, 'ipaUniqueID', 'freeIPA'), + '2.16.840.1.113730.3.8.3.2': ('2.16.840.1.113730.3.8.3.2', OID_ATTRIBUTE_TYPE, 'ipaClientVersion', 'freeIPA'), + '2.16.840.1.113730.3.8.3.3': ('2.16.840.1.113730.3.8.3.3', OID_ATTRIBUTE_TYPE, 'enrolledBy', 'freeIPA'), + '2.16.840.1.113730.3.8.3.4': ('2.16.840.1.113730.3.8.3.4', OID_ATTRIBUTE_TYPE, 'fqdn', 'freeIPA'), + '2.16.840.1.113730.3.8.3.18': ('2.16.840.1.113730.3.8.3.18', OID_ATTRIBUTE_TYPE, 'managedBy', 'freeIPA'), + '2.16.840.1.113730.3.8.3.24': ('2.16.840.1.113730.3.8.3.24', OID_ATTRIBUTE_TYPE, 'ipaEntitlementId', 'freeIPA'), + + # controls + '1.2.826.0.1.3344810.2.3': ('1.2.826.0.1.3344810.2.3', OID_CONTROL, 'Matched Values', 'RFC3876'), + '1.2.840.113556.1.4.319': ('1.2.840.113556.1.4.319', OID_CONTROL, 'LDAP Simple Paged Results', 'RFC2696'), + '1.2.840.113556.1.4.417': ('1.2.840.113556.1.4.417', OID_CONTROL, 'LDAP server show deleted objects', 'MICROSOFT'), + '1.2.840.113556.1.4.473': ('1.2.840.113556.1.4.473', OID_CONTROL, 'Sort Request', 'RFC2891'), + '1.2.840.113556.1.4.474': ('1.2.840.113556.1.4.474', OID_CONTROL, 'Sort Response', 'RFC2891'), + '1.2.840.113556.1.4.521': ('1.2.840.113556.1.4.521', OID_CONTROL, 'Cross-domain move', 'MICROSOFT'), + '1.2.840.113556.1.4.528': ('1.2.840.113556.1.4.528', OID_CONTROL, 'Server search notification', 'MICROSOFT'), + '1.2.840.113556.1.4.529': ('1.2.840.113556.1.4.529', OID_CONTROL, 'Extended DN', 'MICROSOFT'), + '1.2.840.113556.1.4.619': ('1.2.840.113556.1.4.619', OID_CONTROL, 'Lazy commit', 'MICROSOFT'), + '1.2.840.113556.1.4.801': ('1.2.840.113556.1.4.801', OID_CONTROL, 'Security descriptor flags', 'MICROSOFT'), + '1.2.840.113556.1.4.802': ('1.2.840.113556.1.4.802', OID_CONTROL, 'Range option', 'MICROSOFT'), + '1.2.840.113556.1.4.805': ('1.2.840.113556.1.4.805', OID_CONTROL, 'Tree delete', 'MICROSOFT'), + '1.2.840.113556.1.4.841': ('1.2.840.113556.1.4.841', OID_CONTROL, 'Directory synchronization', 'MICROSOFT'), + '1.2.840.113556.1.4.970': ('1.2.840.113556.1.4.970', OID_CONTROL, 'Get stats', 'MICROSOFT'), + '1.2.840.113556.1.4.1338': ('1.2.840.113556.1.4.1338', OID_CONTROL, 'Verify name', 'MICROSOFT'), + '1.2.840.113556.1.4.1339': ('1.2.840.113556.1.4.1339', OID_CONTROL, 'Domain scope', 'MICROSOFT'), + '1.2.840.113556.1.4.1340': ('1.2.840.113556.1.4.1340', OID_CONTROL, 'Search options', 'MICROSOFT'), + '1.2.840.113556.1.4.1341': ('1.2.840.113556.1.4.1341', OID_CONTROL, 'RODC DCPROMO', 'MICROSOFT'), + '1.2.840.113556.1.4.1413': ('1.2.840.113556.1.4.1413', OID_CONTROL, 'Permissive modify', 'MICROSOFT'), + '1.2.840.113556.1.4.1504': ('1.2.840.113556.1.4.1504', OID_CONTROL, 'Attribute scoped query', 'MICROSOFT'), + '1.2.840.113556.1.4.1852': ('1.2.840.113556.1.4.1852', OID_CONTROL, 'User quota', 'MICROSOFT'), + '1.2.840.113556.1.4.1907': ('1.2.840.113556.1.4.1907', OID_CONTROL, 'Server shutdown notify', 'MICROSOFT'), + '1.2.840.113556.1.4.1948': ('1.2.840.113556.1.4.1948', OID_CONTROL, 'Range retrieval no error', 'MICROSOFT'), + '1.2.840.113556.1.4.1974': ('1.2.840.113556.1.4.1974', OID_CONTROL, 'Server force update', 'MICROSOFT'), + '1.2.840.113556.1.4.2026': ('1.2.840.113556.1.4.2026', OID_CONTROL, 'Input DN', 'MICROSOFT'), + '1.2.840.113556.1.4.2064': ('1.2.840.113556.1.4.2064', OID_CONTROL, 'Show recycled', 'MICROSOFT'), + '1.2.840.113556.1.4.2065': ('1.2.840.113556.1.4.2065', OID_CONTROL, 'Show deactivated link', 'MICROSOFT'), + '1.2.840.113556.1.4.2066': ('1.2.840.113556.1.4.2066', OID_CONTROL, 'Policy hints [DEPRECATED]', 'MICROSOFT'), + '1.2.840.113556.1.4.2090': ('1.2.840.113556.1.4.2090', OID_CONTROL, 'DirSync EX', 'MICROSOFT'), + '1.2.840.113556.1.4.2204': ('1.2.840.113556.1.4.2204', OID_CONTROL, 'Tree deleted EX', 'MICROSOFT'), + '1.2.840.113556.1.4.2205': ('1.2.840.113556.1.4.2205', OID_CONTROL, 'Updates stats', 'MICROSOFT'), + '1.2.840.113556.1.4.2206': ('1.2.840.113556.1.4.2206', OID_CONTROL, 'Search hints', 'MICROSOFT'), + '1.2.840.113556.1.4.2211': ('1.2.840.113556.1.4.2211', OID_CONTROL, 'Expected entry count', 'MICROSOFT'), + '1.2.840.113556.1.4.2239': ('1.2.840.113556.1.4.2239', OID_CONTROL, 'Policy hints', 'MICROSOFT'), + '1.2.840.113556.1.4.2255': ('1.2.840.113556.1.4.2255', OID_CONTROL, 'Set owner', 'MICROSOFT'), + '1.2.840.113556.1.4.2256': ('1.2.840.113556.1.4.2256', OID_CONTROL, 'Bypass quota', 'MICROSOFT'), + '1.3.6.1.1.7.1': ('1.3.6.1.1.7.1', OID_CONTROL, 'LCUP Sync Request', 'RFC3928'), + '1.3.6.1.1.7.2': ('1.3.6.1.1.7.2', OID_CONTROL, 'LCUP Sync Update', 'RFC3928'), + '1.3.6.1.1.7.3': ('1.3.6.1.1.7.3', OID_CONTROL, 'LCUP Sync Done', 'RFC3928'), + '1.3.6.1.1.12': ('1.3.6.1.1.12', OID_CONTROL, 'Assertion', 'RFC4528'), + '1.3.6.1.1.13.1': ('1.3.6.1.1.13.1', OID_CONTROL, 'LDAP Pre-read', 'RFC4527'), + '1.3.6.1.1.13.2': ('1.3.6.1.1.13.2', OID_CONTROL, 'LDAP Post-read', 'RFC4527'), + '1.3.6.1.1.21.2': ('1.3.6.1.1.21.2', OID_CONTROL, 'Transaction Specification', 'RFC5805'), + '1.3.6.1.1.22': ('1.3.6.1.1.22', OID_CONTROL, "LDAP Don't Use Copy", 'RFC6171'), + '1.3.6.1.4.1.42.2.27.8.5.1': ('1.3.6.1.4.1.42.2.27.8.5.1', OID_CONTROL, 'Password policy', 'IETF DRAFT behera-ldap-password-policy'), + '1.3.6.1.4.1.42.2.27.9.5.2': ('1.3.6.1.4.1.42.2.27.9.5.2', OID_CONTROL, 'Get effective rights', 'IETF DRAFT draft-ietf-ldapext-acl-model'), + '1.3.6.1.4.1.42.2.27.9.5.8': ('1.3.6.1.4.1.42.2.27.9.5.8', OID_CONTROL, 'Account usability', 'SUN microsystems'), + '1.3.6.1.4.1.1466.29539.12': ('1.3.6.1.4.1.1466.29539.12', OID_CONTROL, 'Chaining loop detect', 'SUN microsystems'), + '1.3.6.1.4.1.4203.1.9.1.1': ('1.3.6.1.4.1.4203.1.9.1.1', OID_CONTROL, 'LDAP content synchronization', 'RFC4533'), + '1.3.6.1.4.1.4203.1.10.1': ('1.3.6.1.4.1.4203.1.10.1', OID_CONTROL, 'Subentries', 'RFC3672'), + '1.3.6.1.4.1.4203.1.10.2': ('1.3.6.1.4.1.4203.1.10.2', OID_CONTROL, 'No-Operation', 'IETF DRAFT draft-zeilenga-ldap-noop'), + '1.3.6.1.4.1.4203.666.5.16': ('1.3.6.1.4.1.4203.666.5.16', OID_CONTROL, 'LDAP Dereference', 'IETF DRAFT draft-masarati-ldap-deref'), + '1.3.6.1.4.1.7628.5.101.1': ('1.3.6.1.4.1.7628.5.101.1', OID_CONTROL, 'LDAP subentries', 'IETF DRAFT draft-ietf-ldup-subentry'), + '1.3.6.1.4.1.26027.1.5.2': ('1.3.6.1.4.1.26027.1.5.2', OID_CONTROL, 'Replication repair', 'OpenDS'), + '2.16.840.1.113719.1.27.101.5': ('2.16.840.1.113719.1.27.101.5', OID_CONTROL, 'Simple password', 'NOVELL'), + '1.3.6.1.4.1.26027.1.6.1': ('1.3.6.1.4.1.26027.1.6.1', OID_CONTROL, 'Password policy state', 'OpenDS'), + '1.3.6.1.4.1.26027.1.6.2': ('1.3.6.1.4.1.26027.1.6.2', OID_CONTROL, 'Get connection ID', 'OpenDS'), + '1.3.6.1.4.1.26027.1.6.3': ('1.3.6.1.4.1.26027.1.6.3', OID_CONTROL, 'Get symmetric key', 'OpenDS'), + '2.16.840.1.113719.1.27.101.6': ('2.16.840.1.113719.1.27.101.6', OID_CONTROL, 'Forward reference', 'NOVELL'), + '2.16.840.1.113719.1.27.103.7': ('2.16.840.1.113719.1.27.103.7', OID_CONTROL, 'Grouping', 'NOVELL'), + '2.16.840.1.113730.3.4.2': ('2.16.840.1.113730.3.4.2', OID_CONTROL, 'ManageDsaIT', 'RFC3296'), + '2.16.840.1.113730.3.4.3': ('2.16.840.1.113730.3.4.3', OID_CONTROL, 'Persistent Search', 'IETF'), + '2.16.840.1.113730.3.4.4': ('2.16.840.1.113730.3.4.4', OID_CONTROL, 'Netscape Password Expired', 'Netscape'), + '2.16.840.1.113730.3.4.5': ('2.16.840.1.113730.3.4.5', OID_CONTROL, 'Netscape Password Expiring', 'Netscape'), + '2.16.840.1.113730.3.4.6': ('2.16.840.1.113730.3.4.6', OID_CONTROL, 'Netscape NT Synchronization Client', 'Netscape'), + '2.16.840.1.113730.3.4.7': ('2.16.840.1.113730.3.4.7', OID_CONTROL, 'Entry Change Notification', 'Netscape'), + '2.16.840.1.113730.3.4.9': ('2.16.840.1.113730.3.4.9', OID_CONTROL, 'Virtual List View Request', 'IETF'), + '2.16.840.1.113730.3.4.10': ('2.16.840.1.113730.3.4.10', OID_CONTROL, 'Virtual List View Response', 'IETF'), + '2.16.840.1.113730.3.4.12': ('2.16.840.1.113730.3.4.12', OID_CONTROL, 'Proxied Authorization (old)', 'Netscape'), + '2.16.840.1.113730.3.4.13': ('2.16.840.1.113730.3.4.13', OID_CONTROL, 'iPlanet Directory Server Replication Update Information', 'Netscape'), + '2.16.840.1.113730.3.4.14': ('2.16.840.1.113730.3.4.14', OID_CONTROL, 'Search on specific database', 'Netscape'), + '2.16.840.1.113730.3.4.15': ('2.16.840.1.113730.3.4.15', OID_CONTROL, 'Authorization Identity Response Control', 'RFC3829'), + '2.16.840.1.113730.3.4.16': ('2.16.840.1.113730.3.4.16', OID_CONTROL, 'Authorization Identity Request Control', 'RFC3829'), + '2.16.840.1.113730.3.4.17': ('2.16.840.1.113730.3.4.17', OID_CONTROL, 'Real attribute only request', 'Netscape'), + '2.16.840.1.113730.3.4.18': ('2.16.840.1.113730.3.4.18', OID_CONTROL, 'Proxy Authorization Control', 'RFC6171'), + '2.16.840.1.113730.3.4.19': ('2.16.840.1.113730.3.4.19', OID_CONTROL, 'Chaining loop detection', 'Netscape'), + '2.16.840.1.113730.3.4.20': ('2.16.840.1.113730.3.4.20', OID_CONTROL, 'Mapping Tree Node - Use one backend [extended]', 'openLDAP'), + '2.16.840.1.113730.3.8.10.6': ('2.16.840.1.113730.3.8.10.6', OID_CONTROL, 'OTP Sync Request', 'freeIPA'), + + # dit content rules + + # extensions + '1.2.840.113556.1.4.1781': ('1.2.840.113556.1.4.1781', OID_EXTENSION, 'Fast concurrent bind', 'MICROSOFT'), + '1.2.840.113556.1.4.2212': ('1.2.840.113556.1.4.2212', OID_EXTENSION, 'Batch request', 'MICROSOFT'), + '1.3.6.1.1.8': ('1.3.6.1.1.8', OID_EXTENSION, 'Cancel Operation', 'RFC3909'), + '1.3.6.1.1.21.1': ('1.3.6.1.1.21.1', OID_EXTENSION, 'Start Transaction Extended Request', 'RFC5805'), + '1.3.6.1.1.21.3': ('1.3.6.1.1.21.3', OID_EXTENSION, 'End Transaction Extended Request', 'RFC5805'), + '1.3.6.1.4.1.1466.101.119.1': ('1.3.6.1.4.1.1466.101.119.1', OID_EXTENSION, 'Dynamic Refresh', 'RFC2589'), + '1.3.6.1.4.1.1466.20037': ('1.3.6.1.4.1.1466.20037', OID_EXTENSION, 'StartTLS', 'RFC4511-RFC4513'), + '1.3.6.1.4.1.4203.1.11.1': ('1.3.6.1.4.1.4203.1.11.1', OID_EXTENSION, 'Modify Password', 'RFC3062'), + '1.3.6.1.4.1.4203.1.11.3': ('1.3.6.1.4.1.4203.1.11.3', OID_EXTENSION, 'Who am I', 'RFC4532'), + '1.3.6.1.1.17.1': ('1.3.6.1.1.17.1', OID_EXTENSION, 'StartLBURPRequest LDAP ExtendedRequest message', 'RFC4373'), + '1.3.6.1.1.17.2': ('1.3.6.1.1.17.2', OID_EXTENSION, 'StartLBURPResponse LDAP ExtendedResponse message', 'RFC4373'), + '1.3.6.1.1.17.3': ('1.3.6.1.1.17.3', OID_EXTENSION, 'EndLBURPRequest LDAP ExtendedRequest message', 'RFC4373'), + '1.3.6.1.1.17.4': ('1.3.6.1.1.17.4', OID_EXTENSION, 'EndLBURPResponse LDAP ExtendedResponse message', 'RFC4373'), + '1.3.6.1.1.17.5': ('1.3.6.1.1.17.5', OID_EXTENSION, 'LBURPUpdateRequest LDAP ExtendedRequest message', 'RFC4373'), + '1.3.6.1.1.17.6': ('1.3.6.1.1.17.6', OID_EXTENSION, 'LBURPUpdateResponse LDAP ExtendedResponse message', 'RFC4373'), + '1.3.6.1.1.19': ('1.3.6.1.1.19', OID_EXTENSION, 'LDAP Turn Operation', 'RFC4531'), + '2.16.840.1.113719.1.14.100.1': ('2.16.840.1.113719.1.14.100.1', OID_EXTENSION, 'getDriverSetRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.2': ('2.16.840.1.113719.1.14.100.2', OID_EXTENSION, 'getDriverSetResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.3': ('2.16.840.1.113719.1.14.100.3', OID_EXTENSION, 'setDriverSetRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.4': ('2.16.840.1.113719.1.14.100.4', OID_EXTENSION, 'setDriverSetResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.5': ('2.16.840.1.113719.1.14.100.5', OID_EXTENSION, 'clearDriverSetRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.6': ('2.16.840.1.113719.1.14.100.6', OID_EXTENSION, 'clearDriverSetResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.7': ('2.16.840.1.113719.1.14.100.7', OID_EXTENSION, 'getDriverStartOptionRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.8': ('2.16.840.1.113719.1.14.100.8', OID_EXTENSION, 'getDriverStartOptionResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.9': ('2.16.840.1.113719.1.14.100.9', OID_EXTENSION, 'setDriverStartOptionRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.10': ('2.16.840.1.113719.1.14.100.10', OID_EXTENSION, 'setDriverStartOptionResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.11': ('2.16.840.1.113719.1.14.100.11', OID_EXTENSION, 'getVersionRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.12': ('2.16.840.1.113719.1.14.100.12', OID_EXTENSION, 'getVersionResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.13': ('2.16.840.1.113719.1.14.100.13', OID_EXTENSION, 'getDriverStateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.14': ('2.16.840.1.113719.1.14.100.14', OID_EXTENSION, 'getDriverStateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.15': ('2.16.840.1.113719.1.14.100.15', OID_EXTENSION, 'startDriverRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.16': ('2.16.840.1.113719.1.14.100.16', OID_EXTENSION, 'startDriverResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.17': ('2.16.840.1.113719.1.14.100.17', OID_EXTENSION, 'stopDriverRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.18': ('2.16.840.1.113719.1.14.100.18', OID_EXTENSION, 'stopDriverResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.19': ('2.16.840.1.113719.1.14.100.19', OID_EXTENSION, 'getDriverStatsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.20': ('2.16.840.1.113719.1.14.100.20', OID_EXTENSION, 'getDriverStatsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.21': ('2.16.840.1.113719.1.14.100.21', OID_EXTENSION, 'driverGetSchemaRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.22': ('2.16.840.1.113719.1.14.100.22', OID_EXTENSION, 'driverGetSchemaResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.23': ('2.16.840.1.113719.1.14.100.23', OID_EXTENSION, 'driverResyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.24': ('2.16.840.1.113719.1.14.100.24', OID_EXTENSION, 'driverResyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.25': ('2.16.840.1.113719.1.14.100.25', OID_EXTENSION, 'migrateAppRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.26': ('2.16.840.1.113719.1.14.100.26', OID_EXTENSION, 'migrateAppResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.27': ('2.16.840.1.113719.1.14.100.27', OID_EXTENSION, 'queueEventRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.28': ('2.16.840.1.113719.1.14.100.28', OID_EXTENSION, 'queueEventResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.29': ('2.16.840.1.113719.1.14.100.29', OID_EXTENSION, 'submitCommandRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.30': ('2.16.840.1.113719.1.14.100.30', OID_EXTENSION, 'submitCommandResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.31': ('2.16.840.1.113719.1.14.100.31', OID_EXTENSION, 'submitEventRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.32': ('2.16.840.1.113719.1.14.100.32', OID_EXTENSION, 'submitEventResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.33': ('2.16.840.1.113719.1.14.100.33', OID_EXTENSION, 'getChunkedResultRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.34': ('2.16.840.1.113719.1.14.100.34', OID_EXTENSION, 'getChunkedResultResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.35': ('2.16.840.1.113719.1.14.100.35', OID_EXTENSION, 'closeChunkedResultRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.36': ('2.16.840.1.113719.1.14.100.36', OID_EXTENSION, 'closeChunkedResultResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.37': ('2.16.840.1.113719.1.14.100.37', OID_EXTENSION, 'checkObjectPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.38': ('2.16.840.1.113719.1.14.100.38', OID_EXTENSION, 'checkObjectPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.39': ('2.16.840.1.113719.1.14.100.39', OID_EXTENSION, 'initDriverObjectRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.40': ('2.16.840.1.113719.1.14.100.40', OID_EXTENSION, 'initDriverObjectResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.41': ('2.16.840.1.113719.1.14.100.41', OID_EXTENSION, 'viewCacheEntriesRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.42': ('2.16.840.1.113719.1.14.100.42', OID_EXTENSION, 'viewCacheEntriesResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.43': ('2.16.840.1.113719.1.14.100.43', OID_EXTENSION, 'deleteCacheEntriesRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.44': ('2.16.840.1.113719.1.14.100.44', OID_EXTENSION, 'deleteCacheEntriesResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.45': ('2.16.840.1.113719.1.14.100.45', OID_EXTENSION, 'getPasswordsStateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.46': ('2.16.840.1.113719.1.14.100.46', OID_EXTENSION, 'getPasswordsStateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.47': ('2.16.840.1.113719.1.14.100.47', OID_EXTENSION, 'regenerateKeyRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.48': ('2.16.840.1.113719.1.14.100.48', OID_EXTENSION, 'regenerateKeyResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.49': ('2.16.840.1.113719.1.14.100.49', OID_EXTENSION, 'getServerCertRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.50': ('2.16.840.1.113719.1.14.100.50', OID_EXTENSION, 'getServerCertResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.51': ('2.16.840.1.113719.1.14.100.51', OID_EXTENSION, 'discoverJobsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.52': ('2.16.840.1.113719.1.14.100.52', OID_EXTENSION, 'discoverJobsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.53': ('2.16.840.1.113719.1.14.100.53', OID_EXTENSION, 'notifyJobUpdateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.54': ('2.16.840.1.113719.1.14.100.54', OID_EXTENSION, 'notifyJobUpdateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.55': ('2.16.840.1.113719.1.14.100.55', OID_EXTENSION, 'startJobRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.56': ('2.16.840.1.113719.1.14.100.56', OID_EXTENSION, 'startJobResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.57': ('2.16.840.1.113719.1.14.100.57', OID_EXTENSION, 'abortJobRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.58': ('2.16.840.1.113719.1.14.100.58', OID_EXTENSION, 'abortJobresponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.59': ('2.16.840.1.113719.1.14.100.59', OID_EXTENSION, 'getJobStateRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.60': ('2.16.840.1.113719.1.14.100.60', OID_EXTENSION, 'getJobStateResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.61': ('2.16.840.1.113719.1.14.100.61', OID_EXTENSION, 'checkJobConfigRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.62': ('2.16.840.1.113719.1.14.100.62', OID_EXTENSION, 'checkJobConfigResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.63': ('2.16.840.1.113719.1.14.100.63', OID_EXTENSION, 'setLogEventsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.64': ('2.16.840.1.113719.1.14.100.64', OID_EXTENSION, 'setLogEventsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.65': ('2.16.840.1.113719.1.14.100.65', OID_EXTENSION, 'clearLogEventsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.66': ('2.16.840.1.113719.1.14.100.66', OID_EXTENSION, 'clearLogEventsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.67': ('2.16.840.1.113719.1.14.100.67', OID_EXTENSION, 'setAppPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.68': ('2.16.840.1.113719.1.14.100.68', OID_EXTENSION, 'setAppPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.69': ('2.16.840.1.113719.1.14.100.69', OID_EXTENSION, 'clearAppPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.70': ('2.16.840.1.113719.1.14.100.70', OID_EXTENSION, 'clearAppPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.71': ('2.16.840.1.113719.1.14.100.71', OID_EXTENSION, 'setRemoteLoaderPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.72': ('2.16.840.1.113719.1.14.100.72', OID_EXTENSION, 'setRemoteLoaderPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.73': ('2.16.840.1.113719.1.14.100.73', OID_EXTENSION, 'clearRemoteLoaderPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.74': ('2.16.840.1.113719.1.14.100.74', OID_EXTENSION, 'clearRemoteLoaderPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.75': ('2.16.840.1.113719.1.14.100.75', OID_EXTENSION, 'setNamedPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.76': ('2.16.840.1.113719.1.14.100.76', OID_EXTENSION, 'setNamedPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.77': ('2.16.840.1.113719.1.14.100.77', OID_EXTENSION, 'removeNamedPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.78': ('2.16.840.1.113719.1.14.100.78', OID_EXTENSION, 'removeNamedPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.79': ('2.16.840.1.113719.1.14.100.79', OID_EXTENSION, 'removeAllNamedPasswordsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.80': ('2.16.840.1.113719.1.14.100.80', OID_EXTENSION, 'removeAllNamedPasswordsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.81': ('2.16.840.1.113719.1.14.100.81', OID_EXTENSION, 'listNamedPasswordsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.82': ('2.16.840.1.113719.1.14.100.82', OID_EXTENSION, 'listNamedPasswordsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.83': ('2.16.840.1.113719.1.14.100.83', OID_EXTENSION, 'getDefaultReciprocalAttrsMapRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.84': ('2.16.840.1.113719.1.14.100.84', OID_EXTENSION, 'getDefaultReciprocalAttrsMapResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.85': ('2.16.840.1.113719.1.14.100.85', OID_EXTENSION, 'resetDriverStatsRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.86': ('2.16.840.1.113719.1.14.100.86', OID_EXTENSION, 'resetDriverStatsResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.87': ('2.16.840.1.113719.1.14.100.87', OID_EXTENSION, 'regenerateAllKeysRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.88': ('2.16.840.1.113719.1.14.100.88', OID_EXTENSION, 'regenerateAllKeysResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.89': ('2.16.840.1.113719.1.14.100.89', OID_EXTENSION, 'getDriverGCVRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.90': ('2.16.840.1.113719.1.14.100.90', OID_EXTENSION, 'getDriverGCVResponse', 'NOVELL'), + '2.16.840.1.113719.1.14.100.91': ('2.16.840.1.113719.1.14.100.91', OID_EXTENSION, 'getNamedPasswordRequest', 'NOVELL'), + '2.16.840.1.113719.1.14.100.92': ('2.16.840.1.113719.1.14.100.92', OID_EXTENSION, 'getNamedPasswordResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.1': ('2.16.840.1.113719.1.27.100.1', OID_EXTENSION, 'ndsToLdapResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.2': ('2.16.840.1.113719.1.27.100.2', OID_EXTENSION, 'ndsToLdapRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.3': ('2.16.840.1.113719.1.27.100.3', OID_EXTENSION, 'splitPartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.4': ('2.16.840.1.113719.1.27.100.4', OID_EXTENSION, 'splitPartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.5': ('2.16.840.1.113719.1.27.100.5', OID_EXTENSION, 'mergePartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.6': ('2.16.840.1.113719.1.27.100.6', OID_EXTENSION, 'mergePartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.7': ('2.16.840.1.113719.1.27.100.7', OID_EXTENSION, 'addReplicaRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.8': ('2.16.840.1.113719.1.27.100.8', OID_EXTENSION, 'addReplicaResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.9': ('2.16.840.1.113719.1.27.100.9', OID_EXTENSION, 'refreshLDAPServerRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.10': ('2.16.840.1.113719.1.27.100.10', OID_EXTENSION, 'refreshLDAPServerResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.11': ('2.16.840.1.113719.1.27.100.11', OID_EXTENSION, 'removeReplicaRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.12': ('2.16.840.1.113719.1.27.100.12', OID_EXTENSION, 'removeReplicaResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.13': ('2.16.840.1.113719.1.27.100.13', OID_EXTENSION, 'partitionEntryCountRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.14': ('2.16.840.1.113719.1.27.100.14', OID_EXTENSION, 'partitionEntryCountResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.15': ('2.16.840.1.113719.1.27.100.15', OID_EXTENSION, 'changeReplicaTypeRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.16': ('2.16.840.1.113719.1.27.100.16', OID_EXTENSION, 'changeReplicaTypeResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.17': ('2.16.840.1.113719.1.27.100.17', OID_EXTENSION, 'getReplicaInfoRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.18': ('2.16.840.1.113719.1.27.100.18', OID_EXTENSION, 'getReplicaInfoResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.19': ('2.16.840.1.113719.1.27.100.19', OID_EXTENSION, 'listReplicaRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.20': ('2.16.840.1.113719.1.27.100.20', OID_EXTENSION, 'listReplicaResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.21': ('2.16.840.1.113719.1.27.100.21', OID_EXTENSION, 'receiveAllUpdatesRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.22': ('2.16.840.1.113719.1.27.100.22', OID_EXTENSION, 'receiveAllUpdatesResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.23': ('2.16.840.1.113719.1.27.100.23', OID_EXTENSION, 'sendAllUpdatesRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.24': ('2.16.840.1.113719.1.27.100.24', OID_EXTENSION, 'sendAllUpdatesResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.25': ('2.16.840.1.113719.1.27.100.25', OID_EXTENSION, 'requestPartitionSyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.26': ('2.16.840.1.113719.1.27.100.26', OID_EXTENSION, 'requestPartitionSyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.27': ('2.16.840.1.113719.1.27.100.27', OID_EXTENSION, 'requestSchemaSyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.28': ('2.16.840.1.113719.1.27.100.28', OID_EXTENSION, 'requestSchemaSyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.29': ('2.16.840.1.113719.1.27.100.29', OID_EXTENSION, 'abortPartitionOperationRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.30': ('2.16.840.1.113719.1.27.100.30', OID_EXTENSION, 'abortPartitionOperationResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.31': ('2.16.840.1.113719.1.27.100.31', OID_EXTENSION, 'getBindDNRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.32': ('2.16.840.1.113719.1.27.100.32', OID_EXTENSION, 'getBindDNResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.33': ('2.16.840.1.113719.1.27.100.33', OID_EXTENSION, 'getEffectivePrivilegesRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.34': ('2.16.840.1.113719.1.27.100.34', OID_EXTENSION, 'getEffectivePrivilegesResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.35': ('2.16.840.1.113719.1.27.100.35', OID_EXTENSION, 'setReplicationFilterRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.36': ('2.16.840.1.113719.1.27.100.36', OID_EXTENSION, 'setReplicationFilterResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.37': ('2.16.840.1.113719.1.27.100.37', OID_EXTENSION, 'getReplicationFilterRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.38': ('2.16.840.1.113719.1.27.100.38', OID_EXTENSION, 'getReplicationFilterResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.39': ('2.16.840.1.113719.1.27.100.39', OID_EXTENSION, 'splitOrphanPartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.40': ('2.16.840.1.113719.1.27.100.40', OID_EXTENSION, 'splitOrphanPartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.41': ('2.16.840.1.113719.1.27.100.41', OID_EXTENSION, 'removeOrphanPartitionRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.42': ('2.16.840.1.113719.1.27.100.42', OID_EXTENSION, 'removeOrphanPartitionResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.43': ('2.16.840.1.113719.1.27.100.43', OID_EXTENSION, 'triggerBKLinkerRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.44': ('2.16.840.1.113719.1.27.100.44', OID_EXTENSION, 'triggerBKLinkerResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.45': ('2.16.840.1.113719.1.27.100.45', OID_EXTENSION, 'triggerDRLProcessRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.46': ('2.16.840.1.113719.1.27.100.46', OID_EXTENSION, 'triggerDRLProcessResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.47': ('2.16.840.1.113719.1.27.100.47', OID_EXTENSION, 'triggerJanitorRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.48': ('2.16.840.1.113719.1.27.100.48', OID_EXTENSION, 'triggerJanitorResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.49': ('2.16.840.1.113719.1.27.100.49', OID_EXTENSION, 'triggerLimberRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.50': ('2.16.840.1.113719.1.27.100.50', OID_EXTENSION, 'triggerLimberResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.51': ('2.16.840.1.113719.1.27.100.51', OID_EXTENSION, 'triggerSkulkerRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.52': ('2.16.840.1.113719.1.27.100.52', OID_EXTENSION, 'triggerSkulkerResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.53': ('2.16.840.1.113719.1.27.100.53', OID_EXTENSION, 'triggerSchemaSyncRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.54': ('2.16.840.1.113719.1.27.100.54', OID_EXTENSION, 'triggerSchemaSyncResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.55': ('2.16.840.1.113719.1.27.100.55', OID_EXTENSION, 'triggerPartitionPurgeRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.56': ('2.16.840.1.113719.1.27.100.56', OID_EXTENSION, 'triggerPartitionPurgeResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.79': ('2.16.840.1.113719.1.27.100.79', OID_EXTENSION, 'eventMonitorRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.80': ('2.16.840.1.113719.1.27.100.80', OID_EXTENSION, 'eventMonitorResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.81': ('2.16.840.1.113719.1.27.100.81', OID_EXTENSION, 'nldapEventNotification', 'NOVELL'), + '2.16.840.1.113719.1.27.100.84': ('2.16.840.1.113719.1.27.100.84', OID_EXTENSION, 'filteredEventMonitorRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.85': ('2.16.840.1.113719.1.27.100.85', OID_EXTENSION, 'filteredEventMonitorResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.96': ('2.16.840.1.113719.1.27.100.96', OID_EXTENSION, 'ldapBackupRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.97': ('2.16.840.1.113719.1.27.100.97', OID_EXTENSION, 'ldapBackupResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.98': ('2.16.840.1.113719.1.27.100.98', OID_EXTENSION, 'ldapRestoreRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.99': ('2.16.840.1.113719.1.27.100.99', OID_EXTENSION, 'ldapRestoreResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.101': ('2.16.840.1.113719.1.27.100.101', OID_EXTENSION, 'LDAPDNStoX500DNRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.102': ('2.16.840.1.113719.1.27.100.102', OID_EXTENSION, 'LDAPDNStoX500DNResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.100.103': ('2.16.840.1.113719.1.27.100.103', OID_EXTENSION, 'getPrivilegesListRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.100.104': ('2.16.840.1.113719.1.27.100.104', OID_EXTENSION, 'getPrivilegesListResponse', 'NOVELL'), + '2.16.840.1.113719.1.27.103.1': ('2.16.840.1.113719.1.27.103.1', OID_EXTENSION, 'createGroupingRequest', 'NOVELL'), + '2.16.840.1.113719.1.27.103.2': ('2.16.840.1.113719.1.27.103.2', OID_EXTENSION, 'endGroupingRequest', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.1': ('2.16.840.1.113719.1.39.42.100.1', OID_EXTENSION, 'NMAS Put Login Configuration', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.3': ('2.16.840.1.113719.1.39.42.100.3', OID_EXTENSION, 'NMAS Get Login Configuration', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.5': ('2.16.840.1.113719.1.39.42.100.5', OID_EXTENSION, 'NMAS Delete Login Configuration', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.7': ('2.16.840.1.113719.1.49.42.100.7', OID_EXTENSION, 'NMAS Put Login Secret', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.9': ('2.16.840.1.113719.1.39.42.100.9', OID_EXTENSION, 'NMAS Delete Login Secret', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.11': ('2.16.840.1.113719.1.39.42.100.11', OID_EXTENSION, 'NMAS Set Universal Password Request', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.12': ('2.16.840.1.113719.1.39.42.100.12', OID_EXTENSION, 'NMAS Set Universal Password Response', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.13': ('2.16.840.1.113719.1.39.42.100.13', OID_EXTENSION, 'NMAS Get Universal Password Request', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.14': ('2.16.840.1.113719.1.39.42.100.14', OID_EXTENSION, 'NMAS Get Universal Password Response', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.15': ('2.16.840.1.113719.1.39.42.100.15', OID_EXTENSION, 'NMAS Delete Universal Password', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.17': ('2.16.840.1.113719.1.39.42.100.17', OID_EXTENSION, 'NMAS Check password against password policy', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.19': ('2.16.840.1.113719.1.39.42.100.19', OID_EXTENSION, 'NMAS Get password policy information', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.21': ('2.16.840.1.113719.1.39.42.100.21', OID_EXTENSION, 'NMAS Change Universal Password', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.23': ('2.16.840.1.113719.1.39.42.100.23', OID_EXTENSION, 'NMAS Graded Authentication management', 'NOVELL'), + '2.16.840.1.113719.1.39.42.100.25': ('2.16.840.1.113719.1.39.42.100.25', OID_EXTENSION, 'NMAS management (new with NMAS 3.1.0)', 'NOVELL'), + '2.16.840.1.113719.1.142.1.4.1': ('2.16.840.1.113719.1.142.1.4.1', OID_EXTENSION, 'LBURPIncUpdate', 'NOVELL'), + '2.16.840.1.113719.1.142.1.4.2': ('2.16.840.1.113719.1.142.1.4.2', OID_EXTENSION, 'LBURPFullUpdate', 'NOVELL'), + '2.16.840.1.113719.1.142.100.1': ('2.16.840.1.113719.1.142.100.1', OID_EXTENSION, 'LBURPStartReplRequest', 'NOVELL'), + '2.16.840.1.113719.1.142.100.2': ('2.16.840.1.113719.1.142.100.2', OID_EXTENSION, 'LBURPStartReplResponse', 'NOVELL'), + '2.16.840.1.113719.1.142.100.4': ('2.16.840.1.113719.1.142.100.4', OID_EXTENSION, 'LBURPEndReplRequest', 'NOVELL'), + '2.16.840.1.113719.1.142.100.5': ('2.16.840.1.113719.1.142.100.5', OID_EXTENSION, 'LBURPEndReplResponse', 'NOVELL'), + '2.16.840.1.113719.1.142.100.6': ('2.16.840.1.113719.1.142.100.6', OID_EXTENSION, 'LBURPOperationRequest', 'NOVELL'), + '2.16.840.1.113719.1.142.100.7': ('2.16.840.1.113719.1.142.100.7', OID_EXTENSION, 'LBURPOperationResponse', 'NOVELL'), + '2.16.840.1.113719.1.148.100.1': ('2.16.840.1.113719.1.148.100.1', OID_EXTENSION, 'SSLDAP_GET_SERVICE_INFO_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.2': ('2.16.840.1.113719.1.148.100.2', OID_EXTENSION, 'SSLDAP_GET_SERVICE_INFO_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.3': ('2.16.840.1.113719.1.148.100.3', OID_EXTENSION, 'SSLDAP_READ_SECRET_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.4': ('2.16.840.1.113719.1.148.100.4', OID_EXTENSION, 'SSLDAP_READ_SECRET_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.5': ('2.16.840.1.113719.1.148.100.5', OID_EXTENSION, 'SSLDAP_WRITE_SECRET_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.6': ('2.16.840.1.113719.1.148.100.6', OID_EXTENSION, 'SSLDAP_WRITE_SECRET_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.7': ('2.16.840.1.113719.1.148.100.7', OID_EXTENSION, 'SSLDAP_ADD_SECRET_ID_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.8': ('2.16.840.1.113719.1.148.100.8', OID_EXTENSION, 'SSLDAP_ADD_SECRET_ID_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.9': ('2.16.840.1.113719.1.148.100.9', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.10': ('2.16.840.1.113719.1.148.100.10', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.11': ('2.16.840.1.113719.1.148.100.11', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_STORE_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.12': ('2.16.840.1.113719.1.148.100.12', OID_EXTENSION, 'SSLDAP_REMOVE_SECRET_STORE_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.13': ('2.16.840.1.113719.1.148.100.13', OID_EXTENSION, 'SSLDAP_ENUMERATE_SECRET_IDS_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.14': ('2.16.840.1.113719.1.148.100.14', OID_EXTENSION, 'SSLDAP_ENUMERATE_SECRET_IDS_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.15': ('2.16.840.1.113719.1.148.100.15', OID_EXTENSION, 'SSLDAP_UNLOCK_SECRETS_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.16': ('2.16.840.1.113719.1.148.100.16', OID_EXTENSION, 'SSLDAP_UNLOCK_SECRETS_REPLY', 'NOVELL'), + '2.16.840.1.113719.1.148.100.17': ('2.16.840.1.113719.1.148.100.17', OID_EXTENSION, 'SSLDAP_SET_EP_MASTER_PASSWORD_REQUEST', 'NOVELL'), + '2.16.840.1.113719.1.148.100.18': ('2.16.840.1.113719.1.148.100.18', OID_EXTENSION, 'SSLDAP_SET_EP_MASTER_PASSWORD_REPLY', 'NOVELL'), + '2.16.840.1.113730.3.5.1': ('2.16.840.1.113730.3.5.1', OID_EXTENSION, 'Transaction Request Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.2': ('2.16.840.1.113730.3.5.2', OID_EXTENSION, 'Transaction Response Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.3': ('2.16.840.1.113730.3.5.3', OID_EXTENSION, 'Transaction Response Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.4': ('2.16.840.1.113730.3.5.4', OID_EXTENSION, 'iPlanet Replication Response Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.5': ('2.16.840.1.113730.3.5.5', OID_EXTENSION, 'iPlanet End Replication Request Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.6': ('2.16.840.1.113730.3.5.6', OID_EXTENSION, 'iPlanet Replication Entry Request Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.7': ('2.16.840.1.113730.3.5.7', OID_EXTENSION, 'iPlanet Bulk Import Start Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.8': ('2.16.840.1.113730.3.5.8', OID_EXTENSION, 'iPlanet Bulk Import Finished Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.9': ('2.16.840.1.113730.3.5.9', OID_EXTENSION, 'iPlanet Digest Authentication Calculation Extended Operation', 'Netscape'), + '2.16.840.1.113730.3.5.10': ('2.16.840.1.113730.3.5.10', OID_EXTENSION, 'Distributed Numeric Assignment Extended Request', 'Netscape'), + '2.16.840.1.113730.3.5.11': ('2.16.840.1.113730.3.5.11', OID_EXTENSION, 'Distributed Numeric Assignment Extended Response', 'Netscape'), + '2.16.840.1.113730.3.5.12': ('2.16.840.1.113730.3.5.12', OID_EXTENSION, 'Start replication request', 'Netscape'), + '2.16.840.1.113730.3.5.13': ('2.16.840.1.113730.3.5.13', OID_EXTENSION, 'Start replication response', 'Netscape'), + '2.16.840.1.113730.3.6.5': ('2.16.840.1.113730.3.6.5', OID_EXTENSION, 'Replication CleanAllRUV', 'Netscape'), + '2.16.840.1.113730.3.6.6': ('2.16.840.1.113730.3.6.6', OID_EXTENSION, 'Replication Abort CleanAllRUV', 'Netscape'), + '2.16.840.1.113730.3.6.7': ('2.16.840.1.113730.3.6.7', OID_EXTENSION, 'Replication CleanAllRUV Retrieve MaxCSN', 'Netscape'), + '2.16.840.1.113730.3.6.8': ('2.16.840.1.113730.3.6.8', OID_EXTENSION, 'Replication CleanAllRUV Check Status', 'Netscape'), + '2.16.840.1.113730.3.8.10.1': ('2.16.840.1.113730.3.8.10.1', OID_EXTENSION, 'KeyTab set', 'FreeIPA'), + '2.16.840.1.113730.3.8.10.2': ('2.16.840.1.113730.3.8.10.2', OID_EXTENSION, 'KeyTab ret', 'FreeIPA'), + '2.16.840.1.113730.3.8.10.3': ('2.16.840.1.113730.3.8.10.3', OID_EXTENSION, 'Enrollment join', 'FreeIPA'), + '2.16.840.1.113730.3.8.10.5': ('2.16.840.1.113730.3.8.10.5', OID_EXTENSION, 'KeyTab get', 'FreeIPA'), + + # features (capabilities) + '1.2.840.113556.1.4.800': ('1.2.840.113556.1.4.800', OID_FEATURE, 'Active directory', 'MICROSOFT'), + '1.2.840.113556.1.4.1670': ('1.2.840.113556.1.4.1670', OID_FEATURE, 'Active directory V51', 'MICROSOFT'), + '1.2.840.113556.1.4.1791': ('1.2.840.113556.1.4.1791', OID_FEATURE, 'Active directory LDAP Integration', 'MICROSOFT'), + '1.2.840.113556.1.4.1880': ('1.2.840.113556.1.4.1880', OID_FEATURE, 'Active directory ADAM digest', 'MICROSOFT'), + '1.2.840.113556.1.4.1851': ('1.2.840.113556.1.4.1851', OID_FEATURE, 'Active directory ADAM', 'MICROSOFT'), + '1.2.840.113556.1.4.1920': ('1.2.840.113556.1.4.1920', OID_FEATURE, 'Active directory partial secrets', 'MICROSOFT'), + '1.2.840.113556.1.4.1935': ('1.2.840.113556.1.4.1935', OID_FEATURE, 'Active directory V60', 'MICROSOFT'), + '1.2.840.113556.1.4.2080': ('1.2.840.113556.1.4.2080', OID_FEATURE, 'Active directory V61 R2', 'MICROSOFT'), + '1.2.840.113556.1.4.2237': ('1.2.840.113556.1.4.2237', OID_FEATURE, 'Active directory W8', 'MICROSOFT'), + '1.3.6.1.1.14': ('1.3.6.1.1.14', OID_FEATURE, 'Modify-Increment', 'RFC4525'), + '1.3.6.1.1.17.7': ('1.3.6.1.1.17.7', OID_FEATURE, 'LBURP Incremental Update style OID', 'RFC4373'), + '1.3.6.1.4.1.4203.1.5.1': ('1.3.6.1.4.1.4203.1.5.1', OID_FEATURE, 'All Op Attrs', 'RFC3673'), + '1.3.6.1.4.1.4203.1.5.2': ('1.3.6.1.4.1.4203.1.5.2', OID_FEATURE, 'OC AD Lists', 'RFC4529'), + '1.3.6.1.4.1.4203.1.5.3': ('1.3.6.1.4.1.4203.1.5.3', OID_FEATURE, 'True/False filters', 'RFC4526'), + '1.3.6.1.4.1.4203.1.5.4': ('1.3.6.1.4.1.4203.1.5.4', OID_FEATURE, 'Language Tag Options', 'RFC3866'), + '1.3.6.1.4.1.4203.1.5.5': ('1.3.6.1.4.1.4203.1.5.5', OID_FEATURE, 'language Range Options', 'RFC3866'), + '2.16.840.1.113719.1.27.99.1': ('2.16.840.1.113719.1.27.99.1', OID_FEATURE, 'Superior References', 'NOVELL'), + + # ldap syntaxes + '1.2.840.113556.1.4.903': ('1.2.840.113556.1.4.903', OID_LDAP_SYNTAX, 'Object (DN-binary)', 'MICROSOFT'), + '1.2.840.113556.1.4.904': ('1.2.840.113556.1.4.904', OID_LDAP_SYNTAX, 'Object(DN-string)', 'MICROSOFT'), + '1.2.840.113556.1.4.905': ('1.2.840.113556.1.4.905', OID_LDAP_SYNTAX, 'String (Teletex)', 'MICROSOFT'), + '1.2.840.113556.1.4.906': ('1.2.840.113556.1.4.906', OID_LDAP_SYNTAX, 'Large Integer', 'MICROSOFT'), + '1.2.840.113556.1.4.907': ('1.2.840.113556.1.4.907', OID_LDAP_SYNTAX, 'String (NT-Sec-Desc)', 'MICROSOFT'), + '1.2.840.113556.1.4.1221': ('1.2.840.113556.1.4.1221', OID_LDAP_SYNTAX, 'Object (OR-Name)', 'MICROSOFT'), + '1.2.840.113556.1.4.1362': ('1.2.840.113556.1.4.1362', OID_LDAP_SYNTAX, 'String (Case)', 'MICROSOFT'), + '1.3.6.1.1.16.1': ('1.3.6.1.1.16.1', OID_LDAP_SYNTAX, 'Universally Unique Identifier (UUID)', 'RFC4530'), + '1.3.6.1.4.1.1466.115.121.1.1': ('1.3.6.1.4.1.1466.115.121.1.1', OID_LDAP_SYNTAX, 'ACI item [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.2': ('1.3.6.1.4.1.1466.115.121.1.2', OID_LDAP_SYNTAX, 'Access point [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.3': ('1.3.6.1.4.1.1466.115.121.1.3', OID_LDAP_SYNTAX, 'Attribute Type Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.4': ('1.3.6.1.4.1.1466.115.121.1.4', OID_LDAP_SYNTAX, 'Audio [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.5': ('1.3.6.1.4.1.1466.115.121.1.5', OID_LDAP_SYNTAX, 'Binary [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.6': ('1.3.6.1.4.1.1466.115.121.1.6', OID_LDAP_SYNTAX, 'Bit String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.7': ('1.3.6.1.4.1.1466.115.121.1.7', OID_LDAP_SYNTAX, 'Boolean', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.8': ('1.3.6.1.4.1.1466.115.121.1.8', OID_LDAP_SYNTAX, 'Certificate [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.9': ('1.3.6.1.4.1.1466.115.121.1.9', OID_LDAP_SYNTAX, 'Certificate List [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.10': ('1.3.6.1.4.1.1466.115.121.1.10', OID_LDAP_SYNTAX, 'Certificate Pair [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.11': ('1.3.6.1.4.1.1466.115.121.1.11', OID_LDAP_SYNTAX, 'Country String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.12': ('1.3.6.1.4.1.1466.115.121.1.12', OID_LDAP_SYNTAX, 'DN', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.13': ('1.3.6.1.4.1.1466.115.121.1.13', OID_LDAP_SYNTAX, 'Data Quality Syntax [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.14': ('1.3.6.1.4.1.1466.115.121.1.14', OID_LDAP_SYNTAX, 'Delivery Method', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.15': ('1.3.6.1.4.1.1466.115.121.1.15', OID_LDAP_SYNTAX, 'Directory String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.16': ('1.3.6.1.4.1.1466.115.121.1.16', OID_LDAP_SYNTAX, 'DIT Content Rule Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.17': ('1.3.6.1.4.1.1466.115.121.1.17', OID_LDAP_SYNTAX, 'DIT Structure Rule Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.18': ('1.3.6.1.4.1.1466.115.121.1.18', OID_LDAP_SYNTAX, 'DL Submit Permission [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.19': ('1.3.6.1.4.1.1466.115.121.1.19', OID_LDAP_SYNTAX, 'DSA Quality Syntax [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.20': ('1.3.6.1.4.1.1466.115.121.1.20', OID_LDAP_SYNTAX, 'DSE Type [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.21': ('1.3.6.1.4.1.1466.115.121.1.21', OID_LDAP_SYNTAX, 'Enhanced Guide', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.22': ('1.3.6.1.4.1.1466.115.121.1.22', OID_LDAP_SYNTAX, 'Facsimile Telephone Number', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.23': ('1.3.6.1.4.1.1466.115.121.1.23', OID_LDAP_SYNTAX, 'Fax', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.24': ('1.3.6.1.4.1.1466.115.121.1.24', OID_LDAP_SYNTAX, 'Generalized Time', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.25': ('1.3.6.1.4.1.1466.115.121.1.25', OID_LDAP_SYNTAX, 'Guide [OBSOLETE]', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.26': ('1.3.6.1.4.1.1466.115.121.1.26', OID_LDAP_SYNTAX, 'IA5 String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.27': ('1.3.6.1.4.1.1466.115.121.1.27', OID_LDAP_SYNTAX, 'Integer', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.28': ('1.3.6.1.4.1.1466.115.121.1.28', OID_LDAP_SYNTAX, 'JPEG', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.29': ('1.3.6.1.4.1.1466.115.121.1.29', OID_LDAP_SYNTAX, 'Master and Shadow Access Points [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.30': ('1.3.6.1.4.1.1466.115.121.1.30', OID_LDAP_SYNTAX, 'Matching Rule Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.31': ('1.3.6.1.4.1.1466.115.121.1.31', OID_LDAP_SYNTAX, 'Matching Rule Use Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.32': ('1.3.6.1.4.1.1466.115.121.1.32', OID_LDAP_SYNTAX, 'Mail Preference [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.33': ('1.3.6.1.4.1.1466.115.121.1.33', OID_LDAP_SYNTAX, 'MHS OR Address [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.34': ('1.3.6.1.4.1.1466.115.121.1.34', OID_LDAP_SYNTAX, 'Name And Optional UID', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.35': ('1.3.6.1.4.1.1466.115.121.1.35', OID_LDAP_SYNTAX, 'Name Form Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.36': ('1.3.6.1.4.1.1466.115.121.1.36', OID_LDAP_SYNTAX, 'Numeric String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.37': ('1.3.6.1.4.1.1466.115.121.1.37', OID_LDAP_SYNTAX, 'Object Class Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.38': ('1.3.6.1.4.1.1466.115.121.1.38', OID_LDAP_SYNTAX, 'OID', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.39': ('1.3.6.1.4.1.1466.115.121.1.39', OID_LDAP_SYNTAX, 'Other Mailbox', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.40': ('1.3.6.1.4.1.1466.115.121.1.40', OID_LDAP_SYNTAX, 'Octet String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.41': ('1.3.6.1.4.1.1466.115.121.1.41', OID_LDAP_SYNTAX, 'Postal Address', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.42': ('1.3.6.1.4.1.1466.115.121.1.42', OID_LDAP_SYNTAX, 'Protocol Information [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.43': ('1.3.6.1.4.1.1466.115.121.1.43', OID_LDAP_SYNTAX, 'Presentation Address [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.44': ('1.3.6.1.4.1.1466.115.121.1.44', OID_LDAP_SYNTAX, 'Printable String', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.45': ('1.3.6.1.4.1.1466.115.121.1.45', OID_LDAP_SYNTAX, 'Subtree specification [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.46': ('1.3.6.1.4.1.1466.115.121.1.46', OID_LDAP_SYNTAX, 'Supplier Information [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.47': ('1.3.6.1.4.1.1466.115.121.1.47', OID_LDAP_SYNTAX, 'Supplier Or Consumer [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.48': ('1.3.6.1.4.1.1466.115.121.1.48', OID_LDAP_SYNTAX, 'Supplier And Consumer [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.49': ('1.3.6.1.4.1.1466.115.121.1.49', OID_LDAP_SYNTAX, 'Supported Algorithm [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.50': ('1.3.6.1.4.1.1466.115.121.1.50', OID_LDAP_SYNTAX, 'Telephone Number', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.51': ('1.3.6.1.4.1.1466.115.121.1.51', OID_LDAP_SYNTAX, 'Teletex Terminal Identifier', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.52': ('1.3.6.1.4.1.1466.115.121.1.52', OID_LDAP_SYNTAX, 'Telex Number', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.53': ('1.3.6.1.4.1.1466.115.121.1.53', OID_LDAP_SYNTAX, 'UTC Time [DEPRECATED]', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.54': ('1.3.6.1.4.1.1466.115.121.1.54', OID_LDAP_SYNTAX, 'LDAP Syntax Description', 'RFC4517'), + '1.3.6.1.4.1.1466.115.121.1.55': ('1.3.6.1.4.1.1466.115.121.1.55', OID_LDAP_SYNTAX, 'Modify rights [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.56': ('1.3.6.1.4.1.1466.115.121.1.56', OID_LDAP_SYNTAX, 'LDAP Schema Definition [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.57': ('1.3.6.1.4.1.1466.115.121.1.57', OID_LDAP_SYNTAX, 'LDAP Schema Description [OBSOLETE]', 'RFC2252'), + '1.3.6.1.4.1.1466.115.121.1.58': ('1.3.6.1.4.1.1466.115.121.1.58', OID_LDAP_SYNTAX, 'Substring Assertion', 'RFC4517'), + '2.16.840.1.113719.1.1.5.1.0': ('2.16.840.1.113719.1.1.5.1.0', OID_LDAP_SYNTAX, 'Unknown', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.6': ('2.16.840.1.113719.1.1.5.1.6', OID_LDAP_SYNTAX, 'Case Ignore List', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.12': ('2.16.840.1.113719.1.1.5.1.12', OID_LDAP_SYNTAX, 'Tagged Data', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.13': ('2.16.840.1.113719.1.1.5.1.13', OID_LDAP_SYNTAX, 'Octet List', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.14': ('2.16.840.1.113719.1.1.5.1.14', OID_LDAP_SYNTAX, 'Tagged String', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.15': ('2.16.840.1.113719.1.1.5.1.15', OID_LDAP_SYNTAX, 'Tagged Name And String', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.16': ('2.16.840.1.113719.1.1.5.1.16', OID_LDAP_SYNTAX, 'NDS Replica Pointer', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.17': ('2.16.840.1.113719.1.1.5.1.17', OID_LDAP_SYNTAX, 'NDS ACL', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.19': ('2.16.840.1.113719.1.1.5.1.19', OID_LDAP_SYNTAX, 'NDS Timestamp', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.22': ('2.16.840.1.113719.1.1.5.1.22', OID_LDAP_SYNTAX, 'Counter', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.23': ('2.16.840.1.113719.1.1.5.1.23', OID_LDAP_SYNTAX, 'Tagged Name', 'NOVELL'), + '2.16.840.1.113719.1.1.5.1.25': ('2.16.840.1.113719.1.1.5.1.25', OID_LDAP_SYNTAX, 'Typed Name', 'NOVELL'), + + # ldap url extensions + + # matching rules + '1.2.36.79672281.1.13.2': ('1.2.36.79672281.1.13.2', OID_MATCHING_RULE, 'componentFilterMatch', 'RFC3687'), + '1.2.36.79672281.1.13.3': ('1.2.36.79672281.1.13.3', OID_MATCHING_RULE, 'rdnMatch', 'RFC3687'), + '1.2.36.79672281.1.13.5': ('1.2.36.79672281.1.13.5', OID_MATCHING_RULE, 'presentMatch', 'RFC3687'), + '1.2.36.79672281.1.13.6': ('1.2.36.79672281.1.13.6', OID_MATCHING_RULE, 'allComponentsMatch', 'RFC3687'), + '1.2.36.79672281.1.13.7': ('1.2.36.79672281.1.13.7', OID_MATCHING_RULE, 'directoryComponentsMatch', 'RFC3687'), + '1.2.840.113556.1.4.803': ('1.2.840.113556.1.4.803', OID_MATCHING_RULE, 'Bit AND', 'MICROSOFT'), + '1.2.840.113556.1.4.804': ('1.2.840.113556.1.4.804', OID_MATCHING_RULE, 'Bit OR', 'MICROSOFT'), + '1.2.840.113556.1.4.1941': ('1.2.840.113556.1.4.1941', OID_MATCHING_RULE, 'Transitive Evaluation', 'MICROSOFT'), + '1.2.840.113556.1.4.2253': ('1.2.840.113556.1.4.2253', OID_MATCHING_RULE, 'DN with data', 'MICROSOFT'), + '1.3.6.1.1.16.2': ('1.3.6.1.1.16.2', OID_MATCHING_RULE, 'uuidMatch', 'RFC4530'), + '1.3.6.1.1.16.3': ('1.3.6.1.1.16.3', OID_MATCHING_RULE, 'uuidOrderingMatch', 'RFC4530'), + '1.3.6.1.4.1.1466.109.114.1': ('1.3.6.1.4.1.1466.109.114.1', OID_MATCHING_RULE, 'caseExactIA5Match', 'RFC4517'), + '1.3.6.1.4.1.1466.109.114.2': ('1.3.6.1.4.1.1466.109.114.2', OID_MATCHING_RULE, 'caseIgnoreIA5Match', 'RFC4517'), + '1.3.6.1.4.1.1466.109.114.3': ('1.3.6.1.4.1.1466.109.114.3', OID_MATCHING_RULE, 'caseIgnoreIA5SubstringsMatch', 'RFC4517'), + '2.5.13.0': ('2.5.13.0', OID_MATCHING_RULE, 'objectIdentifierMatch', 'RFC4517'), + '2.5.13.1': ('2.5.13.1', OID_MATCHING_RULE, 'distinguishedNameMatch', 'RFC4517'), + '2.5.13.2': ('2.5.13.2', OID_MATCHING_RULE, 'caseIgnoreMatch', 'RFC4517'), + '2.5.13.3': ('2.5.13.3', OID_MATCHING_RULE, 'caseIgnoreOrderingMatch', 'RFC4517'), + '2.5.13.4': ('2.5.13.4', OID_MATCHING_RULE, 'caseIgnoreSubstringsMatch', 'RFC4517'), + '2.5.13.5': ('2.5.13.5', OID_MATCHING_RULE, 'caseExactMatch', 'RFC4517'), + '2.5.13.6': ('2.5.13.6', OID_MATCHING_RULE, 'caseExactOrderingMatch', 'RFC4517'), + '2.5.13.7': ('2.5.13.7', OID_MATCHING_RULE, 'caseExactSubstringsMatch', 'RFC4517'), + '2.5.13.8': ('2.5.13.8', OID_MATCHING_RULE, 'numericStringMatch', 'RFC4517'), + '2.5.13.9': ('2.5.13.9', OID_MATCHING_RULE, 'numericStringOrderingMatch', 'RFC4517'), + '2.5.13.10': ('2.5.13.10', OID_MATCHING_RULE, 'numericStringSubstringsMatch', 'RFC4517'), + '2.5.13.11': ('2.5.13.11', OID_MATCHING_RULE, 'caseIgnoreListMatch', 'RFC4517'), + '2.5.13.12': ('2.5.13.12', OID_MATCHING_RULE, 'caseIgnoreListSubstringsMatch', 'RFC4517'), + '2.5.13.13': ('2.5.13.13', OID_MATCHING_RULE, 'booleanMatch', 'RFC4517'), + '2.5.13.14': ('2.5.13.14', OID_MATCHING_RULE, 'integerMatch', 'RFC4517'), + '2.5.13.15': ('2.5.13.15', OID_MATCHING_RULE, 'integerOrderingMatch', 'RFC4517'), + '2.5.13.16': ('2.5.13.16', OID_MATCHING_RULE, 'bitStringMatch', 'RFC4517'), + '2.5.13.17': ('2.5.13.17', OID_MATCHING_RULE, 'octetStringMatch', 'RFC4517'), + '2.5.13.18': ('2.5.13.18', OID_MATCHING_RULE, 'octetStringOrderingMatch', 'RFC4517'), + '2.5.13.20': ('2.5.13.20', OID_MATCHING_RULE, 'telephoneNumberMatch', 'RFC4517'), + '2.5.13.21': ('2.5.13.21', OID_MATCHING_RULE, 'telephoneNumberSubstringsMatch', 'RFC4517'), + '2.5.13.22': ('2.5.13.22', OID_MATCHING_RULE, 'presentationAddressMatch', 'RFC2252'), + '2.5.13.23': ('2.5.13.23', OID_MATCHING_RULE, 'uniqueMemberMatch', 'RFC4517'), + '2.5.13.24': ('2.5.13.24', OID_MATCHING_RULE, 'protocolInformationMatch', 'RFC2252'), + '2.5.13.27': ('2.5.13.27', OID_MATCHING_RULE, 'generalizedTimeMatch', 'RFC4517'), + '2.5.13.28': ('2.5.13.28', OID_MATCHING_RULE, 'generalizedTimeOrderingMatch', 'RFC4517'), + '2.5.13.29': ('2.5.13.29', OID_MATCHING_RULE, 'integerFirstComponentMatch', 'RFC4517'), + '2.5.13.30': ('2.5.13.30', OID_MATCHING_RULE, 'objectIdentifierFirstComponentMatch', 'RFC4517'), + '2.5.13.31': ('2.5.13.31', OID_MATCHING_RULE, 'directoryStringFirstComponentMatch', 'RFC4517'), + '2.5.13.32': ('2.5.13.32', OID_MATCHING_RULE, 'wordMatch', 'RFC4517'), + '2.5.13.33': ('2.5.13.33', OID_MATCHING_RULE, 'keywordMatch', 'RFC4517'), + '2.5.13.34': ('2.5.13.34', OID_MATCHING_RULE, 'certificateExactMatch', 'RFC4523'), + '2.5.13.35': ('2.5.13.35', OID_MATCHING_RULE, 'certificateMatch', 'RFC4523'), + '2.5.13.36': ('2.5.13.36', OID_MATCHING_RULE, 'certificatePairExactMatch', 'RFC4523'), + '2.5.13.37': ('2.5.13.37', OID_MATCHING_RULE, 'certificatePairMatch', 'RFC4523'), + '2.5.13.38': ('2.5.13.38', OID_MATCHING_RULE, 'certificateListExactMatch', 'RFC4523'), + '2.5.13.39': ('2.5.13.39', OID_MATCHING_RULE, 'certificateListMatch', 'RFC4523'), + '2.5.13.40': ('2.5.13.40', OID_MATCHING_RULE, 'algorithmIdentifierMatch', 'RFC4523'), + '2.5.13.41': ('2.5.13.41', OID_MATCHING_RULE, 'storedPrefixMatch', 'RFC3698'), + + # name forms + '1.3.6.1.1.10.15.1': ('1.3.6.1.1.10.15.1', OID_NAME_FORM, 'uddiBusinessEntityNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.2': ('1.3.6.1.1.10.15.2', OID_NAME_FORM, 'uddiContactNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.3': ('1.3.6.1.1.10.15.3', OID_NAME_FORM, 'uddiAddressNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.4': ('1.3.6.1.1.10.15.4', OID_NAME_FORM, 'uddiBusinessServiceNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.5': ('1.3.6.1.1.10.15.5', OID_NAME_FORM, 'uddiBindingTemplateNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.6': ('1.3.6.1.1.10.15.6', OID_NAME_FORM, 'uddiTModelInstanceInfoNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.7': ('1.3.6.1.1.10.15.7', OID_NAME_FORM, 'uddiTModelNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.8': ('1.3.6.1.1.10.15.8', OID_NAME_FORM, 'uddiPublisherAssertionNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.9': ('1.3.6.1.1.10.15.9', OID_NAME_FORM, 'uddiv3SubscriptionNameForm', 'RFC4403'), + '1.3.6.1.1.10.15.10': ('1.3.6.1.1.10.15.10', OID_NAME_FORM, 'uddiv3EntityObituaryNameForm', 'RFC4403'), + '1.3.6.1.4.1.1466.345': ('1.3.6.1.4.1.1466.345', OID_NAME_FORM, 'domainNameForm', 'RFC2247'), + + # object classes + '0.9.2342.19200300.100.4.3': ('0.9.2342.19200300.100.4.3', OID_OBJECT_CLASS, 'pilotObject', 'RFC1274'), + '0.9.2342.19200300.100.4.4': ('0.9.2342.19200300.100.4.4', OID_OBJECT_CLASS, 'pilotPerson', 'RFC1274'), + '0.9.2342.19200300.100.4.5': ('0.9.2342.19200300.100.4.5', OID_OBJECT_CLASS, 'account', 'RFC4524'), + '0.9.2342.19200300.100.4.6': ('0.9.2342.19200300.100.4.6', OID_OBJECT_CLASS, 'document', 'RFC4524'), + '0.9.2342.19200300.100.4.7': ('0.9.2342.19200300.100.4.7', OID_OBJECT_CLASS, 'room', 'RFC4524'), + '0.9.2342.19200300.100.4.8': ('0.9.2342.19200300.100.4.8', OID_OBJECT_CLASS, 'documentSeries', 'RFC4524'), + '0.9.2342.19200300.100.4.13': ('0.9.2342.19200300.100.4.13', OID_OBJECT_CLASS, 'domain', 'RFC4524'), + '0.9.2342.19200300.100.4.14': ('0.9.2342.19200300.100.4.14', OID_OBJECT_CLASS, 'RFC822LocalPart', 'RFC4524'), + '0.9.2342.19200300.100.4.15': ('0.9.2342.19200300.100.4.15', OID_OBJECT_CLASS, 'dNSDomain', 'RFC1274'), + '0.9.2342.19200300.100.4.17': ('0.9.2342.19200300.100.4.17', OID_OBJECT_CLASS, 'domainRelatedObject', 'RFC4524'), + '0.9.2342.19200300.100.4.18': ('0.9.2342.19200300.100.4.18', OID_OBJECT_CLASS, 'friendlyCountry', 'RFC4524'), + '0.9.2342.19200300.100.4.19': ('0.9.2342.19200300.100.4.19', OID_OBJECT_CLASS, 'simpleSecurityObject', 'RFC4524'), + '0.9.2342.19200300.100.4.20': ('0.9.2342.19200300.100.4.20', OID_OBJECT_CLASS, 'pilotOrganization', 'RFC1274'), + '0.9.2342.19200300.100.4.21': ('0.9.2342.19200300.100.4.21', OID_OBJECT_CLASS, 'pilotDSA', 'RFC1274'), + '0.9.2342.19200300.100.4.22': ('0.9.2342.19200300.100.4.22', OID_OBJECT_CLASS, 'qualityLabelledData', 'RFC1274'), + '1.2.840.113556.1.5.87': ('1.2.840.113556.1.5.87', OID_OBJECT_CLASS, 'calEntry', 'RFC2739'), + '1.3.18.0.2.6.253': ('1.3.18.0.2.6.253', OID_OBJECT_CLASS, 'printerLPR', 'RFC3712'), + '1.3.18.0.2.6.254': ('1.3.18.0.2.6.254', OID_OBJECT_CLASS, 'slpServicePrinter', 'RFC3712'), + '1.3.18.0.2.6.255': ('1.3.18.0.2.6.255', OID_OBJECT_CLASS, 'printerService', 'RFC3712'), + '1.3.18.0.2.6.256': ('1.3.18.0.2.6.256', OID_OBJECT_CLASS, 'printerIPP', 'RFC3712'), + '1.3.18.0.2.6.257': ('1.3.18.0.2.6.257', OID_OBJECT_CLASS, 'printerServiceAuxClass', 'RFC3712'), + '1.3.18.0.2.6.258': ('1.3.18.0.2.6.258', OID_OBJECT_CLASS, 'printerAbstract', 'RFC3712'), + '1.3.6.1.1.10.6.1': ('1.3.6.1.1.10.6.1', OID_OBJECT_CLASS, 'uddiBusinessEntity', 'RFC4403'), + '1.3.6.1.1.10.6.2': ('1.3.6.1.1.10.6.2', OID_OBJECT_CLASS, 'uddiContact', 'RFC4403'), + '1.3.6.1.1.10.6.3': ('1.3.6.1.1.10.6.3', OID_OBJECT_CLASS, 'uddiAddress', 'RFC4403'), + '1.3.6.1.1.10.6.4': ('1.3.6.1.1.10.6.4', OID_OBJECT_CLASS, 'uddiBusinessService', 'RFC4403'), + '1.3.6.1.1.10.6.5': ('1.3.6.1.1.10.6.5', OID_OBJECT_CLASS, 'uddiBindingTemplate', 'RFC4403'), + '1.3.6.1.1.10.6.6': ('1.3.6.1.1.10.6.6', OID_OBJECT_CLASS, 'uddiTModelInstanceInfo', 'RFC4403'), + '1.3.6.1.1.10.6.7': ('1.3.6.1.1.10.6.7', OID_OBJECT_CLASS, 'uddiTModel', 'RFC4403'), + '1.3.6.1.1.10.6.8': ('1.3.6.1.1.10.6.8', OID_OBJECT_CLASS, 'uddiPublisherAssertion', 'RFC4403'), + '1.3.6.1.1.10.6.9': ('1.3.6.1.1.10.6.9', OID_OBJECT_CLASS, 'uddiv3Subscription', 'RFC4403'), + '1.3.6.1.1.10.6.10': ('1.3.6.1.1.10.6.10', OID_OBJECT_CLASS, 'uddiv3EntityObituary', 'RFC4403'), + '1.3.6.1.1.11.1.1': ('1.3.6.1.1.11.1.1', OID_OBJECT_CLASS, 'vPIMUser', 'RFC4237'), + '1.3.6.1.1.3.1': ('1.3.6.1.1.3.1', OID_OBJECT_CLASS, 'uidObject', 'RFC4519'), + '1.3.6.1.1.6.1.1': ('1.3.6.1.1.6.1.1', OID_OBJECT_CLASS, 'pcimPolicy', 'RFC3703'), + '1.3.6.1.1.6.1.2': ('1.3.6.1.1.6.1.2', OID_OBJECT_CLASS, 'pcimGroup', 'RFC3703'), + '1.3.6.1.1.6.1.3': ('1.3.6.1.1.6.1.3', OID_OBJECT_CLASS, 'pcimGroupAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.4': ('1.3.6.1.1.6.1.4', OID_OBJECT_CLASS, 'pcimGroupInstance', 'RFC3703'), + '1.3.6.1.1.6.1.5': ('1.3.6.1.1.6.1.5', OID_OBJECT_CLASS, 'pcimRule', 'RFC3703'), + '1.3.6.1.1.6.1.6': ('1.3.6.1.1.6.1.6', OID_OBJECT_CLASS, 'pcimRuleAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.7': ('1.3.6.1.1.6.1.7', OID_OBJECT_CLASS, 'pcimRuleInstance', 'RFC3703'), + '1.3.6.1.1.6.1.8': ('1.3.6.1.1.6.1.8', OID_OBJECT_CLASS, 'pcimRuleConditionAssociation', 'RFC3703'), + '1.3.6.1.1.6.1.9': ('1.3.6.1.1.6.1.9', OID_OBJECT_CLASS, 'pcimRuleValidityAssociation', 'RFC3703'), + '1.3.6.1.1.6.1.10': ('1.3.6.1.1.6.1.10', OID_OBJECT_CLASS, 'pcimRuleActionAssociation', 'RFC3703'), + '1.3.6.1.1.6.1.11': ('1.3.6.1.1.6.1.11', OID_OBJECT_CLASS, 'pcimConditionAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.12': ('1.3.6.1.1.6.1.12', OID_OBJECT_CLASS, 'pcimTPCAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.13': ('1.3.6.1.1.6.1.13', OID_OBJECT_CLASS, 'pcimConditionVendorAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.14': ('1.3.6.1.1.6.1.14', OID_OBJECT_CLASS, 'pcimActionAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.15': ('1.3.6.1.1.6.1.15', OID_OBJECT_CLASS, 'pcimActionVendorAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.16': ('1.3.6.1.1.6.1.16', OID_OBJECT_CLASS, 'pcimPolicyInstance', 'RFC3703'), + '1.3.6.1.1.6.1.17': ('1.3.6.1.1.6.1.17', OID_OBJECT_CLASS, 'pcimElementAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.18': ('1.3.6.1.1.6.1.18', OID_OBJECT_CLASS, 'pcimRepository', 'RFC3703'), + '1.3.6.1.1.6.1.19': ('1.3.6.1.1.6.1.19', OID_OBJECT_CLASS, 'pcimRepositoryAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.20': ('1.3.6.1.1.6.1.20', OID_OBJECT_CLASS, 'pcimRepositoryInstance', 'RFC3703'), + '1.3.6.1.1.6.1.21': ('1.3.6.1.1.6.1.21', OID_OBJECT_CLASS, 'pcimSubtreesPtrAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.22': ('1.3.6.1.1.6.1.22', OID_OBJECT_CLASS, 'pcimGroupContainmentAuxClass', 'RFC3703'), + '1.3.6.1.1.6.1.23': ('1.3.6.1.1.6.1.23', OID_OBJECT_CLASS, 'pcimRuleContainmentAuxClass', 'RFC3703'), + '1.3.6.1.1.9.1.1': ('1.3.6.1.1.9.1.1', OID_OBJECT_CLASS, 'pcelsPolicySet', 'RFC4104'), + '1.3.6.1.1.9.1.2': ('1.3.6.1.1.9.1.2', OID_OBJECT_CLASS, 'pcelsPolicySetAssociation', 'RFC4104'), + '1.3.6.1.1.9.1.3': ('1.3.6.1.1.9.1.3', OID_OBJECT_CLASS, 'pcelsGroup', 'RFC4104'), + '1.3.6.1.1.9.1.4': ('1.3.6.1.1.9.1.4', OID_OBJECT_CLASS, 'pcelsGroupAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.5': ('1.3.6.1.1.9.1.5', OID_OBJECT_CLASS, 'pcelsGroupInstance', 'RFC4104'), + '1.3.6.1.1.9.1.6': ('1.3.6.1.1.9.1.6', OID_OBJECT_CLASS, 'pcelsRule', 'RFC4104'), + '1.3.6.1.1.9.1.7': ('1.3.6.1.1.9.1.7', OID_OBJECT_CLASS, 'pcelsRuleAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.8': ('1.3.6.1.1.9.1.8', OID_OBJECT_CLASS, 'pcelsRuleInstance', 'RFC4104'), + '1.3.6.1.1.9.1.9': ('1.3.6.1.1.9.1.9', OID_OBJECT_CLASS, 'pcelsConditionAssociation', 'RFC4104'), + '1.3.6.1.1.9.1.10': ('1.3.6.1.1.9.1.10', OID_OBJECT_CLASS, 'pcelsActionAssociation', 'RFC4104'), + '1.3.6.1.1.9.1.11': ('1.3.6.1.1.9.1.11', OID_OBJECT_CLASS, 'pcelsSimpleConditionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.12': ('1.3.6.1.1.9.1.12', OID_OBJECT_CLASS, 'pcelsCompoundConditionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.13': ('1.3.6.1.1.9.1.13', OID_OBJECT_CLASS, 'pcelsCompoundFilterConditionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.14': ('1.3.6.1.1.9.1.14', OID_OBJECT_CLASS, 'pcelsSimpleActionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.15': ('1.3.6.1.1.9.1.15', OID_OBJECT_CLASS, 'pcelsCompoundActionAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.16': ('1.3.6.1.1.9.1.16', OID_OBJECT_CLASS, 'pcelsVariable', 'RFC4104'), + '1.3.6.1.1.9.1.17': ('1.3.6.1.1.9.1.17', OID_OBJECT_CLASS, 'pcelsExplicitVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.18': ('1.3.6.1.1.9.1.18', OID_OBJECT_CLASS, 'pcelsImplicitVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.19': ('1.3.6.1.1.9.1.19', OID_OBJECT_CLASS, 'pcelsSourceIPv4VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.20': ('1.3.6.1.1.9.1.20', OID_OBJECT_CLASS, 'pcelsSourceIPv6VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.21': ('1.3.6.1.1.9.1.21', OID_OBJECT_CLASS, 'pcelsDestinationIPv4VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.22': ('1.3.6.1.1.9.1.22', OID_OBJECT_CLASS, 'pcelsDestinationIPv6VariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.23': ('1.3.6.1.1.9.1.23', OID_OBJECT_CLASS, 'pcelsSourcePortVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.24': ('1.3.6.1.1.9.1.24', OID_OBJECT_CLASS, 'pcelsDestinationPortVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.25': ('1.3.6.1.1.9.1.25', OID_OBJECT_CLASS, 'pcelsIPProtocolVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.26': ('1.3.6.1.1.9.1.26', OID_OBJECT_CLASS, 'pcelsIPVersionVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.27': ('1.3.6.1.1.9.1.27', OID_OBJECT_CLASS, 'pcelsIPToSVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.28': ('1.3.6.1.1.9.1.28', OID_OBJECT_CLASS, 'pcelsDSCPVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.29': ('1.3.6.1.1.9.1.29', OID_OBJECT_CLASS, 'pcelsFlowIdVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.30': ('1.3.6.1.1.9.1.30', OID_OBJECT_CLASS, 'pcelsSourceMACVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.31': ('1.3.6.1.1.9.1.31', OID_OBJECT_CLASS, 'pcelsDestinationMACVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.32': ('1.3.6.1.1.9.1.32', OID_OBJECT_CLASS, 'pcelsVLANVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.33': ('1.3.6.1.1.9.1.33', OID_OBJECT_CLASS, 'pcelsCoSVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.34': ('1.3.6.1.1.9.1.34', OID_OBJECT_CLASS, 'pcelsEthertypeVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.35': ('1.3.6.1.1.9.1.35', OID_OBJECT_CLASS, 'pcelsSourceSAPVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.36': ('1.3.6.1.1.9.1.36', OID_OBJECT_CLASS, 'pcelsDestinationSAPVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.37': ('1.3.6.1.1.9.1.37', OID_OBJECT_CLASS, 'pcelsSNAPOUIVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.38': ('1.3.6.1.1.9.1.38', OID_OBJECT_CLASS, 'pcelsSNAPTypeVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.39': ('1.3.6.1.1.9.1.39', OID_OBJECT_CLASS, 'pcelsFlowDirectionVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.40': ('1.3.6.1.1.9.1.40', OID_OBJECT_CLASS, 'pcelsValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.41': ('1.3.6.1.1.9.1.41', OID_OBJECT_CLASS, 'pcelsIPv4AddrValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.42': ('1.3.6.1.1.9.1.42', OID_OBJECT_CLASS, 'pcelsIPv6AddrValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.43': ('1.3.6.1.1.9.1.43', OID_OBJECT_CLASS, 'pcelsMACAddrValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.44': ('1.3.6.1.1.9.1.44', OID_OBJECT_CLASS, 'pcelsStringValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.45': ('1.3.6.1.1.9.1.45', OID_OBJECT_CLASS, 'pcelsBitStringValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.46': ('1.3.6.1.1.9.1.46', OID_OBJECT_CLASS, 'pcelsIntegerValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.47': ('1.3.6.1.1.9.1.47', OID_OBJECT_CLASS, 'pcelsBooleanValueAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.48': ('1.3.6.1.1.9.1.48', OID_OBJECT_CLASS, 'pcelsReusableContainer', 'RFC4104'), + '1.3.6.1.1.9.1.49': ('1.3.6.1.1.9.1.49', OID_OBJECT_CLASS, 'pcelsReusableContainerAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.50': ('1.3.6.1.1.9.1.50', OID_OBJECT_CLASS, 'pcelsReusableContainerInstance', 'RFC4104'), + '1.3.6.1.1.9.1.51': ('1.3.6.1.1.9.1.51', OID_OBJECT_CLASS, 'pcelsRoleCollection', 'RFC4104'), + '1.3.6.1.1.9.1.52': ('1.3.6.1.1.9.1.52', OID_OBJECT_CLASS, 'pcelsFilterEntryBase', 'RFC4104'), + '1.3.6.1.1.9.1.53': ('1.3.6.1.1.9.1.53', OID_OBJECT_CLASS, 'pcelsIPHeadersFilter', 'RFC4104'), + '1.3.6.1.1.9.1.54': ('1.3.6.1.1.9.1.54', OID_OBJECT_CLASS, 'pcels8021Filter', 'RFC4104'), + '1.3.6.1.1.9.1.55': ('1.3.6.1.1.9.1.55', OID_OBJECT_CLASS, 'pcelsFilterListAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.56': ('1.3.6.1.1.9.1.56', OID_OBJECT_CLASS, 'pcelsVendorVariableAuxClass', 'RFC4104'), + '1.3.6.1.1.9.1.57': ('1.3.6.1.1.9.1.57', OID_OBJECT_CLASS, 'pcelsVendorValueAuxClass', 'RFC4104'), + '1.3.6.1.4.1.11.1.3.1.2.5': ('1.3.6.1.4.1.11.1.3.1.2.5', OID_OBJECT_CLASS, 'DUAConfigProfile', 'RFC4876'), + '1.3.6.1.4.1.1466.101.119.2': ('1.3.6.1.4.1.1466.101.119.2', OID_OBJECT_CLASS, 'dynamicObject', 'RFC2589'), + '1.3.6.1.4.1.1466.101.120.111': ('1.3.6.1.4.1.1466.101.120.111', OID_OBJECT_CLASS, 'extensibleObject', 'RFC4512'), + '1.3.6.1.4.1.1466.344': ('1.3.6.1.4.1.1466.344', OID_OBJECT_CLASS, 'dcObject', 'RFC4519'), + '1.3.6.1.4.1.16572.2.1.1': ('1.3.6.1.4.1.16572.2.1.1', OID_OBJECT_CLASS, 'LDIFLocationURLObject', 'RFC6109'), + '1.3.6.1.4.1.16572.2.1.2': ('1.3.6.1.4.1.16572.2.1.2', OID_OBJECT_CLASS, 'provider', 'RFC6109'), + '1.3.6.1.4.1.250.3.15': ('1.3.6.1.4.1.250.3.15', OID_OBJECT_CLASS, 'labeledURIObject', 'RFC2079'), + '1.3.6.1.4.1.31103.1.1001': ('1.3.6.1.4.1.31103.1.1001', OID_OBJECT_CLASS, 'fedfsNsdbContainerInfo', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.1002': ('1.3.6.1.4.1.31103.1.1002', OID_OBJECT_CLASS, 'fedfsFsn', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.1003': ('1.3.6.1.4.1.31103.1.1003', OID_OBJECT_CLASS, 'fedfsFsl', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.31103.1.1004': ('1.3.6.1.4.1.31103.1.1004', OID_OBJECT_CLASS, 'fedfsNfsFsl', 'RFC-ietf-nfsv4-federated-fs-protocol-15'), + '1.3.6.1.4.1.453.7.1.1': ('1.3.6.1.4.1.453.7.1.1', OID_OBJECT_CLASS, ['rFC822ToX400Mapping', 'subtree'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.2': ('1.3.6.1.4.1.453.7.1.2', OID_OBJECT_CLASS, ['x400ToRFC822Mapping', 'table'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.3': ('1.3.6.1.4.1.453.7.1.3', OID_OBJECT_CLASS, ['omittedORAddressComponent', 'tableEntry'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.4': ('1.3.6.1.4.1.453.7.1.4', OID_OBJECT_CLASS, ['mixerGateway', 'textTableEntry'], 'RFC2164-RFC2293'), + '1.3.6.1.4.1.453.7.1.5': ('1.3.6.1.4.1.453.7.1.5', OID_OBJECT_CLASS, 'distinguishedNameTableEntry', 'RFC2293'), + '2.16.840.1.113730.3.2.6': ('2.16.840.1.113730.3.2.6', OID_OBJECT_CLASS, 'referral', 'RFC3296'), + '2.5.17.0': ('2.5.17.0', OID_OBJECT_CLASS, 'subentry', 'RFC3672'), + '2.5.20.1': ('2.5.20.1', OID_OBJECT_CLASS, 'subschema', 'RFC4512'), + '2.5.20.2': ('2.5.20.2', OID_OBJECT_CLASS, 'collectiveAttributeSubentry', 'RFC3671'), + '2.5.6.0': ('2.5.6.0', OID_OBJECT_CLASS, 'top', 'RFC4512'), + '2.5.6.1': ('2.5.6.1', OID_OBJECT_CLASS, 'alias', 'RFC4512'), + '2.5.6.2': ('2.5.6.2', OID_OBJECT_CLASS, 'country', 'RFC4519'), + '2.5.6.3': ('2.5.6.3', OID_OBJECT_CLASS, 'locality', 'RFC4519'), + '2.5.6.4': ('2.5.6.4', OID_OBJECT_CLASS, 'organization', 'RFC4519'), + '2.5.6.5': ('2.5.6.5', OID_OBJECT_CLASS, 'organizationalUnit', 'RFC4519'), + '2.5.6.6': ('2.5.6.6', OID_OBJECT_CLASS, 'person', 'RFC4519'), + '2.5.6.7': ('2.5.6.7', OID_OBJECT_CLASS, 'organizationalPerson', 'RFC4519'), + '2.5.6.8': ('2.5.6.8', OID_OBJECT_CLASS, 'organizationalRole', 'RFC4519'), + '2.5.6.9': ('2.5.6.9', OID_OBJECT_CLASS, 'groupOfNames', 'RFC4519'), + '2.5.6.10': ('2.5.6.10', OID_OBJECT_CLASS, 'residentialPerson', 'RFC4519'), + '2.5.6.11': ('2.5.6.11', OID_OBJECT_CLASS, 'applicationProcess', 'RFC4519'), + '2.5.6.12': ('2.5.6.12', OID_OBJECT_CLASS, 'applicationEntity', 'RFC2256'), + '2.5.6.13': ('2.5.6.13', OID_OBJECT_CLASS, 'dSA', 'RFC2256'), + '2.5.6.14': ('2.5.6.14', OID_OBJECT_CLASS, 'device', 'RFC4519'), + '2.5.6.15': ('2.5.6.15', OID_OBJECT_CLASS, 'strongAuthenticationUser', 'RFC4523'), + '2.5.6.16': ('2.5.6.16', OID_OBJECT_CLASS, 'certificationAuthority', 'RFC4523'), + '2.5.6.16.2': ('2.5.6.16.2', OID_OBJECT_CLASS, 'certificationAuthority-V2', 'RFC4523'), + '2.5.6.17': ('2.5.6.17', OID_OBJECT_CLASS, 'groupOfUniqueNames', 'RFC4519'), + '2.5.6.18': ('2.5.6.18', OID_OBJECT_CLASS, 'userSecurityInformation', 'RFC4523'), + '2.5.6.19': ('2.5.6.19', OID_OBJECT_CLASS, 'cRLDistributionPoint', 'RFC4523'), + '2.5.6.20': ('2.5.6.20', OID_OBJECT_CLASS, 'dmd', 'RFC2256'), + '2.5.6.21': ('2.5.6.21', OID_OBJECT_CLASS, 'pkiUser', 'RFC4523'), + '2.5.6.22': ('2.5.6.22', OID_OBJECT_CLASS, 'pkiCA', 'RFC4523'), + '2.5.6.23': ('2.5.6.23', OID_OBJECT_CLASS, 'deltaCRL', 'RFC4523'), + + # unsolicited notices + '1.3.6.1.1.21.4': ('1.3.6.1.1.21.4', OID_UNSOLICITED_NOTICE, 'Aborted Transaction Notice', 'RFC5805'), '1.3.6.1.4.1.1466.20036': ('1.3.6.1.4.1.1466.20036', OID_UNSOLICITED_NOTICE, 'Notice of Disconnection', 'RFC4511')} diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/persistentSearch.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/persistentSearch.py new file mode 100644 index 0000000..cb79aa2 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/persistentSearch.py @@ -0,0 +1,85 @@ +""" +""" + +# Created on 2016.07.09 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.namedtype import NamedTypes, NamedType, OptionalNamedType +from pyasn1.type.namedval import NamedValues +from pyasn1.type.univ import Sequence, Integer, Boolean, Enumerated +from .rfc4511 import LDAPDN +from .controls import build_control + + +class PersistentSearchControl(Sequence): + # PersistentSearch ::= SEQUENCE { + # changeTypes INTEGER, + # changesOnly BOOLEAN, + # returnECs BOOLEAN + # } + + componentType = NamedTypes(NamedType('changeTypes', Integer()), + NamedType('changesOnly', Boolean()), + NamedType('returnECs', Boolean()) + ) + + +class ChangeType(Enumerated): + # changeType ENUMERATED { + # add (1), + # delete (2), + # modify (4), + # modDN (8) + # } + + namedValues = NamedValues(('add', 1), + ('delete', 2), + ('modify', 4), + ('modDN', 8)) + + +class EntryChangeNotificationControl(Sequence): + # EntryChangeNotification ::= SEQUENCE { + # changeType ENUMERATED { + # add (1), + # delete (2), + # modify (4), + # modDN (8) + # }, + # previousDN LDAPDN OPTIONAL, -- modifyDN ops. only + # changeNumber INTEGER OPTIONAL -- if supported + # } + + # tagSet = TagSet() + # tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassUniversal, tagFormatConstructed, 16)) + componentType = NamedTypes(NamedType('changeType', ChangeType()), + OptionalNamedType('previousDN', LDAPDN()), + OptionalNamedType('changeNumber', Integer()) + ) + + +def persistent_search_control(change_types, changes_only=True, return_ecs=True, criticality=False): + control_value = PersistentSearchControl() + control_value.setComponentByName('changeTypes', Integer(change_types)) + control_value.setComponentByName('changesOnly', Boolean(changes_only)) + control_value.setComponentByName('returnECs', Boolean(return_ecs)) + return build_control('2.16.840.1.113730.3.4.3', criticality, control_value) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2696.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2696.py new file mode 100644 index 0000000..66b647b --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2696.py @@ -0,0 +1,70 @@ +""" +""" + +# Created on 2013.10.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString, Integer, Sequence +from pyasn1.type.namedtype import NamedTypes, NamedType +from pyasn1.type.constraint import ValueRangeConstraint +from .controls import build_control + +# constants +# maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- + +MAXINT = Integer(2147483647) + +# constraints +rangeInt0ToMaxConstraint = ValueRangeConstraint(0, MAXINT) + + +class Integer0ToMax(Integer): + subtypeSpec = Integer.subtypeSpec + rangeInt0ToMaxConstraint + + +class Size(Integer0ToMax): + # Size INTEGER (0..maxInt) + pass + + +class Cookie(OctetString): + # cookie OCTET STRING + pass + + +class RealSearchControlValue(Sequence): + # realSearchControlValue ::= SEQUENCE { + # size INTEGER (0..maxInt), + # -- requested page size from client + # -- result set size estimate from server + # cookie OCTET STRING + + componentType = NamedTypes(NamedType('size', Size()), + NamedType('cookie', Cookie())) + + +def paged_search_control(criticality=False, size=10, cookie=None): + control_value = RealSearchControlValue() + control_value.setComponentByName('size', Size(size)) + control_value.setComponentByName('cookie', Cookie(cookie if cookie else '')) + + return build_control('1.2.840.113556.1.4.319', criticality, control_value) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2849.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2849.py new file mode 100644 index 0000000..01d7e05 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc2849.py @@ -0,0 +1,295 @@ +""" +""" + +# Created on 2013.12.08 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from base64 import b64encode +from datetime import datetime + +from .. import STRING_TYPES +from ..core.exceptions import LDAPLDIFError, LDAPExtensionError +from ..protocol.persistentSearch import EntryChangeNotificationControl +from ..utils.asn1 import decoder +from ..utils.config import get_config_parameter + +# LDIF converter RFC 2849 compliant + +conf_ldif_line_length = get_config_parameter('LDIF_LINE_LENGTH') + + +def safe_ldif_string(bytes_value): + if not bytes_value: + return True + + # check SAFE-INIT-CHAR: < 127, not NUL, LF, CR, SPACE, COLON, LESS-THAN + if bytes_value[0] > 127 or bytes_value[0] in [0, 10, 13, 32, 58, 60]: + return False + + # check SAFE-CHAR: < 127 not NUL, LF, CR + if 0 in bytes_value or 10 in bytes_value or 13 in bytes_value: + return False + + # check last char for SPACE + if bytes_value[-1] == 32: + return False + + for byte in bytes_value: + if byte > 127: + return False + + return True + + +def _convert_to_ldif(descriptor, value, base64): + if not value: + value = '' + if isinstance(value, STRING_TYPES): + value = bytearray(value, encoding='utf-8') + + if base64 or not safe_ldif_string(value): + try: + encoded = b64encode(value) + except TypeError: + encoded = b64encode(str(value)) # patch for Python 2.6 + if not isinstance(encoded, str): # in Python 3 b64encode returns bytes in Python 2 returns str + encoded = str(encoded, encoding='ascii') # Python 3 + line = descriptor + ':: ' + encoded + else: + if str is not bytes: # Python 3 + value = str(value, encoding='ascii') + else: # Python 2 + value = str(value) + line = descriptor + ': ' + value + + return line + + +def add_controls(controls, all_base64): + lines = [] + if controls: + for control in controls: + line = 'control: ' + control[0] + line += ' ' + ('true' if control[1] else 'false') + if control[2]: + lines.append(_convert_to_ldif(line, control[2], all_base64)) + + return lines + + +def add_attributes(attributes, all_base64): + lines = [] + oc_attr = None + # objectclass first, even if this is not specified in the RFC + for attr in attributes: + if attr.lower() == 'objectclass': + for val in attributes[attr]: + lines.append(_convert_to_ldif(attr, val, all_base64)) + oc_attr = attr + break + + # remaining attributes + for attr in attributes: + if attr != oc_attr and attr in attributes: + for val in attributes[attr]: + lines.append(_convert_to_ldif(attr, val, all_base64)) + + return lines + + +def sort_ldif_lines(lines, sort_order): + # sort lines as per custom sort_order + # sort order is a list of descriptors, lines will be sorted following the same sequence + return sorted(lines, key=lambda x: ldif_sort(x, sort_order)) if sort_order else lines + + +def search_response_to_ldif(entries, all_base64, sort_order=None): + lines = [] + if entries: + for entry in entries: + if not entry or entry['type'] != 'searchResEntry': + continue + if 'dn' in entry: + lines.append(_convert_to_ldif('dn', entry['dn'], all_base64)) + lines.extend(add_attributes(entry['raw_attributes'], all_base64)) + else: + raise LDAPLDIFError('unable to convert to LDIF-CONTENT - missing DN') + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + lines.append('') + + if lines: + lines.append('# total number of entries: ' + str(len(entries))) + + return lines + + +def add_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: add') + lines.extend(add_attributes(entry['attributes'], all_base64)) + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + + else: + raise LDAPLDIFError('unable to convert to LDIF-CHANGE-ADD - missing DN ') + + return lines + + +def delete_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: delete') + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + else: + raise LDAPLDIFError('unable to convert to LDIF-CHANGE-DELETE - missing DN ') + + return lines + + +def modify_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: modify') + if 'changes' in entry: + for change in entry['changes']: + lines.append(['add', 'delete', 'replace', 'increment'][change['operation']] + ': ' + change['attribute']['type']) + for value in change['attribute']['value']: + lines.append(_convert_to_ldif(change['attribute']['type'], value, all_base64)) + lines.append('-') + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + return lines + + +def modify_dn_request_to_ldif(entry, all_base64, sort_order=None): + lines = [] + if 'entry' in entry: + lines.append(_convert_to_ldif('dn', entry['entry'], all_base64)) + control_lines = add_controls(entry['controls'], all_base64) + if control_lines: + lines.extend(control_lines) + lines.append('changetype: modrdn') if 'newSuperior' in entry and entry['newSuperior'] else lines.append('changetype: moddn') + lines.append(_convert_to_ldif('newrdn', entry['newRdn'], all_base64)) + lines.append('deleteoldrdn: ' + ('1' if entry['deleteOldRdn'] else '0')) + if 'newSuperior' in entry and entry['newSuperior']: + lines.append(_convert_to_ldif('newsuperior', entry['newSuperior'], all_base64)) + if sort_order: + lines = sort_ldif_lines(lines, sort_order) + else: + raise LDAPLDIFError('unable to convert to LDIF-CHANGE-MODDN - missing DN ') + + return lines + + +def operation_to_ldif(operation_type, entries, all_base64=False, sort_order=None): + if operation_type == 'searchResponse': + lines = search_response_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'addRequest': + lines = add_request_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'delRequest': + lines = delete_request_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'modifyRequest': + lines = modify_request_to_ldif(entries, all_base64, sort_order) + elif operation_type == 'modDNRequest': + lines = modify_dn_request_to_ldif(entries, all_base64, sort_order) + else: + lines = [] + + ldif_record = [] + # check max line length and split as per note 2 of RFC 2849 + for line in lines: + if line: + ldif_record.append(line[0:conf_ldif_line_length]) + ldif_record.extend([' ' + line[i: i + conf_ldif_line_length - 1] for i in range(conf_ldif_line_length, len(line), conf_ldif_line_length - 1)] if len(line) > conf_ldif_line_length else []) + else: + ldif_record.append('') + + return ldif_record + + +def add_ldif_header(ldif_lines): + if ldif_lines: + ldif_lines.insert(0, 'version: 1') + + return ldif_lines + + +def ldif_sort(line, sort_order): + for i, descriptor in enumerate(sort_order): + + if line and line.startswith(descriptor): + return i + + return len(sort_order) + 1 + + +def decode_persistent_search_control(change): + if 'controls' in change and '2.16.840.1.113730.3.4.7' in change['controls']: + decoded = dict() + decoded_control, unprocessed = decoder.decode(change['controls']['2.16.840.1.113730.3.4.7']['value'], asn1Spec=EntryChangeNotificationControl()) + if unprocessed: + raise LDAPExtensionError('unprocessed value in EntryChangeNotificationControl') + if decoded_control['changeType'] == 1: # add + decoded['changeType'] = 'add' + elif decoded_control['changeType'] == 2: # delete + decoded['changeType'] = 'delete' + elif decoded_control['changeType'] == 4: # modify + decoded['changeType'] = 'modify' + elif decoded_control['changeType'] == 8: # modify_dn + decoded['changeType'] = 'modify dn' + else: + raise LDAPExtensionError('unknown Persistent Search changeType ' + str(decoded_control['changeType'])) + decoded['changeNumber'] = decoded_control['changeNumber'] if 'changeNumber' in decoded_control and decoded_control['changeNumber'] is not None and decoded_control['changeNumber'].hasValue() else None + decoded['previousDN'] = decoded_control['previousDN'] if 'previousDN' in decoded_control and decoded_control['previousDN'] is not None and decoded_control['previousDN'].hasValue() else None + return decoded + + return None + + +def persistent_search_response_to_ldif(change): + ldif_lines = ['# ' + datetime.now().isoformat()] + control = decode_persistent_search_control(change) + if control: + if control['changeNumber']: + ldif_lines.append('# change number: ' + str(control['changeNumber'])) + ldif_lines.append(control['changeType']) + if control['previousDN']: + ldif_lines.append('# previous dn: ' + str(control['previousDN'])) + ldif_lines += operation_to_ldif('searchResponse', [change]) + + return ldif_lines[:-1] # removes "total number of entries" diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc3062.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc3062.py new file mode 100644 index 0000000..c720984 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc3062.py @@ -0,0 +1,91 @@ +""" +""" + +# Created on 2014.04.28 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from pyasn1.type.univ import OctetString, Sequence +from pyasn1.type.namedtype import NamedTypes, OptionalNamedType +from pyasn1.type.tag import Tag, tagClassContext, tagFormatSimple + +# Modify password extended operation +# passwdModifyOID OBJECT IDENTIFIER ::= 1.3.6.1.4.1.4203.1.11.1 +# PasswdModifyRequestValue ::= SEQUENCE { +# userIdentity [0] OCTET STRING OPTIONAL +# oldPasswd [1] OCTET STRING OPTIONAL +# newPasswd [2] OCTET STRING OPTIONAL } +# +# PasswdModifyResponseValue ::= SEQUENCE { +# genPasswd [0] OCTET STRING OPTIONAL } + + +class UserIdentity(OctetString): + """ + userIdentity [0] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + encoding = 'utf-8' + + +class OldPasswd(OctetString): + """ + oldPasswd [1] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + encoding = 'utf-8' + + +class NewPasswd(OctetString): + """ + newPasswd [2] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 2)) + encoding = 'utf-8' + + +class GenPasswd(OctetString): + """ + newPasswd [2] OCTET STRING OPTIONAL + """ + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + encoding = 'utf-8' + + +class PasswdModifyRequestValue(Sequence): + """ + PasswdModifyRequestValue ::= SEQUENCE { + userIdentity [0] OCTET STRING OPTIONAL + oldPasswd [1] OCTET STRING OPTIONAL + newPasswd [2] OCTET STRING OPTIONAL } + """ + componentType = NamedTypes(OptionalNamedType('userIdentity', UserIdentity()), + OptionalNamedType('oldPasswd', OldPasswd()), + OptionalNamedType('newPasswd', NewPasswd())) + + +class PasswdModifyResponseValue(Sequence): + """ + PasswdModifyResponseValue ::= SEQUENCE { + genPasswd [0] OCTET STRING OPTIONAL } + """ + + componentType = NamedTypes(OptionalNamedType('genPasswd', GenPasswd())) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4511.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4511.py new file mode 100644 index 0000000..07f67be --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4511.py @@ -0,0 +1,1007 @@ +""" +""" + +# Created on 2013.05.15 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +####################### +# ldap ASN.1 Definition +# from RFC4511 - Appendix B +# extended with result codes from IANA ldap-parameters as of 2013.08.21 +# extended with modify_increment from RFC4525 + +######################################################### +# Lightweight-Directory-Access-Protocol-V3 {1 3 6 1 1 18} +# -- Copyright (C) The Internet Society (2006). This version of +# -- this ASN.1 module is part of RFC 4511; see the RFC itself +# -- for full legal notices. +# DEFINITIONS +# IMPLICIT TAGS +# EXTENSIBILITY IMPLIED + +from pyasn1.type.univ import OctetString, Integer, Sequence, Choice, SequenceOf, Boolean, Null, Enumerated, SetOf +from pyasn1.type.namedtype import NamedTypes, NamedType, OptionalNamedType, DefaultedNamedType +from pyasn1.type.constraint import ValueRangeConstraint, SingleValueConstraint, ValueSizeConstraint +from pyasn1.type.namedval import NamedValues +from pyasn1.type.tag import tagClassApplication, tagFormatConstructed, Tag, tagClassContext, tagFormatSimple + + +# constants +# maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- +LDAP_MAX_INT = 2147483647 +MAXINT = Integer(LDAP_MAX_INT) + +# constraints +rangeInt0ToMaxConstraint = ValueRangeConstraint(0, MAXINT) +rangeInt1To127Constraint = ValueRangeConstraint(1, 127) +size1ToMaxConstraint = ValueSizeConstraint(1, MAXINT) +responseValueConstraint = SingleValueConstraint(0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 32, 33, 34, 36, 48, 49, 50, 51, 52, 53, 54, 64, 65, 66, 67, 68, 69, 71, 80, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 4096) + +# custom constraints +numericOIDConstraint = None # TODO +distinguishedNameConstraint = None # TODO +nameComponentConstraint = None # TODO +attributeDescriptionConstraint = None # TODO +uriConstraint = None # TODO +attributeSelectorConstraint = None # TODO + + +class Integer0ToMax(Integer): + subtypeSpec = Integer.subtypeSpec + rangeInt0ToMaxConstraint + + +class LDAPString(OctetString): + # LDAPString ::= OCTET STRING -- UTF-8 encoded, -- [ISO10646] characters + encoding = 'utf-8' + + +class MessageID(Integer0ToMax): + # MessageID ::= INTEGER (0 .. maxInt) + pass + + +class LDAPOID(OctetString): + # LDAPOID ::= OCTET STRING -- Constrained to + # -- [RFC4512] + + # subtypeSpec = numericOIDConstraint + pass + + +class LDAPDN(LDAPString): + # LDAPDN ::= LDAPString -- Constrained to + # -- [RFC4514] + + # subtypeSpec = distinguishedName + pass + + +class RelativeLDAPDN(LDAPString): + # RelativeLDAPDN ::= LDAPString -- Constrained to + # -- [RFC4514] + + # subtypeSpec = LDAPString.subtypeSpec + nameComponentConstraint + pass + + +class AttributeDescription(LDAPString): + # AttributeDescription ::= LDAPString -- Constrained to + # -- [RFC4512] + + # subtypeSpec = LDAPString.subtypeSpec + attributeDescriptionConstraint + pass + + +class AttributeValue(OctetString): + # AttributeValue ::= OCTET STRING + encoding = 'utf-8' + + +class AssertionValue(OctetString): + # AssertionValue ::= OCTET STRING + encoding = 'utf-8' + + +class AttributeValueAssertion(Sequence): + # AttributeValueAssertion ::= SEQUENCE { + # attributeDesc AttributeDescription, + # assertionValue AssertionValue } + componentType = NamedTypes(NamedType('attributeDesc', AttributeDescription()), + NamedType('assertionValue', AssertionValue())) + + +class MatchingRuleId(LDAPString): + # MatchingRuleId ::= LDAPString + pass + + +class Vals(SetOf): + # vals SET OF value AttributeValue } + componentType = AttributeValue() + + +class ValsAtLeast1(SetOf): + # vals SET OF value AttributeValue } + componentType = AttributeValue() + subtypeSpec = SetOf.subtypeSpec + size1ToMaxConstraint + + +class PartialAttribute(Sequence): + # PartialAttribute ::= SEQUENCE { + # type AttributeDescription, + # vals SET OF value AttributeValue } + componentType = NamedTypes(NamedType('type', AttributeDescription()), + NamedType('vals', Vals())) + + +class Attribute(Sequence): + # Attribute ::= PartialAttribute(WITH COMPONENTS { + # ..., + # vals (SIZE(1..MAX))}) + componentType = NamedTypes(NamedType('type', AttributeDescription()), + # NamedType('vals', ValsAtLeast1())) + NamedType('vals', Vals())) # changed from ValsAtLeast1() to allow empty member values in groups - this should not be as per rfc4511 4.1.7, but openldap accept it + + +class AttributeList(SequenceOf): + # AttributeList ::= SEQUENCE OF attribute Attribute + componentType = Attribute() + + +class Simple(OctetString): + # simple [0] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + encoding = 'utf-8' + + +class Credentials(OctetString): + # credentials OCTET STRING + encoding = 'utf-8' + + +class SaslCredentials(Sequence): + # SaslCredentials ::= SEQUENCE { + # mechanism LDAPString, + # credentials OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + componentType = NamedTypes(NamedType('mechanism', LDAPString()), + OptionalNamedType('credentials', Credentials())) + + +# not in RFC4511 but used by Microsoft to embed the NTLM protocol in the BindRequest (Sicily Protocol) +class SicilyPackageDiscovery(OctetString): + # sicilyPackageDiscovery [9] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 9)) + encoding = 'utf-8' + + +# not in RFC4511 but used by Microsoft to embed the NTLM protocol in the BindRequest (Sicily Protocol) +class SicilyNegotiate(OctetString): + # sicilyNegotiate [10] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 10)) + encoding = 'utf-8' + + +# not in RFC4511 but used by Microsoft to embed the NTLM protocol in the BindRequest (Sicily Protocol) +class SicilyResponse(OctetString): + # sicilyResponse [11] OCTET STRING, + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 11)) + encoding = 'utf-8' + + +class AuthenticationChoice(Choice): + # AuthenticationChoice ::= CHOICE { + # simple [0] OCTET STRING, + # -- 1 and 2 reserved + # sasl [3] SaslCredentials, + # ... } + + # from https://msdn.microsoft.com/en-us/library/cc223498.aspx # legacy NTLM authentication for Windows Active Directory + # sicilyPackageDiscovery [9] OCTET STRING + # sicilyNegotiate [10] OCTET STRING + # sicilyResponse [11] OCTET STRING } + + componentType = NamedTypes(NamedType('simple', Simple()), + NamedType('sasl', SaslCredentials()), + NamedType('sicilyPackageDiscovery', SicilyPackageDiscovery()), + NamedType('sicilyNegotiate', SicilyNegotiate()), + NamedType('sicilyResponse', SicilyResponse()), + ) + + +class Version(Integer): + # version INTEGER (1 .. 127), + subtypeSpec = Integer.subtypeSpec + rangeInt1To127Constraint + + +class ResultCode(Enumerated): + # resultCode ENUMERATED { + # success (0), + # operationsError (1), + # protocolError (2), + # timeLimitExceeded (3), + # sizeLimitExceeded (4), + # compareFalse (5), + # compareTrue (6), + # authMethodNotSupported (7), + # strongerAuthRequired (8), + # -- 9 reserved -- + # referral (10), + # adminLimitExceeded (11), + # unavailableCriticalExtension (12), + # confidentialityRequired (13), + # saslBindInProgress (14), + # noSuchAttribute (16), + # undefinedAttributeType (17), + # inappropriateMatching (18), + # constraintViolation (19), + # attributeOrValueExists (20), + # invalidAttributeSyntax (21), + # -- 22-31 unused -- + # noSuchObject (32), + # aliasProblem (33), + # invalidDNSyntax (34), + # -- 35 reserved for undefined isLeaf -- + # aliasDereferencingProblem (36), + # -- 37-47 unused -- + # inappropriateAuthentication (48), + # invalidCredentials (49), + # insufficientAccessRights (50), + # busy (51), + # unavailable (52), + # unwillingToPerform (53), + # loopDetect (54), + # -- 55-63 unused -- + # namingViolation (64), + # objectClassViolation (65), + # notAllowedOnNonLeaf (66), + # notAllowedOnRDN (67), + # entryAlreadyExists (68), + # objectClassModsProhibited (69), + # -- 70 reserved for CLDAP -- + # affectsMultipleDSAs (71), + # -- 72-79 unused -- + # other (80), + # ... } + # + # from IANA ldap-parameters: + # lcupResourcesExhausted 113 IESG [RFC3928] + # lcupSecurityViolation 114 IESG [RFC3928] + # lcupInvalidData 115 IESG [RFC3928] + # lcupUnsupportedScheme 116 IESG [RFC3928] + # lcupReloadRequired 117 IESG [RFC3928] + # canceled 118 IESG [RFC3909] + # noSuchOperation 119 IESG [RFC3909] + # tooLate 120 IESG [RFC3909] + # cannotCancel 121 IESG [RFC3909] + # assertionFailed 122 IESG [RFC4528] + # authorizationDenied 123 WELTMAN [RFC4370] + # e-syncRefreshRequired 4096 [Kurt_Zeilenga] [Jong_Hyuk_Choi] [RFC4533] + namedValues = NamedValues(('success', 0), + ('operationsError', 1), + ('protocolError', 2), + ('timeLimitExceeded', 3), + ('sizeLimitExceeded', 4), + ('compareFalse', 5), + ('compareTrue', 6), + ('authMethodNotSupported', 7), + ('strongerAuthRequired', 8), + ('referral', 10), + ('adminLimitExceeded', 11), + ('unavailableCriticalExtension', 12), + ('confidentialityRequired', 13), + ('saslBindInProgress', 14), + ('noSuchAttribute', 16), + ('undefinedAttributeType', 17), + ('inappropriateMatching', 18), + ('constraintViolation', 19), + ('attributeOrValueExists', 20), + ('invalidAttributeSyntax', 21), + ('noSuchObject', 32), + ('aliasProblem', 33), + ('invalidDNSyntax', 34), + ('aliasDereferencingProblem', 36), + ('inappropriateAuthentication', 48), + ('invalidCredentials', 49), + ('insufficientAccessRights', 50), + ('busy', 51), + ('unavailable', 52), + ('unwillingToPerform', 53), + ('loopDetected', 54), + ('namingViolation', 64), + ('objectClassViolation', 65), + ('notAllowedOnNonLeaf', 66), + ('notAllowedOnRDN', 67), + ('entryAlreadyExists', 68), + ('objectClassModsProhibited', 69), + ('affectMultipleDSAs', 71), + ('other', 80), + ('lcupResourcesExhausted', 113), + ('lcupSecurityViolation', 114), + ('lcupInvalidData', 115), + ('lcupUnsupportedScheme', 116), + ('lcupReloadRequired', 117), + ('canceled', 118), + ('noSuchOperation', 119), + ('tooLate', 120), + ('cannotCancel', 121), + ('assertionFailed', 122), + ('authorizationDenied', 123), + ('e-syncRefreshRequired', 4096)) + + subTypeSpec = Enumerated.subtypeSpec + responseValueConstraint + + +class URI(LDAPString): + # URI ::= LDAPString -- limited to characters permitted in + # -- URIs + + # subtypeSpec = LDAPString.subTypeSpec + uriConstrain + pass + + +class Referral(SequenceOf): + # Referral ::= SEQUENCE SIZE (1..MAX) OF uri URI + tagSet = SequenceOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + componentType = URI() + + +class ServerSaslCreds(OctetString): + # serverSaslCreds [7] OCTET STRING OPTIONAL + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 7)) + encoding = 'utf-8' + + +class LDAPResult(Sequence): + # LDAPResult ::= SEQUENCE { + # resultCode ENUMERATED { + # success (0), + # operationsError (1), + # protocolError (2), + # timeLimitExceeded (3), + # sizeLimitExceeded (4), + # compareFalse (5), + # compareTrue (6), + # authMethodNotSupported (7), + # strongerAuthRequired (8), + # -- 9 reserved -- + # referral (10), + # adminLimitExceeded (11), + # unavailableCriticalExtension (12), + # confidentialityRequired (13), + # saslBindInProgress (14), + # noSuchAttribute (16), + # undefinedAttributeType (17), + # inappropriateMatching (18), + # constraintViolation (19), + # attributeOrValueExists (20), + # invalidAttributeSyntax (21), + # -- 22-31 unused -- + # noSuchObject (32), + # aliasProblem (33), + # invalidDNSyntax (34), + # -- 35 reserved for undefined isLeaf -- + # aliasDereferencingProblem (36), + # -- 37-47 unused -- + # inappropriateAuthentication (48), + # invalidCredentials (49), + # insufficientAccessRights (50), + # busy (51), + # unavailable (52), + # unwillingToPerform (53), + # loopDetect (54), + # -- 55-63 unused -- + # namingViolation (64), + # objectClassViolation (65), + # notAllowedOnNonLeaf (66), + # notAllowedOnRDN (67), + # entryAlreadyExists (68), + # objectClassModsProhibited (69), + # -- 70 reserved for CLDAP -- + # affectsMultipleDSAs (71), + # -- 72-79 unused -- + # other (80), + # ... }, + # matchedDN LDAPDN, + # diagnosticMessage LDAPString, + # referral [3] Referral OPTIONAL } + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('matchedDN', LDAPDN()), + NamedType('diagnosticMessage', LDAPString()), + OptionalNamedType('referral', Referral())) + + +class Criticality(Boolean): + # criticality BOOLEAN DEFAULT FALSE + defaultValue = False + + +class ControlValue(OctetString): + # controlValue OCTET STRING + encoding = 'utf-8' + + +class Control(Sequence): + # Control ::= SEQUENCE { + # controlType LDAPOID, + # criticality BOOLEAN DEFAULT FALSE, + # controlValue OCTET STRING OPTIONAL } + componentType = NamedTypes(NamedType('controlType', LDAPOID()), + DefaultedNamedType('criticality', Criticality()), + OptionalNamedType('controlValue', ControlValue())) + + +class Controls(SequenceOf): + # Controls ::= SEQUENCE OF control Control + tagSet = SequenceOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 0)) + componentType = Control() + + +class Scope(Enumerated): + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + namedValues = NamedValues(('baseObject', 0), + ('singleLevel', 1), + ('wholeSubtree', 2)) + + +class DerefAliases(Enumerated): + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + namedValues = NamedValues(('neverDerefAliases', 0), + ('derefInSearching', 1), + ('derefFindingBaseObj', 2), + ('derefAlways', 3)) + + +class TypesOnly(Boolean): + # typesOnly BOOLEAN + pass + + +class Selector(LDAPString): + # -- The LDAPString is constrained to + # -- in Section 4.5.1.8 + + # subtypeSpec = LDAPString.subtypeSpec + attributeSelectorConstraint + pass + + +class AttributeSelection(SequenceOf): + # AttributeSelection ::= SEQUENCE OF selector LDAPString + # -- The LDAPString is constrained to + # -- in Section 4.5.1.8 + componentType = Selector() + + +class MatchingRule(MatchingRuleId): + # matchingRule [1] MatchingRuleId + tagSet = MatchingRuleId.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + + +class Type(AttributeDescription): + # type [2] AttributeDescription + tagSet = AttributeDescription.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 2)) + + +class MatchValue(AssertionValue): + # matchValue [3] AssertionValue, + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 3)) + + +class DnAttributes(Boolean): + # dnAttributes [4] BOOLEAN DEFAULT FALSE } + tagSet = Boolean.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 4)) + defaultValue = Boolean(False) + + +class MatchingRuleAssertion(Sequence): + # MatchingRuleAssertion ::= SEQUENCE { + # matchingRule [1] MatchingRuleId OPTIONAL, + # type [2] AttributeDescription OPTIONAL, + # matchValue [3] AssertionValue, + # dnAttributes [4] BOOLEAN DEFAULT FALSE } + componentType = NamedTypes(OptionalNamedType('matchingRule', MatchingRule()), + OptionalNamedType('type', Type()), + NamedType('matchValue', MatchValue()), + DefaultedNamedType('dnAttributes', DnAttributes())) + + +class Initial(AssertionValue): + # initial [0] AssertionValue, -- can occur at most once + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class Any(AssertionValue): + # any [1] AssertionValue, + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + + +class Final(AssertionValue): + # final [1] AssertionValue, -- can occur at most once + tagSet = AssertionValue.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 2)) + + +class Substring(Choice): + # substring CHOICE { + # initial [0] AssertionValue, -- can occur at most once + # any [1] AssertionValue, + # final [2] AssertionValue } -- can occur at most once + # } + componentType = NamedTypes(NamedType('initial', Initial()), + NamedType('any', Any()), + NamedType('final', Final())) + + +class Substrings(SequenceOf): + # substrings SEQUENCE SIZE (1..MAX) OF substring CHOICE { + # ... + # } + subtypeSpec = SequenceOf.subtypeSpec + size1ToMaxConstraint + componentType = Substring() + + +class SubstringFilter(Sequence): + # SubstringFilter ::= SEQUENCE { + # type AttributeDescription, + # substrings SEQUENCE SIZE (1..MAX) OF substring CHOICE { + # initial [0] AssertionValue, -- can occur at most once + # any [1] AssertionValue, + # final [2] AssertionValue } -- can occur at most once + # } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 4)) + componentType = NamedTypes(NamedType('type', AttributeDescription()), + NamedType('substrings', Substrings())) + + +class And(SetOf): + # and [0] SET SIZE (1..MAX) OF filter Filter + tagSet = SetOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 0)) + subtypeSpec = SetOf.subtypeSpec + size1ToMaxConstraint + + +class Or(SetOf): + # or [1] SET SIZE (1..MAX) OF filter Filter + tagSet = SetOf.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 1)) + subtypeSpec = SetOf.subtypeSpec + size1ToMaxConstraint + + +class Not(Choice): + # not [2] Filter + pass # defined after Filter definition to allow recursion + + +class EqualityMatch(AttributeValueAssertion): + # equalityMatch [3] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 3)) + + +class GreaterOrEqual(AttributeValueAssertion): + # greaterOrEqual [5] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 5)) + + +class LessOrEqual(AttributeValueAssertion): + # lessOrEqual [6] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 6)) + + +class Present(AttributeDescription): + # present [7] AttributeDescription + tagSet = AttributeDescription.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 7)) + + +class ApproxMatch(AttributeValueAssertion): + # approxMatch [8] AttributeValueAssertion + tagSet = AttributeValueAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 8)) + + +class ExtensibleMatch(MatchingRuleAssertion): + # extensibleMatch [9] MatchingRuleAssertion + tagSet = MatchingRuleAssertion.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatConstructed, 9)) + + +class Filter(Choice): + # Filter ::= CHOICE { + # and [0] SET SIZE (1..MAX) OF filter Filter, + # or [1] SET SIZE (1..MAX) OF filter Filter, + # not [2] Filter, + # equalityMatch [3] AttributeValueAssertion, + # substrings [4] SubstringFilter, + # greaterOrEqual [5] AttributeValueAssertion, + # lessOrEqual [6] AttributeValueAssertion, + # present [7] AttributeDescription, + # approxMatch [8] AttributeValueAssertion, + # extensibleMatch [9] MatchingRuleAssertion, + # ... } + componentType = NamedTypes(NamedType('and', And()), + NamedType('or', Or()), + NamedType('notFilter', Not()), + NamedType('equalityMatch', EqualityMatch()), + NamedType('substringFilter', SubstringFilter()), + NamedType('greaterOrEqual', GreaterOrEqual()), + NamedType('lessOrEqual', LessOrEqual()), + NamedType('present', Present()), + NamedType('approxMatch', ApproxMatch()), + NamedType('extensibleMatch', ExtensibleMatch())) + + +And.componentType = Filter() +Or.componentType = Filter() +Not.componentType = NamedTypes(NamedType('innerNotFilter', Filter())) +Not.tagSet = Filter.tagSet.tagExplicitly(Tag(tagClassContext, tagFormatConstructed, 2)) # as per RFC4511 page 23 + + +class PartialAttributeList(SequenceOf): + # PartialAttributeList ::= SEQUENCE OF + # partialAttribute PartialAttribute + componentType = PartialAttribute() + + +class Operation(Enumerated): + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... } + namedValues = NamedValues(('add', 0), + ('delete', 1), + ('replace', 2), + ('increment', 3)) + + +class Change(Sequence): + # change SEQUENCE { + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... }, + # modification PartialAttribute } } + componentType = NamedTypes(NamedType('operation', Operation()), + NamedType('modification', PartialAttribute())) + + +class Changes(SequenceOf): + # changes SEQUENCE OF change SEQUENCE + componentType = Change() + + +class DeleteOldRDN(Boolean): + # deleteoldrdn BOOLEAN + pass + + +class NewSuperior(LDAPDN): + # newSuperior [0] LDAPDN + tagSet = LDAPDN.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class RequestName(LDAPOID): + # requestName [0] LDAPOID + tagSet = LDAPOID.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class RequestValue(OctetString): + # requestValue [1] OCTET STRING + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + encoding = 'utf-8' + + +class ResponseName(LDAPOID): + # responseName [10] LDAPOID + tagSet = LDAPOID.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 10)) + + +class ResponseValue(OctetString): + # responseValue [11] OCTET STRING + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 11)) + encoding = 'utf-8' + + +class IntermediateResponseName(LDAPOID): + # responseName [0] LDAPOID + tagSet = LDAPOID.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 0)) + + +class IntermediateResponseValue(OctetString): + # responseValue [1] OCTET STRING + tagSet = OctetString.tagSet.tagImplicitly(Tag(tagClassContext, tagFormatSimple, 1)) + encoding = 'utf-8' + + +# operations +class BindRequest(Sequence): + # BindRequest ::= [APPLICATION 0] SEQUENCE { + # version INTEGER (1 .. 127), + # name LDAPDN, + # authentication AuthenticationChoice } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 0)) + componentType = NamedTypes(NamedType('version', Version()), + NamedType('name', LDAPDN()), + NamedType('authentication', AuthenticationChoice())) + + +class BindResponse(Sequence): + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 1)) + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('matchedDN', LDAPDN()), + NamedType('diagnosticMessage', LDAPString()), + OptionalNamedType('referral', Referral()), + OptionalNamedType('serverSaslCreds', ServerSaslCreds())) + + +class UnbindRequest(Null): + # UnbindRequest ::= [APPLICATION 2] NULL + tagSet = Null.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatSimple, 2)) + + +class SearchRequest(Sequence): + # SearchRequest ::= [APPLICATION 3] SEQUENCE { + # baseObject LDAPDN, + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + # ... }, + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + # sizeLimit INTEGER (0 .. maxInt), + # timeLimit INTEGER (0 .. maxInt), + # typesOnly BOOLEAN, + # filter Filter, + # attributes AttributeSelection } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 3)) + componentType = NamedTypes(NamedType('baseObject', LDAPDN()), + NamedType('scope', Scope()), + NamedType('derefAliases', DerefAliases()), + NamedType('sizeLimit', Integer0ToMax()), + NamedType('timeLimit', Integer0ToMax()), + NamedType('typesOnly', TypesOnly()), + NamedType('filter', Filter()), + NamedType('attributes', AttributeSelection())) + + +class SearchResultReference(SequenceOf): + # SearchResultReference ::= [APPLICATION 19] SEQUENCE + # SIZE (1..MAX) OF uri URI + tagSet = SequenceOf.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 19)) + subtypeSpec = SequenceOf.subtypeSpec + size1ToMaxConstraint + componentType = URI() + + +class SearchResultEntry(Sequence): + # SearchResultEntry ::= [APPLICATION 4] SEQUENCE { + # objectName LDAPDN, + # attributes PartialAttributeList } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 4)) + componentType = NamedTypes(NamedType('object', LDAPDN()), + NamedType('attributes', PartialAttributeList())) + + +class SearchResultDone(LDAPResult): + # SearchResultDone ::= [APPLICATION 5] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 5)) + + +class ModifyRequest(Sequence): + # ModifyRequest ::= [APPLICATION 6] SEQUENCE { + # object LDAPDN, + # changes SEQUENCE OF change SEQUENCE { + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... }, + # modification PartialAttribute } } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 6)) + componentType = NamedTypes(NamedType('object', LDAPDN()), + NamedType('changes', Changes())) + + +class ModifyResponse(LDAPResult): + # ModifyResponse ::= [APPLICATION 7] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 7)) + + +class AddRequest(Sequence): + # AddRequest ::= [APPLICATION 8] SEQUENCE { + # entry LDAPDN, + # attributes AttributeList } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 8)) + componentType = NamedTypes(NamedType('entry', LDAPDN()), + NamedType('attributes', AttributeList())) + + +class AddResponse(LDAPResult): + # AddResponse ::= [APPLICATION 9] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 9)) + + +class DelRequest(LDAPDN): + # DelRequest ::= [APPLICATION 10] LDAPDN + tagSet = LDAPDN.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatSimple, 10)) + + +class DelResponse(LDAPResult): + # DelResponse ::= [APPLICATION 11] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 11)) + + +class ModifyDNRequest(Sequence): + # ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { + # entry LDAPDN, + # newrdn RelativeLDAPDN, + # deleteoldrdn BOOLEAN, + # newSuperior [0] LDAPDN OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 12)) + componentType = NamedTypes(NamedType('entry', LDAPDN()), + NamedType('newrdn', RelativeLDAPDN()), + NamedType('deleteoldrdn', DeleteOldRDN()), + OptionalNamedType('newSuperior', NewSuperior())) + + +class ModifyDNResponse(LDAPResult): + # ModifyDNResponse ::= [APPLICATION 13] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 13)) + + +class CompareRequest(Sequence): + # CompareRequest ::= [APPLICATION 14] SEQUENCE { + # entry LDAPDN, + # ava AttributeValueAssertion } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 14)) + componentType = NamedTypes(NamedType('entry', LDAPDN()), + NamedType('ava', AttributeValueAssertion())) + + +class CompareResponse(LDAPResult): + # CompareResponse ::= [APPLICATION 15] LDAPResult + tagSet = LDAPResult.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 15)) + + +class AbandonRequest(MessageID): + # AbandonRequest ::= [APPLICATION 16] MessageID + tagSet = MessageID.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatSimple, 16)) + + +class ExtendedRequest(Sequence): + # ExtendedRequest ::= [APPLICATION 23] SEQUENCE { + # requestName [0] LDAPOID, + # requestValue [1] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 23)) + componentType = NamedTypes(NamedType('requestName', RequestName()), + OptionalNamedType('requestValue', RequestValue())) + + +class ExtendedResponse(Sequence): + # ExtendedResponse ::= [APPLICATION 24] SEQUENCE { + # COMPONENTS OF LDAPResult, + # responseName [10] LDAPOID OPTIONAL, + # responseValue [11] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 24)) + componentType = NamedTypes(NamedType('resultCode', ResultCode()), + NamedType('matchedDN', LDAPDN()), + NamedType('diagnosticMessage', LDAPString()), + OptionalNamedType('referral', Referral()), + OptionalNamedType('responseName', ResponseName()), + OptionalNamedType('responseValue', ResponseValue())) + + +class IntermediateResponse(Sequence): + # IntermediateResponse ::= [APPLICATION 25] SEQUENCE { + # responseName [0] LDAPOID OPTIONAL, + # responseValue [1] OCTET STRING OPTIONAL } + tagSet = Sequence.tagSet.tagImplicitly(Tag(tagClassApplication, tagFormatConstructed, 25)) + componentType = NamedTypes(OptionalNamedType('responseName', IntermediateResponseName()), + OptionalNamedType('responseValue', IntermediateResponseValue())) + + +class ProtocolOp(Choice): + # protocolOp CHOICE { + # bindRequest BindRequest, + # bindResponse BindResponse, + # unbindRequest UnbindRequest, + # searchRequest SearchRequest, + # searchResEntry SearchResultEntry, + # searchResDone SearchResultDone, + # searchResRef SearchResultReference, + # modifyRequest ModifyRequest, + # modifyResponse ModifyResponse, + # addRequest AddRequest, + # addResponse AddResponse, + # delRequest DelRequest, + # delResponse DelResponse, + # modDNRequest ModifyDNRequest, + # modDNResponse ModifyDNResponse, + # compareRequest CompareRequest, + # compareResponse CompareResponse, + # abandonRequest AbandonRequest, + # extendedReq ExtendedRequest, + # extendedResp ExtendedResponse, + # ..., + # intermediateResponse IntermediateResponse } + componentType = NamedTypes(NamedType('bindRequest', BindRequest()), + NamedType('bindResponse', BindResponse()), + NamedType('unbindRequest', UnbindRequest()), + NamedType('searchRequest', SearchRequest()), + NamedType('searchResEntry', SearchResultEntry()), + NamedType('searchResDone', SearchResultDone()), + NamedType('searchResRef', SearchResultReference()), + NamedType('modifyRequest', ModifyRequest()), + NamedType('modifyResponse', ModifyResponse()), + NamedType('addRequest', AddRequest()), + NamedType('addResponse', AddResponse()), + NamedType('delRequest', DelRequest()), + NamedType('delResponse', DelResponse()), + NamedType('modDNRequest', ModifyDNRequest()), + NamedType('modDNResponse', ModifyDNResponse()), + NamedType('compareRequest', CompareRequest()), + NamedType('compareResponse', CompareResponse()), + NamedType('abandonRequest', AbandonRequest()), + NamedType('extendedReq', ExtendedRequest()), + NamedType('extendedResp', ExtendedResponse()), + NamedType('intermediateResponse', IntermediateResponse())) + + +class LDAPMessage(Sequence): + # LDAPMessage ::= SEQUENCE { + # messageID MessageID, + # protocolOp CHOICE { + # bindRequest BindRequest, + # bindResponse BindResponse, + # unbindRequest UnbindRequest, + # searchRequest SearchRequest, + # searchResEntry SearchResultEntry, + # searchResDone SearchResultDone, + # searchResRef SearchResultReference, + # modifyRequest ModifyRequest, + # modifyResponse ModifyResponse, + # addRequest AddRequest, + # addResponse AddResponse, + # delRequest DelRequest, + # delResponse DelResponse, + # modDNRequest ModifyDNRequest, + # modDNResponse ModifyDNResponse, + # compareRequest CompareRequest, + # compareResponse CompareResponse, + # abandonRequest AbandonRequest, + # extendedReq ExtendedRequest, + # extendedResp ExtendedResponse, + # ..., + # intermediateResponse IntermediateResponse }, + # controls [0] Controls OPTIONAL } + componentType = NamedTypes(NamedType('messageID', MessageID()), + NamedType('protocolOp', ProtocolOp()), + OptionalNamedType('controls', Controls())) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4512.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4512.py new file mode 100644 index 0000000..407b2d1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4512.py @@ -0,0 +1,850 @@ +""" +""" + +# Created on 2013.09.11 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from os import linesep +import re +import json + +from .oid import CLASS_ABSTRACT, CLASS_STRUCTURAL, CLASS_AUXILIARY, ATTRIBUTE_USER_APPLICATION, \ + ATTRIBUTE_DIRECTORY_OPERATION, ATTRIBUTE_DISTRIBUTED_OPERATION, ATTRIBUTE_DSA_OPERATION +from .. import SEQUENCE_TYPES, STRING_TYPES, get_config_parameter +from ..utils.conv import escape_bytes, json_hook, check_json_dict, format_json, to_unicode +from ..utils.ciDict import CaseInsensitiveWithAliasDict +from ..protocol.formatters.standard import format_attribute_values +from .oid import Oids, decode_oids, decode_syntax, oid_to_string +from ..core.exceptions import LDAPSchemaError, LDAPDefinitionError + + +def constant_to_class_kind(value): + if value == CLASS_STRUCTURAL: + return 'Structural' + elif value == CLASS_ABSTRACT: + return 'Abstract' + elif value == CLASS_AUXILIARY: + return 'Auxiliary' + else: + return '' + + +def constant_to_attribute_usage(value): + if value == ATTRIBUTE_USER_APPLICATION: + return 'User Application' + elif value == ATTRIBUTE_DIRECTORY_OPERATION: + return "Directory operation" + elif value == ATTRIBUTE_DISTRIBUTED_OPERATION: + return 'Distributed operation' + elif value == ATTRIBUTE_DSA_OPERATION: + return 'DSA operation' + else: + return 'unknown' + + +def attribute_usage_to_constant(value): + if value == 'userApplications': + return ATTRIBUTE_USER_APPLICATION + elif value == 'directoryOperation': + return ATTRIBUTE_DIRECTORY_OPERATION + elif value == 'distributedOperation': + return ATTRIBUTE_DISTRIBUTED_OPERATION + elif value == 'dSAOperation': + return ATTRIBUTE_DSA_OPERATION + else: + return 'unknown' + + +def quoted_string_to_list(quoted_string): + string = quoted_string.strip() + if not string: + return list() + + if string[0] == '(' and string[-1] == ')': + string = string[1:-1] + elements = string.split("'") + # return [check_escape(element.strip("'").strip()) for element in elements if element.strip()] + return [element.strip("'").strip() for element in elements if element.strip()] + + +def oids_string_to_list(oid_string): + string = oid_string.strip() + if string[0] == '(' and string[-1] == ')': + string = string[1:-1] + elements = string.split('$') + return [element.strip() for element in elements if element.strip()] + + +def extension_to_tuple(extension_string): + string = extension_string.strip() + name, _, values = string.partition(' ') + return name, quoted_string_to_list(values) + + +def list_to_string(list_object): + if not isinstance(list_object, SEQUENCE_TYPES): + return list_object + + r = '' + for element in list_object: + r += (list_to_string(element) if isinstance(element, SEQUENCE_TYPES) else str(element)) + ', ' + + return r[:-2] if r else '' + + +class BaseServerInfo(object): + def __init__(self, raw_attributes): + self.raw = dict(raw_attributes) + + @classmethod + def from_json(cls, json_definition, schema=None, custom_formatter=None): + conf_case_insensitive_schema = get_config_parameter('CASE_INSENSITIVE_SCHEMA_NAMES') + definition = json.loads(json_definition, object_hook=json_hook) + if 'raw' not in definition or 'type' not in definition: + raise LDAPDefinitionError('invalid JSON definition') + + if conf_case_insensitive_schema: + attributes = CaseInsensitiveWithAliasDict() + else: + attributes = dict() + + if schema: + for attribute in definition['raw']: + # attributes[attribute] = format_attribute_values(schema, check_escape(attribute), [check_escape(value) for value in definition['raw'][attribute]], custom_formatter) + attributes[attribute] = format_attribute_values(schema, attribute, [value for value in definition['raw'][attribute]], custom_formatter) + else: + for attribute in definition['raw']: + # attributes[attribute] = [check_escape(value) for value in definition['raw'][attribute]] + attributes[attribute] = [value for value in definition['raw'][attribute]] + + if cls.__name__ != definition['type']: + raise LDAPDefinitionError('JSON info not of type ' + cls.__name__) + + if definition['type'] == 'DsaInfo': + return DsaInfo(attributes, definition['raw']) + elif definition['type'] == 'SchemaInfo': + if 'schema_entry' not in definition: + raise LDAPDefinitionError('invalid schema in JSON') + return SchemaInfo(definition['schema_entry'], attributes, definition['raw']) + + raise LDAPDefinitionError('invalid Info type ' + str(definition['type']) + ' in JSON definition') + + @classmethod + def from_file(cls, target, schema=None, custom_formatter=None): + if isinstance(target, STRING_TYPES): + target = open(target, 'r') + + new = cls.from_json(target.read(), schema=schema, custom_formatter=custom_formatter) + target.close() + return new + + def to_file(self, + target, + indent=4, + sort=True): + if isinstance(target, STRING_TYPES): + target = open(target, 'w+') + + target.writelines(self.to_json(indent=indent, sort=sort)) + target.close() + + def __str__(self): + return self.__repr__() + + def to_json(self, + indent=4, + sort=True): + json_dict = dict() + json_dict['type'] = self.__class__.__name__ + json_dict['raw'] = self.raw + + if isinstance(self, SchemaInfo): + json_dict['schema_entry'] = self.schema_entry + elif isinstance(self, DsaInfo): + pass + else: + raise LDAPDefinitionError('unable to convert ' + str(self) + ' to JSON') + + if str is bytes: # Python 2 + check_json_dict(json_dict) + + return json.dumps(json_dict, ensure_ascii=False, sort_keys=sort, indent=indent, check_circular=True, default=format_json, separators=(',', ': ')) + + +class DsaInfo(BaseServerInfo): + """ + This class contains info about the ldap server (DSA) read from DSE + as defined in RFC4512 and RFC3045. Unknown attributes are stored in the "other" dict + """ + + def __init__(self, attributes, raw_attributes): + BaseServerInfo.__init__(self, raw_attributes) + self.alt_servers = attributes.pop('altServer', None) + self.naming_contexts = attributes.pop('namingContexts', None) + self.supported_controls = decode_oids(attributes.pop('supportedControl', None)) + self.supported_extensions = decode_oids(attributes.pop('supportedExtension', None)) + self.supported_features = decode_oids(attributes.pop('supportedFeatures', None)) + decode_oids(attributes.pop('supportedCapabilities', None)) + self.supported_ldap_versions = attributes.pop('supportedLDAPVersion', None) + self.supported_sasl_mechanisms = attributes.pop('supportedSASLMechanisms', None) + self.vendor_name = attributes.pop('vendorName', None) + self.vendor_version = attributes.pop('vendorVersion', None) + self.schema_entry = attributes.pop('subschemaSubentry', None) + self.other = attributes # remaining schema definition attributes not in RFC4512 + + def __repr__(self): + r = 'DSA info (from DSE):' + linesep + if self.supported_ldap_versions: + if isinstance(self.supported_ldap_versions, SEQUENCE_TYPES): + r += (' Supported LDAP versions: ' + ', '.join([str(s) for s in self.supported_ldap_versions])) if self.supported_ldap_versions else '' + else: + r += (' Supported LDAP versions: ' + str(self.supported_ldap_versions)) + r += linesep + if self.naming_contexts: + if isinstance(self.naming_contexts, SEQUENCE_TYPES): + r += (' Naming contexts: ' + linesep + linesep.join([' ' + str(s) for s in self.naming_contexts])) if self.naming_contexts else '' + else: + r += (' Naming contexts: ' + str(self.naming_contexts)) + r += linesep + if self.alt_servers: + if isinstance(self.alt_servers, SEQUENCE_TYPES): + r += (' Alternative servers: ' + linesep + linesep.join([' ' + str(s) for s in self.alt_servers])) if self.alt_servers else '' + else: + r += (' Alternative servers: ' + str(self.alt_servers)) + r += linesep + if self.supported_controls: + if isinstance(self.supported_controls, SEQUENCE_TYPES): + r += (' Supported controls: ' + linesep + linesep.join([' ' + oid_to_string(s) for s in self.supported_controls])) if self.supported_controls else '' + else: + r += (' Supported controls: ' + str(self.supported_controls)) + r += linesep + if self.supported_extensions: + if isinstance(self.supported_extensions, SEQUENCE_TYPES): + r += (' Supported extensions: ' + linesep + linesep.join([' ' + oid_to_string(s) for s in self.supported_extensions])) if self.supported_extensions else '' + else: + r += (' Supported extensions: ' + str(self.supported_extensions)) + r += linesep + if self.supported_features: + if self.supported_features: + if isinstance(self.supported_features, SEQUENCE_TYPES): + r += (' Supported features: ' + linesep + linesep.join([' ' + oid_to_string(s) for s in self.supported_features])) if self.supported_features else '' + else: + r += (' Supported features: ' + str(self.supported_features)) + r += linesep + if self.supported_sasl_mechanisms: + if isinstance(self.supported_sasl_mechanisms, SEQUENCE_TYPES): + r += (' Supported SASL mechanisms: ' + linesep + ' ' + ', '.join([str(s) for s in self.supported_sasl_mechanisms])) if self.supported_sasl_mechanisms else '' + else: + r += (' Supported SASL mechanisms: ' + str(self.supported_sasl_mechanisms)) + r += linesep + if self.schema_entry: + if isinstance(self.schema_entry, SEQUENCE_TYPES): + r += (' Schema entry: ' + linesep + linesep.join([' ' + str(s) for s in self.schema_entry])) if self.schema_entry else '' + else: + r += (' Schema entry: ' + str(self.schema_entry)) + r += linesep + if self.vendor_name: + if isinstance(self.vendor_name, SEQUENCE_TYPES) and len(self.vendor_name) == 1: + r += 'Vendor name: ' + self.vendor_name[0] + else: + r += 'Vendor name: ' + str(self.vendor_name) + r += linesep + if self.vendor_version: + if isinstance(self.vendor_version, SEQUENCE_TYPES) and len(self.vendor_version) == 1: + r += 'Vendor version: ' + self.vendor_version[0] + else: + r += 'Vendor version: ' + str(self.vendor_version) + r += linesep + r += 'Other:' + linesep + for k, v in self.other.items(): + r += ' ' + str(k) + ': ' + linesep + try: + r += (linesep.join([' ' + str(s) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(v) + except UnicodeDecodeError: + r += (linesep.join([' ' + str(escape_bytes(s)) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(escape_bytes(v)) + r += linesep + return r + + +class SchemaInfo(BaseServerInfo): + """ + This class contains info about the ldap server schema read from an entry (default entry is DSE) + as defined in RFC4512. Unknown attributes are stored in the "other" dict + """ + + def __init__(self, schema_entry, attributes, raw_attributes): + BaseServerInfo.__init__(self, raw_attributes) + self.schema_entry = schema_entry + self.create_time_stamp = attributes.pop('createTimestamp', None) + self.modify_time_stamp = attributes.pop('modifyTimestamp', None) + self.attribute_types = AttributeTypeInfo.from_definition(attributes.pop('attributeTypes', [])) + self.object_classes = ObjectClassInfo.from_definition(attributes.pop('objectClasses', [])) + self.matching_rules = MatchingRuleInfo.from_definition(attributes.pop('matchingRules', [])) + self.matching_rule_uses = MatchingRuleUseInfo.from_definition(attributes.pop('matchingRuleUse', [])) + self.dit_content_rules = DitContentRuleInfo.from_definition(attributes.pop('dITContentRules', [])) + self.dit_structure_rules = DitStructureRuleInfo.from_definition(attributes.pop('dITStructureRules', [])) + self.name_forms = NameFormInfo.from_definition(attributes.pop('nameForms', [])) + self.ldap_syntaxes = LdapSyntaxInfo.from_definition(attributes.pop('ldapSyntaxes', [])) + self.other = attributes # remaining schema definition attributes not in RFC4512 + + # links attributes to class objects + if self.object_classes and self.attribute_types: + for object_class in self.object_classes: # CaseInsensitiveDict return keys while iterating + for attribute in self.object_classes[object_class].must_contain: + try: + self.attribute_types[attribute].mandatory_in.append(object_class) + except KeyError: + pass + for attribute in self.object_classes[object_class].may_contain: + try: + self.attribute_types[attribute].optional_in.append(object_class) + except KeyError: + pass + + def is_valid(self): + if self.object_classes or self.attribute_types or self.matching_rules or self.matching_rule_uses or self.dit_content_rules or self.dit_structure_rules or self.name_forms or self.ldap_syntaxes: + return True + return False + + def __repr__(self): + r = 'DSA Schema from: ' + self.schema_entry + r += linesep + if isinstance(self.attribute_types, SEQUENCE_TYPES): + r += (' Attribute types:' + linesep + ' ' + ', '.join([str(self.attribute_types[s]) for s in self.attribute_types])) if self.attribute_types else '' + else: + r += (' Attribute types:' + str(self.attribute_types)) + r += linesep + if isinstance(self.object_classes, SEQUENCE_TYPES): + r += (' Object classes:' + linesep + ' ' + ', '.join([str(self.object_classes[s]) for s in self.object_classes])) if self.object_classes else '' + else: + r += (' Object classes:' + str(self.object_classes)) + r += linesep + if isinstance(self.matching_rules, SEQUENCE_TYPES): + r += (' Matching rules:' + linesep + ' ' + ', '.join([str(self.matching_rules[s]) for s in self.matching_rules])) if self.matching_rules else '' + else: + r += (' Matching rules:' + str(self.matching_rules)) + r += linesep + if isinstance(self.matching_rule_uses, SEQUENCE_TYPES): + r += (' Matching rule uses:' + linesep + ' ' + ', '.join([str(self.matching_rule_uses[s]) for s in self.matching_rule_uses])) if self.matching_rule_uses else '' + else: + r += (' Matching rule uses:' + str(self.matching_rule_uses)) + r += linesep + if isinstance(self.dit_content_rules, SEQUENCE_TYPES): + r += (' DIT content rules:' + linesep + ' ' + ', '.join([str(self.dit_content_rules[s]) for s in self.dit_content_rules])) if self.dit_content_rules else '' + else: + r += (' DIT content rules:' + str(self.dit_content_rules)) + r += linesep + if isinstance(self.dit_structure_rules, SEQUENCE_TYPES): + r += (' DIT structure rules:' + linesep + ' ' + ', '.join([str(self.dit_structure_rules[s]) for s in self.dit_structure_rules])) if self.dit_structure_rules else '' + else: + r += (' DIT structure rules:' + str(self.dit_structure_rules)) + r += linesep + if isinstance(self.name_forms, SEQUENCE_TYPES): + r += (' Name forms:' + linesep + ' ' + ', '.join([str(self.name_forms[s]) for s in self.name_forms])) if self.name_forms else '' + else: + r += (' Name forms:' + str(self.name_forms)) + r += linesep + if isinstance(self.ldap_syntaxes, SEQUENCE_TYPES): + r += (' LDAP syntaxes:' + linesep + ' ' + ', '.join([str(self.ldap_syntaxes[s]) for s in self.ldap_syntaxes])) if self.ldap_syntaxes else '' + else: + r += (' LDAP syntaxes:' + str(self.ldap_syntaxes)) + r += linesep + r += 'Other:' + linesep + + for k, v in self.other.items(): + r += ' ' + str(k) + ': ' + linesep + try: + r += (linesep.join([' ' + str(s) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(v) + except UnicodeDecodeError: + r += (linesep.join([' ' + str(escape_bytes(s)) for s in v])) if isinstance(v, SEQUENCE_TYPES) else str(escape_bytes(v)) + r += linesep + return r + + +class BaseObjectInfo(object): + """ + Base class for objects defined in the schema as per RFC4512 + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + extensions=None, + experimental=None, + definition=None): + + self.oid = oid + self.name = name + self.description = description + self.obsolete = obsolete + self.extensions = extensions + self.experimental = experimental + self.raw_definition = definition + self._oid_info = None + + @property + def oid_info(self): + if self._oid_info is None and self.oid: + self._oid_info = Oids.get(self.oid, '') + + return self._oid_info if self._oid_info else None + + def __str__(self): + return self.__repr__() + + def __repr__(self): + r = ': ' + self.oid + r += ' [OBSOLETE]' if self.obsolete else '' + r += (linesep + ' Short name: ' + list_to_string(self.name)) if self.name else '' + r += (linesep + ' Description: ' + self.description) if self.description else '' + r += '<__desc__>' + r += (linesep + ' Extensions:' + linesep + linesep.join([' ' + s[0] + ': ' + list_to_string(s[1]) for s in self.extensions])) if self.extensions else '' + r += (linesep + ' Experimental:' + linesep + linesep.join([' ' + s[0] + ': ' + list_to_string(s[1]) for s in self.experimental])) if self.experimental else '' + r += (linesep + ' OidInfo: ' + str(self.oid_info)) if self.oid_info else '' + r += linesep + return r + + @classmethod + def from_definition(cls, definitions): + conf_case_insensitive_schema = get_config_parameter('CASE_INSENSITIVE_SCHEMA_NAMES') + conf_ignore_malformed_schema = get_config_parameter('IGNORE_MALFORMED_SCHEMA') + + ret_dict = CaseInsensitiveWithAliasDict() if conf_case_insensitive_schema else dict() + + if not definitions: + return ret_dict + + for object_definition in definitions: + object_definition = to_unicode(object_definition.strip(), from_server=True) + if object_definition[0] == '(' and object_definition[-1] == ')': + if cls is MatchingRuleInfo: + pattern = '| SYNTAX ' + elif cls is ObjectClassInfo: + pattern = '| SUP | ABSTRACT| STRUCTURAL| AUXILIARY| MUST | MAY ' + elif cls is AttributeTypeInfo: + pattern = '| SUP | EQUALITY | ORDERING | SUBSTR | SYNTAX | SINGLE-VALUE| COLLECTIVE| NO-USER-MODIFICATION| USAGE ' + elif cls is MatchingRuleUseInfo: + pattern = '| APPLIES ' + elif cls is LdapSyntaxInfo: + pattern = '' + elif cls is DitContentRuleInfo: + pattern = '| AUX | MUST | MAY | NOT ' + elif cls is DitStructureRuleInfo: + pattern = '| FORM | SUP ' + elif cls is NameFormInfo: + pattern = '| OC | MUST | MAY ' + else: + raise LDAPSchemaError('unknown schema definition class') + + splitted = re.split('( NAME | DESC | OBSOLETE| X-| E-' + pattern + ')', object_definition[1:-1]) + values = splitted[::2] + separators = splitted[1::2] + separators.insert(0, 'OID') + defs = list(zip(separators, values)) + object_def = cls() + for d in defs: + key = d[0].strip() + value = d[1].strip() + if key == 'OID': + object_def.oid = value + elif key == 'NAME': + object_def.name = quoted_string_to_list(value) + elif key == 'DESC': + object_def.description = value.strip("'") + elif key == 'OBSOLETE': + object_def.obsolete = True + elif key == 'SYNTAX': + object_def.syntax = oids_string_to_list(value) + elif key == 'SUP': + object_def.superior = oids_string_to_list(value) + elif key == 'ABSTRACT': + object_def.kind = CLASS_ABSTRACT + elif key == 'STRUCTURAL': + object_def.kind = CLASS_STRUCTURAL + elif key == 'AUXILIARY': + object_def.kind = CLASS_AUXILIARY + elif key == 'MUST': + object_def.must_contain = oids_string_to_list(value) + elif key == 'MAY': + object_def.may_contain = oids_string_to_list(value) + elif key == 'EQUALITY': + object_def.equality = oids_string_to_list(value) + elif key == 'ORDERING': + object_def.ordering = oids_string_to_list(value) + elif key == 'SUBSTR': + object_def.substr = oids_string_to_list(value) + elif key == 'SINGLE-VALUE': + object_def.single_value = True + elif key == 'COLLECTIVE': + object_def.collective = True + elif key == 'NO-USER-MODIFICATION': + object_def.no_user_modification = True + elif key == 'USAGE': + object_def.usage = attribute_usage_to_constant(value) + elif key == 'APPLIES': + object_def.apply_to = oids_string_to_list(value) + elif key == 'AUX': + object_def.auxiliary_classes = oids_string_to_list(value) + elif key == 'FORM': + object_def.name_form = oids_string_to_list(value) + elif key == 'OC': + object_def.object_class = oids_string_to_list(value) + elif key == 'NOT': + object_def.not_contains = oids_string_to_list(value) + elif key == 'X-': + if not object_def.extensions: + object_def.extensions = [] + object_def.extensions.append(extension_to_tuple('X-' + value)) + elif key == 'E-': + if not object_def.experimental: + object_def.experimental = [] + object_def.experimental.append(extension_to_tuple('E-' + value)) + else: + if not conf_ignore_malformed_schema: + raise LDAPSchemaError('malformed schema definition key:' + key + ' - use get_info=NONE in Server definition') + else: + return CaseInsensitiveWithAliasDict() if conf_case_insensitive_schema else dict() + object_def.raw_definition = object_definition + if hasattr(object_def, 'syntax') and object_def.syntax and len(object_def.syntax) == 1: + object_def.min_length = None + if object_def.syntax[0].endswith('}'): + try: + object_def.min_length = int(object_def.syntax[0][object_def.syntax[0].index('{') + 1:-1]) + object_def.syntax[0] = object_def.syntax[0][:object_def.syntax[0].index('{')] + except Exception: + pass + else: + object_def.min_length = None + object_def.syntax[0] = object_def.syntax[0].strip("'") + object_def.syntax = object_def.syntax[0] + if hasattr(object_def, 'name') and object_def.name: + if conf_case_insensitive_schema: + ret_dict[object_def.name[0]] = object_def + ret_dict.set_alias(object_def.name[0], object_def.name[1:] + [object_def.oid], ignore_duplicates=True) + else: + for name in object_def.name: + ret_dict[name] = object_def + else: + ret_dict[object_def.oid] = object_def + + else: + if not conf_ignore_malformed_schema: + raise LDAPSchemaError('malformed schema definition, use get_info=NONE in Server definition') + else: + return CaseInsensitiveWithAliasDict() if conf_case_insensitive_schema else dict() + return ret_dict + + +class MatchingRuleInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.3) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + syntax=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.syntax = syntax + + def __repr__(self): + r = (linesep + ' Syntax: ' + list_to_string(self.syntax)) if self.syntax else '' + return 'Matching rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class MatchingRuleUseInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.4) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + apply_to=None, + extensions=None, + experimental=None, + definition=None): + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.apply_to = apply_to + + def __repr__(self): + r = (linesep + ' Apply to: ' + list_to_string(self.apply_to)) if self.apply_to else '' + return 'Matching rule use' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class ObjectClassInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.1) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + superior=None, + kind=None, + must_contain=None, + may_contain=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.superior = superior + self.kind = kind + self.must_contain = must_contain or [] + self.may_contain = may_contain or [] + + def __repr__(self): + r = '' + r += (linesep + ' Type: ' + constant_to_class_kind(self.kind)) if self.kind else '' + r += (linesep + ' Superior: ' + list_to_string(self.superior)) if self.superior else '' + r += (linesep + ' Must contain attributes: ' + list_to_string(self.must_contain)) if self.must_contain else '' + r += (linesep + ' May contain attributes: ' + list_to_string(self.may_contain)) if self.may_contain else '' + return 'Object class' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class AttributeTypeInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.2) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + superior=None, + equality=None, + ordering=None, + substring=None, + syntax=None, + min_length=None, + single_value=False, + collective=False, + no_user_modification=False, + usage=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.superior = superior + self.equality = equality + self.ordering = ordering + self.substring = substring + self.syntax = syntax + self.min_length = min_length + self.single_value = single_value + self.collective = collective + self.no_user_modification = no_user_modification + self.usage = usage + self.mandatory_in = [] + self.optional_in = [] + + def __repr__(self): + r = '' + r += linesep + ' Single value: ' + str(self.single_value) + r += linesep + ' Collective: True' if self.collective else '' + r += (linesep + ' Superior: ' + list_to_string(self.superior)) if self.superior else '' + r += linesep + ' No user modification: True' if self.no_user_modification else '' + r += (linesep + ' Usage: ' + constant_to_attribute_usage(self.usage)) if self.usage else '' + r += (linesep + ' Equality rule: ' + list_to_string(self.equality)) if self.equality else '' + r += (linesep + ' Ordering rule: ' + list_to_string(self.ordering)) if self.ordering else '' + r += (linesep + ' Substring rule: ' + list_to_string(self.substring)) if self.substring else '' + r += (linesep + ' Syntax: ' + (self.syntax + (' [' + str(decode_syntax(self.syntax)))) + ']') if self.syntax else '' + r += (linesep + ' Minimum length: ' + str(self.min_length)) if isinstance(self.min_length, int) else '' + r += linesep + ' Mandatory in: ' + list_to_string(self.mandatory_in) if self.mandatory_in else '' + r += linesep + ' Optional in: ' + list_to_string(self.optional_in) if self.optional_in else '' + return 'Attribute type' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class LdapSyntaxInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.5) + """ + + def __init__(self, + oid=None, + description=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=None, + description=description, + obsolete=False, + extensions=extensions, + experimental=experimental, + definition=definition) + + def __repr__(self): + return 'LDAP syntax' + BaseObjectInfo.__repr__(self).replace('<__desc__>', '') + + +class DitContentRuleInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.6) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + auxiliary_classes=None, + must_contain=None, + may_contain=None, + not_contains=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + + self.auxiliary_classes = auxiliary_classes + self.must_contain = must_contain + self.may_contain = may_contain + self.not_contains = not_contains + + def __repr__(self): + r = (linesep + ' Auxiliary classes: ' + list_to_string(self.auxiliary_classes)) if self.auxiliary_classes else '' + r += (linesep + ' Must contain: ' + list_to_string(self.must_contain)) if self.must_contain else '' + r += (linesep + ' May contain: ' + list_to_string(self.may_contain)) if self.may_contain else '' + r += (linesep + ' Not contains: ' + list_to_string(self.not_contains)) if self.not_contains else '' + return 'DIT content rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class DitStructureRuleInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.7.1) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + name_form=None, + superior=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.superior = superior + self.name_form = name_form + + def __repr__(self): + r = (linesep + ' Superior rules: ' + list_to_string(self.superior)) if self.superior else '' + r += (linesep + ' Name form: ' + list_to_string(self.name_form)) if self.name_form else '' + return 'DIT content rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) + + +class NameFormInfo(BaseObjectInfo): + """ + As per RFC 4512 (4.1.7.2) + """ + + def __init__(self, + oid=None, + name=None, + description=None, + obsolete=False, + object_class=None, + must_contain=None, + may_contain=None, + extensions=None, + experimental=None, + definition=None): + + BaseObjectInfo.__init__(self, + oid=oid, + name=name, + description=description, + obsolete=obsolete, + extensions=extensions, + experimental=experimental, + definition=definition) + self.object_class = object_class + self.must_contain = must_contain + self.may_contain = may_contain + + def __repr__(self): + r = (linesep + ' Object class: ' + list_to_string(self.object_class)) if self.object_class else '' + r += (linesep + ' Must contain: ' + list_to_string(self.must_contain)) if self.must_contain else '' + r += (linesep + ' May contain: ' + list_to_string(self.may_contain)) if self.may_contain else '' + return 'DIT content rule' + BaseObjectInfo.__repr__(self).replace('<__desc__>', r) diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4527.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4527.py new file mode 100644 index 0000000..6213daa --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/rfc4527.py @@ -0,0 +1,57 @@ +""" +""" + +# Created on 2016.12.23 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import NO_ATTRIBUTES, ALL_ATTRIBUTES, STRING_TYPES +from ..operation.search import build_attribute_selection +from .controls import build_control + + +def _read_control(oid, attributes, criticality=False): + if not attributes: + attributes = [NO_ATTRIBUTES] + elif attributes == ALL_ATTRIBUTES: + attributes = [ALL_ATTRIBUTES] + + if isinstance(attributes, STRING_TYPES): + attributes = [attributes] + value = build_attribute_selection(attributes, None) + return build_control(oid, criticality, value) + + +def pre_read_control(attributes, criticality=False): + """Create a pre-read control for a request. + When passed as a control to the controls parameter of an operation, it will + return the value in `Connection.result` before the operation took place. + """ + return _read_control('1.3.6.1.1.13.1', attributes, criticality) + + +def post_read_control(attributes, criticality=False): + """Create a post-read control for a request. + When passed as a control to the controls parameter of an operation, it will + return the value in `Connection.result` after the operation took place. + """ + return _read_control('1.3.6.1.1.13.2', attributes, criticality) + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d036a1fd036e5198c83f60a69efb9c23dfa069ae GIT binary patch literal 150 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vWza+OnzaXjpvA`Hg78K=|_m3F0jxFFdbJ@jT12oG#Q|+gXf&Q`+wJM; zcB*QUII5Nq!x5xCaR3Q9mq>{Jfddkp5Pv{lIr+S|91y=(J$4+&Y`5y`y{h+Buikq< z8XvD&`2O_QDEh~B%lZ#3&ORHH&(Nes$F0!fjN1w8+o8>9?j%m=n9&Vg?s6~j`hMsG z=W;)(^n)-7TPqyrH9m&1!Rve+;{d&k?SP6=o{-1_;Wt?heT?VT^b*m~GNt1n;?m@8z2L`D*r{w*0wM-h`ad0B*tu~78vW0K*5jpm8}MH_hl7zfzE* z*ys>00n2%ZK4-soPAbMV>}}k0wY;T%##_N9gB9*Uztb(8GOpF7pEF|01ECIB(JI}pBSDu9l_MDZE@u|FiZmsE_ z4XUZ(FayiXp08_%^{<#r`L(>xYuaj$^XuB1v-linjO%eeul;iMv03W?bpFg2bWlP` zvJ%4=b@k#-{w-a5WBqMC_Qv`hUB~*yoHaWCt{GjjGI;zKyqg434gTKAg!Z(rEBnq1 z+Kxk(^!Iy}quJiYMK2B`&n{A!+eM+x3tWsdSCn7EjPeh%hUwCOoQMuYl_A?QygMLxz9(06^)N^m3 z_Ey%PS7Vv2udn@Z<&LO=hM-VTSf?}yqWm?QbxILM5)X>UtCA3%fjSWHVj^y!D_j}x zr!p8J5XhBzmjfAzw9}6^mn4x~T9y?$Lc#$=9Er~Jm}5m4BQNGesC%}c_*w>qm4S$X zCH{}IqfHZwmnGrT?&e43cV}6WxFbC`myDiE%VHKlNs;F6qn*#Uws(GV@9xglM$3Lv z=rfU4x>>p>-^2Ee5#9eg$h+8e-=wytjHE;cZuX+%rpmAsPa?6RvXyQUN2zL(m5_H0 zzTer8yG`(++^N2SN_m#3l=QxdipffmJOWiRI@$5eF2-6*tyvR@!%0&$bm1+KEAAvx z(ES!p5~YG}qL|_l0i{iVxe{4|8bd^Kkf?B~ zWPef4_em_5d`~oK8XR?`e3}U!2FBgmF&A{Tg=jCD85A3otqDpO`2sM-HQmm7`3}UDPmE?mhb>6>S`` z>%R4?-{n3sw1u2=U;ErOqn*2SN;x@uyacQR=q|9H86CN+ZMn<++&RbU5mswQXySH` zc?k?wbdD2{Ms9kPka;?IQ-;kC%RFX;=JR+tkXP+Cwx8p0CxK_;AB` zG)gvKdmg9gASHo2tf%wsh#S;$? literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/external.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/external.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6e6474c2bea86b8a3c2c468a7a51f2eb7e1185 GIT binary patch literal 399 zcmYjN!Ait15S^rTcU`Q=f*`0L(8F#IB6tv8^u8Bwy_C|#rJ5!o$-*wwlm3NYApTLV zp8N$*PJ#so=4BGzd-KR$mQ4Zc{gd<46yPgdhN3tuvF#ZGgAy2FRFICAlmJUu`UYjf z_8uS~c{2S@kd+gEY`J8Wt*xjeUn|$vu2r%LW}yNL7r{NYogp~rp(i~&k=Nvf_7v^N zDyJq8%cJPi7|ysvCt>r%Pa7pAZ-T3z;OvYN){hLg8{s~{j8XV=Tewaay4CYmT2~7( z*Uy*h$L-aw5Ukc0f2fUes!^f{dkVgF+{jui^v-8-^YC&W(uUYT4yoD4bCsulTvbdp lRaMRgpG8nbi1{Nk2KomRRQt(wr`SgDoA58uIXyW@egUx+WJ3S| literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/kerberos.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/kerberos.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ce1794cd4c2ce26568c5d14d379f34bf5dccf7f GIT binary patch literal 8467 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 Cx3jYV literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/plain.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/plain.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..095e5960af5aadadb99325b497b7a303a9653737 GIT binary patch literal 718 zcmZuvyKWRQ6!mK!8EvExpg`gW7AZSI2oa$OA?VZ4xfzYdCJcDSmhB;IG+Tv=U*HQ6 zpTM8ErP?|j71v%iP+;pGpX(!C-E-|%hldq{_4T`yKT3pt#$>+;ke3kd6hI)31QtZ$ zfpCJ6pn@qnFwTHuk*RFRc|H`pfIJt)XT(cUzCp`_fU7Nq3QHXBJ2{HRwN5poywJXH zeXqwY-l+#kFjkr+3AxveZ7)Lw=QQ@67P5;C#Z^FL5U(NJ7l0YPhbA7N4M~guqlr;q zOt4Kh6Z?G5Jod!XnOx(zpCP!qceMTtFynlXEU1doL$pRKIdRJKi@(_ z$TEO!Z1^UoH_;+mX8b65?5q@W1pCU_90VKP*l5e9Nfn{$^f<~cjwh7Bz17O`qMiJ^ zt6uC#*Nc#w*11a&3e&EYZsEd8H!1%O**j3~*IDfcQ=8tL^rQ2wQYYra(~GyCPS>>( zt$FeXjn!UvTGg?=+Nic4S7sfm-HXKZF;sI80T8a@CJZxtkCbrkaY5`|(9hw?i>48} zYZ`vMue^$-5+sY9#XR}u)#Q8SR^amEZW?J2u~hQ#4;;f?D9;8hCM93Q={oqdh&@{1 I1wNv`0ePpcNB{r; literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/sasl.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/__pycache__/sasl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b30e47f6fed15d760df601c0e8cc6eb1619b075 GIT binary patch literal 4082 zcmai1TW{OQ73NTsM9Z>#i4!EiqF~dajkdnTc5Y1c1|BfsG zt+m!$+jtv$_gjy)_s#W3`=6N)?(cv0aKqerxNo)|?e0F@+rPijRI}ObjrCoczbl;R zz7V0vJ|bw>isLUs!MEZESjI|1(U+q(BW>_2VTyz-b>0{d&Pdmj=oMAr2TV5 zT7>t1;3alovuYuJHY*J$X1~yq> zb&354SiQie2>XhOIiOPo+K@A!0BhvfV}(x-N_e!R4Qbsc(z@vr?rlCZCKe|j{FJpr{U+hOA6@_6Fmd^TtS!lJn^IqId$IpovJ7` z13%Y~JjZu}#2BW45s9$ldX8bmM&t-%Z}Z-@t1D}_^XZAfosJtgv5_1)#${rPkT;hL zuCSAj#EEc&Za!vt-B7s6p>I5GNtjaY*^-pF4>7|P-5Aniw;MRz=!C-P#g5?yMoTJb ztoN{Fkhr#$xM5%*DUFt6_aL}0C2d=MsC(rp>GZ5=_>O&O1#axe3r5_t56PaVyW8tq zJI@x3r}y^OA1prDxQ;#qN&crBTc6%5QdG|7=#JTN}PbdXQxzx9A=T{440F!N#DplNe;IX zDVF%ps&K_w>MkuvA&zgko?&q=oH%x1KdOWUM@n5mxp9IOdTx9O1ti#9FyL=#os>{4 z4s>YKhZTX7g=Hu31ZspO#R%s`&lQdo#NAE@E<=7H7~CVnazzc>LUcQ!$ALBTT*#Df zn2~8an?JvI{P8fg42NpcZKD^+2qd8qgu=Hx_ZWeY*>t=zJ~s%1#r4*`tt}&tEZZ?o zm4ts|Xmh+g&XP~J!ypl%_W_2rafZ`1zMZK#&J+pvrImb0p{wIlN&czccF3_$LZl5c zDK}wZoFneRQ(Y? zs;6cQb^ml+8m0tYhf)(-^l7)C_8|G87AIlY^vKn-g3fq2vASK#vNKaR_m8*6SIzSW zsTk0nqBxQVuI$mW>)TCPW44V0mm{5RsyeWZ1jhpPQ+fAa{El~oiOe=F&xDR=mt8RY zUYt-F>9_(N%r!gR<(z0XQ3hUR%v3 ziY*}~px7wa>dJf6s0@2;M4)|bl(;@h+!!TpjuN*YAfIY}X_t{rML~d>00N^ONPokCr1hT6BXru{>`v`r>-Gb9Ae}>~Skv zJ86+NNoa@Oa%{zUvlR8S38G9|`TKNL`2`wfT4OaZuarX(@PLOmJnQLpfoolBloL z_)bzvl~-(_oFb`$s}U|1190HzE*;;Mb@e3*AY53SMMaT*|J242M4O>-Kz@oJf9K@* zD7df#ekhaF@uQ@FT<#^E#aqp?pu2Kbb0Gv?4{RqZAM_I^mWE~(C!qYp9a0|(YS%5> zcA~_Ta%AlC<}wMoIMmwA*Eff31B}LVXq2)J&mtD^vo0eft^h4uS^-hTBVGC&9eG1n zd^S*-lB%ilTun+GcXy8VRb>EozR~dDKAF<}vIIwheqMQA6&rZ#gK{v3@rhJ>%Xs;c zLeHR_;y!svNorrHqQk2#h3jzr#Ezilajk9~xY+Sjp=5m%lYp~H0{3wAIoQ4w`mBN) z*z=P8&E{m*C}uCwJkg{H)t8QlQB?$)lwFF#I5BZLakwYwV#|X+3WM0mG(s~Sf)Vm= zA9O#k#gB-q-gS~U#zS?%ItT@{p`8;r z-7vu^0Zo4k`Edh{!s_Zgn@5mzbxsvGf!LJm^dlvTAUy$51gV4|Atb{fp{J!P!X!h4 zFjVjnpq+%NjM3_IU2Nh#F{lI$jMvigTlTp+s17P=1tHOfA(6I;kFi#BQY_$=1B=un zRoV?{NpU9>OEj`f%~fhvs3CufRWwaqtWp0OnyeaGeJ`}~kcsPr-=Ic%pPA#1JD&$| z%x`}LN8z^%Y+fb5HB@mMc=16+A6CT&)ddg<>Og{|euXOWro`D>ykWJvla;O5cHO3y zm5>vHzQhD^W)<$pEs0OS7#E~*ECs%}aL+. + +from binascii import hexlify +import hashlib +import hmac + +from ... import SEQUENCE_TYPES +from ...protocol.sasl.sasl import abort_sasl_negotiation, send_sasl_negotiation, random_hex_string + + +STATE_KEY = 0 +STATE_VALUE = 1 + + +def md5_h(value): + if not isinstance(value, bytes): + value = value.encode() + + return hashlib.md5(value).digest() + + +def md5_kd(k, s): + if not isinstance(k, bytes): + k = k.encode() + + if not isinstance(s, bytes): + s = s.encode() + + return md5_h(k + b':' + s) + + +def md5_hex(value): + if not isinstance(value, bytes): + value = value.encode() + + return hexlify(value) + + +def md5_hmac(k, s): + if not isinstance(k, bytes): + k = k.encode() + + if not isinstance(s, bytes): + s = s.encode() + + return hmac.new(k, s, digestmod=hashlib.md5).hexdigest() + + +def sasl_digest_md5(connection, controls): + # sasl_credential must be a tuple made up of the following elements: (realm, user, password, authorization_id) or (realm, user, password, authorization_id, enable_signing) + # if realm is None will be used the realm received from the server, if available + if not isinstance(connection.sasl_credentials, SEQUENCE_TYPES) or not len(connection.sasl_credentials) in (4, 5): + return None + + # step One of RFC2831 + result = send_sasl_negotiation(connection, controls, None) + if 'saslCreds' in result and result['saslCreds'] is not None: + server_directives = decode_directives(result['saslCreds']) + else: + return None + + if 'realm' not in server_directives or 'nonce' not in server_directives or 'algorithm' not in server_directives: # mandatory directives, as per RFC2831 + abort_sasl_negotiation(connection, controls) + return None + + # step Two of RFC2831 + charset = server_directives['charset'] if 'charset' in server_directives and server_directives['charset'].lower() == 'utf-8' else 'iso8859-1' + user = connection.sasl_credentials[1].encode(charset) + realm = (connection.sasl_credentials[0] if connection.sasl_credentials[0] else (server_directives['realm'] if 'realm' in server_directives else '')).encode(charset) + password = connection.sasl_credentials[2].encode(charset) + authz_id = connection.sasl_credentials[3].encode(charset) if connection.sasl_credentials[3] else b'' + nonce = server_directives['nonce'].encode(charset) + cnonce = random_hex_string(16).encode(charset) + uri = b'ldap/' + connection.server.host.encode(charset) + qop = b'auth' + if len(connection.sasl_credentials) == 5 and connection.sasl_credentials[4] == 'sign' and not connection.server.ssl: + qop = b'auth-int' + connection._digest_md5_sec_num = 0 + + digest_response = b'username="' + user + b'",' + digest_response += b'realm="' + realm + b'",' + digest_response += (b'authzid="' + authz_id + b'",') if authz_id else b'' + digest_response += b'nonce="' + nonce + b'",' + digest_response += b'cnonce="' + cnonce + b'",' + digest_response += b'digest-uri="' + uri + b'",' + digest_response += b'qop=' + qop + b',' + digest_response += b'nc=00000001' + b',' + if charset == 'utf-8': + digest_response += b'charset="utf-8",' + + a0 = md5_h(b':'.join([user, realm, password])) + a1 = b':'.join([a0, nonce, cnonce, authz_id]) if authz_id else b':'.join([a0, nonce, cnonce]) + a2 = b'AUTHENTICATE:' + uri + (b':00000000000000000000000000000000' if qop in [b'auth-int', b'auth-conf'] else b'') + + if qop == b'auth-int': + connection._digest_md5_kis = md5_h(md5_h(a1) + b"Digest session key to server-to-client signing key magic constant") + connection._digest_md5_kic = md5_h(md5_h(a1) + b"Digest session key to client-to-server signing key magic constant") + + digest_response += b'response="' + md5_hex(md5_kd(md5_hex(md5_h(a1)), b':'.join([nonce, b'00000001', cnonce, qop, md5_hex(md5_h(a2))]))) + b'"' + + result = send_sasl_negotiation(connection, controls, digest_response) + return result + + +def decode_directives(directives_string): + """ + converts directives to dict, unquote values + """ + + # old_directives = dict((attr[0], attr[1].strip('"')) for attr in [line.split('=') for line in directives_string.split(',')]) + state = STATE_KEY + tmp_buffer = '' + quoting = False + key = '' + directives = dict() + for c in directives_string.decode('utf-8'): + if state == STATE_KEY and c == '=': + key = tmp_buffer + tmp_buffer = '' + state = STATE_VALUE + elif state == STATE_VALUE and c == '"' and not quoting and not tmp_buffer: + quoting = True + elif state == STATE_VALUE and c == '"' and quoting: + quoting = False + elif state == STATE_VALUE and c == ',' and not quoting: + directives[key] = tmp_buffer + tmp_buffer = '' + key = '' + state = STATE_KEY + else: + tmp_buffer += c + + if key and tmp_buffer: + directives[key] = tmp_buffer + + return directives diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/external.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/external.py new file mode 100644 index 0000000..7bb8bc1 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/external.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2014.01.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ...protocol.sasl.sasl import send_sasl_negotiation + + +def sasl_external(connection, controls): + result = send_sasl_negotiation(connection, controls, connection.sasl_credentials) + + return result diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/kerberos.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/kerberos.py new file mode 100644 index 0000000..05ce363 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/kerberos.py @@ -0,0 +1,302 @@ +""" +""" + +# Created on 2015.04.08 +# +# Author: Giovanni Cannata +# +# Copyright 2015 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# original code by Hugh Cole-Baker, modified by Peter Foley, modified again by Azaria Zornberg +# it needs the gssapi package +import base64 +import socket + +from ...core.exceptions import LDAPPackageUnavailableError, LDAPCommunicationError +from ...core.rdns import ReverseDnsSetting, get_hostname_by_addr, is_ip_addr + +posix_gssapi_unavailable = True +try: + # noinspection PyPackageRequirements,PyUnresolvedReferences + import gssapi + from gssapi.raw import ChannelBindings + posix_gssapi_unavailable = False +except ImportError: + pass + +windows_gssapi_unavailable = True +# only attempt to import winkerberos if gssapi is unavailable +if posix_gssapi_unavailable: + try: + import winkerberos + windows_gssapi_unavailable = False + except ImportError: + raise LDAPPackageUnavailableError('package gssapi (or winkerberos) missing') + +from .sasl import send_sasl_negotiation, abort_sasl_negotiation + + +NO_SECURITY_LAYER = 1 +INTEGRITY_PROTECTION = 2 +CONFIDENTIALITY_PROTECTION = 4 + + +def get_channel_bindings(ssl_socket): + try: + server_certificate = ssl_socket.getpeercert(True) + except: + # it is not SSL socket + return None + try: + from cryptography import x509 + from cryptography.hazmat.backends import default_backend + from cryptography.hazmat.primitives import hashes + except ImportError: + raise LDAPPackageUnavailableError('package cryptography missing') + cert = x509.load_der_x509_certificate(server_certificate, default_backend()) + hash_algorithm = cert.signature_hash_algorithm + # According to https://tools.ietf.org/html/rfc5929#section-4.1, we have to convert the the hash function for md5 and sha1 + if hash_algorithm.name in ('md5', 'sha1'): + digest = hashes.Hash(hashes.SHA256(), default_backend()) + else: + digest = hashes.Hash(hash_algorithm, default_backend()) + digest.update(server_certificate) + application_data = b'tls-server-end-point:' + digest.finalize() + # posix gssapi and windows winkerberos use different channel bindings classes + if not posix_gssapi_unavailable: + return ChannelBindings(application_data=application_data) + else: + return winkerberos.channelBindings(application_data=application_data) + + +def sasl_gssapi(connection, controls): + """ + Performs a bind using the Kerberos v5 ("GSSAPI") SASL mechanism + from RFC 4752. Does not support any security layers, only authentication! + + sasl_credentials can be empty or a tuple with one or two elements. + The first element determines which service principal to request a ticket for and can be one of the following: + + - None or False, to use the hostname from the Server object + - True to perform a reverse DNS lookup to retrieve the canonical hostname for the hosts IP address + - A string containing the hostname + + The optional second element is what authorization ID to request. + + - If omitted or None, the authentication ID is used as the authorization ID + - If a string, the authorization ID to use. Should start with "dn:" or "user:". + + The optional third element is a raw gssapi credentials structure which can be used over + the implicit use of a krb ccache. + """ + if not posix_gssapi_unavailable: + return _posix_sasl_gssapi(connection, controls) + else: + return _windows_sasl_gssapi(connection, controls) + + +def _common_determine_target_name(connection): + """ Common logic for determining our target name for kerberos negotiation, regardless of whether we are using + gssapi on a posix system or winkerberos on windows. + Returns a string in the form "ldap@" + a target hostname. + The hostname can either be user specified, come from the connection, or resolved using reverse DNS based + on parameters set in sasl_credentials. + The default if no sasl_credentials are specified is to use the host in the connection server object. + """ + # if we don't have any sasl_credentials specified, or the first entry is False (which is the legacy equivalent + # to ReverseDnsSetting.OFF that has value 0) then our gssapi name is just + if (not connection.sasl_credentials or len(connection.sasl_credentials) == 0 + or not connection.sasl_credentials[0]): + return 'ldap@' + connection.server.host + # older code will still be using a boolean True for the equivalent of + # ReverseDnsSetting.REQUIRE_RESOLVE_ALL_ADDRESSES + if connection.sasl_credentials[0] is True: + hostname = get_hostname_by_addr(connection.socket.getpeername()[0]) + target_name = 'ldap@' + hostname + elif connection.sasl_credentials[0] in ReverseDnsSetting.SUPPORTED_VALUES: + rdns_setting = connection.sasl_credentials[0] + # if the rdns_setting is OFF then we won't enter any branch here and will leave hostname as server host, + # so we'll just use the server host, whatever it is + peer_ip = connection.socket.getpeername()[0] + hostname = connection.server.host + if rdns_setting == ReverseDnsSetting.REQUIRE_RESOLVE_ALL_ADDRESSES: + # resolve our peer ip and use it as our target name + hostname = get_hostname_by_addr(peer_ip) + elif rdns_setting == ReverseDnsSetting.REQUIRE_RESOLVE_IP_ADDRESSES_ONLY: + # resolve our peer ip (if the server host is an ip address) and use it as our target name + if is_ip_addr(hostname): + hostname = get_hostname_by_addr(peer_ip) + elif rdns_setting == ReverseDnsSetting.OPTIONAL_RESOLVE_ALL_ADDRESSES: + # try to resolve our peer ip in dns and if we can, use it as our target name. + # if not, just use the server host + resolved_hostname = get_hostname_by_addr(peer_ip, success_required=False) + if resolved_hostname is not None: + hostname = resolved_hostname + elif rdns_setting == ReverseDnsSetting.OPTIONAL_RESOLVE_IP_ADDRESSES_ONLY: + # try to resolve our peer ip in dns if our server host is an ip. if we can, use it as our target + # name. if not, just use the server host + if is_ip_addr(hostname): + resolved_hostname = get_hostname_by_addr(peer_ip, success_required=False) + if resolved_hostname is not None: + hostname = resolved_hostname + # construct our target name + target_name = 'ldap@' + hostname + else: # string hostname directly provided + target_name = 'ldap@' + connection.sasl_credentials[0] + return target_name + + +def _common_determine_authz_id_and_creds(connection): + """ Given our connection, figure out the authorization id (i.e. the kerberos principal) and kerberos credentials + being used for our SASL bind. + On posix systems, we can actively negotiate with raw credentials and receive a kerberos client ticket during our + SASL bind. So credentials can be specified. + However, on windows systems, winkerberos expects to use the credentials cached by the system because windows + machines are generally domain-joined. So no initiation is supported, as the TGT must already be valid prior + to beginning the SASL bind, and the windows system credentials will be used as needed with that. + """ + authz_id = b"" + creds = None + # the default value for credentials is only something we should instantiate on systems using the + # posix GSSAPI, as windows kerberos expects that a tgt already exists (i.e. the machine is domain-joined) + # and does not support initiation from raw credentials + if not posix_gssapi_unavailable: + creds = gssapi.Credentials(name=gssapi.Name(connection.user), usage='initiate', store=connection.cred_store) if connection.user else None + if connection.sasl_credentials: + if len(connection.sasl_credentials) >= 2 and connection.sasl_credentials[1]: + authz_id = connection.sasl_credentials[1].encode("utf-8") + if len(connection.sasl_credentials) >= 3 and connection.sasl_credentials[2]: + if posix_gssapi_unavailable: + raise LDAPPackageUnavailableError('The winkerberos package does not support specifying raw credentials' + 'to initiate GSSAPI Kerberos communication. A ticket granting ticket ' + 'must have already been obtained for the user before beginning a ' + 'SASL bind.') + raw_creds = connection.sasl_credentials[2] + creds = gssapi.Credentials(base=raw_creds, usage='initiate', store=connection.cred_store) + return authz_id, creds + + +def _common_process_end_token_get_security_layers(negotiated_token): + """ Process the response we got at the end of our SASL negotiation wherein the server told us what + minimum security layers we need, and return a bytearray for the client security layers we want. + This function throws an error on a malformed token from the server. + The ldap3 library does not support security layers, and only supports authentication with kerberos, + so an error will be thrown for any tokens that indicate a security layer requirement. + """ + if len(negotiated_token) != 4: + raise LDAPCommunicationError("Incorrect response from server") + + server_security_layers = negotiated_token[0] + if not isinstance(server_security_layers, int): + server_security_layers = ord(server_security_layers) + if server_security_layers in (0, NO_SECURITY_LAYER): + if negotiated_token[1:] != '\x00\x00\x00': + raise LDAPCommunicationError("Server max buffer size must be 0 if no security layer") + if not (server_security_layers & NO_SECURITY_LAYER): + raise LDAPCommunicationError("Server requires a security layer, but this is not implemented") + + # this is here to encourage anyone implementing client security layers to do it + # for both windows and posix + client_security_layers = bytearray([NO_SECURITY_LAYER, 0, 0, 0]) + return client_security_layers + +def _posix_sasl_gssapi(connection, controls): + """ Performs a bind using the Kerberos v5 ("GSSAPI") SASL mechanism + from RFC 4752 using the gssapi package that works natively on most + posix operating systems. + """ + target_name = gssapi.Name(_common_determine_target_name(connection), gssapi.NameType.hostbased_service) + authz_id, creds = _common_determine_authz_id_and_creds(connection) + + ctx = gssapi.SecurityContext(name=target_name, mech=gssapi.MechType.kerberos, creds=creds, + channel_bindings=get_channel_bindings(connection.socket)) + in_token = None + try: + while True: + out_token = ctx.step(in_token) + if out_token is None: + out_token = '' + result = send_sasl_negotiation(connection, controls, out_token) + in_token = result['saslCreds'] + try: + # This raised an exception in gssapi<1.1.2 if the context was + # incomplete, but was fixed in + # https://github.com/pythongssapi/python-gssapi/pull/70 + if ctx.complete: + break + except gssapi.exceptions.MissingContextError: + pass + + unwrapped_token = ctx.unwrap(in_token) + client_security_layers = _common_process_end_token_get_security_layers(unwrapped_token.message) + out_token = ctx.wrap(bytes(client_security_layers)+authz_id, False) + return send_sasl_negotiation(connection, controls, out_token.message) + except (gssapi.exceptions.GSSError, LDAPCommunicationError): + abort_sasl_negotiation(connection, controls) + raise + + +def _windows_sasl_gssapi(connection, controls): + """ Performs a bind using the Kerberos v5 ("GSSAPI") SASL mechanism + from RFC 4752 using the winkerberos package that works natively on most + windows operating systems. + """ + target_name = _common_determine_target_name(connection) + # initiation happens before beginning the SASL bind when using windows kerberos + authz_id, _ = _common_determine_authz_id_and_creds(connection) + gssflags = ( + winkerberos.GSS_C_MUTUAL_FLAG | + winkerberos.GSS_C_SEQUENCE_FLAG | + winkerberos.GSS_C_INTEG_FLAG | + winkerberos.GSS_C_CONF_FLAG + ) + _, ctx = winkerberos.authGSSClientInit(target_name, gssflags=gssflags) + + in_token = b'' + try: + negotiation_complete = False + while not negotiation_complete: + # GSSAPI is a "client goes first" SASL mechanism. Send the first "response" to the server and + # recieve its first challenge. + # Despite this, we can get channel binding, which includes CBTs for windows environments computed from + # the peer certificate, before starting. + status = winkerberos.authGSSClientStep(ctx, base64.b64encode(in_token).decode('utf-8'), + channel_bindings=get_channel_bindings(connection.socket)) + # figure out if we're done with our sasl negotiation + negotiation_complete = (status == winkerberos.AUTH_GSS_COMPLETE) + out_token = winkerberos.authGSSClientResponse(ctx) or '' + out_token_bytes = base64.b64decode(out_token) + result = send_sasl_negotiation(connection, controls, out_token_bytes) + in_token = result['saslCreds'] or b'' + + winkerberos.authGSSClientUnwrap( ctx,base64.b64encode(in_token).decode('utf-8')) + negotiated_token = '' + if winkerberos.authGSSClientResponse(ctx): + negotiated_token = base64.standard_b64decode(winkerberos.authGSSClientResponse(ctx)) + client_security_layers = _common_process_end_token_get_security_layers(negotiated_token) + # manually construct a message indicating use of authorization-only layer + # see winkerberos example: https://github.com/mongodb/winkerberos/blob/master/test/test_winkerberos.py + authz_only_msg = base64.b64encode(bytes(client_security_layers) + authz_id).decode('utf-8') + winkerberos.authGSSClientWrap(ctx, authz_only_msg) + out_token = winkerberos.authGSSClientResponse(ctx) or '' + + return send_sasl_negotiation(connection, controls, base64.b64decode(out_token)) + except (winkerberos.GSSError, LDAPCommunicationError): + abort_sasl_negotiation(connection, controls) + raise diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/plain.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/plain.py new file mode 100644 index 0000000..f7f7456 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/plain.py @@ -0,0 +1,70 @@ +""" +""" + +# Created on 2014.01.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +# payload for PLAIN mechanism +# message = [authzid] UTF8NUL authcid UTF8NUL passwd +# authcid = 1*SAFE ; MUST accept up to 255 octets +# authzid = 1*SAFE ; MUST accept up to 255 octets +# passwd = 1*SAFE ; MUST accept up to 255 octets +# UTF8NUL = %x00 ; UTF-8 encoded NUL character +# +# SAFE = UTF1 / UTF2 / UTF3 / UTF4 +# ;; any UTF-8 encoded Unicode character except NUL +# +# UTF1 = %x01-7F ;; except NUL +# UTF2 = %xC2-DF UTF0 +# UTF3 = %xE0 %xA0-BF UTF0 / %xE1-EC 2(UTF0) / +# %xED %x80-9F UTF0 / %xEE-EF 2(UTF0) +# UTF4 = %xF0 %x90-BF 2(UTF0) / %xF1-F3 3(UTF0) / +# %xF4 %x80-8F 2(UTF0) +# UTF0 = %x80-BF + +from ...protocol.sasl.sasl import send_sasl_negotiation +from .sasl import sasl_prep +from ...utils.conv import to_raw, to_unicode + + +def sasl_plain(connection, controls): + authzid = connection.sasl_credentials[0] + authcid = connection.sasl_credentials[1] + passwd = connection.sasl_credentials[2] + + payload = b'' + if authzid: + payload += to_raw(sasl_prep(to_unicode(authzid))) + + payload += b'\0' + + if authcid: + payload += to_raw(sasl_prep(to_unicode(authcid))) + + payload += b'\0' + + if passwd: + payload += to_raw(sasl_prep(to_unicode(passwd))) + + result = send_sasl_negotiation(connection, controls, payload) + + return result diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/sasl.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/sasl.py new file mode 100644 index 0000000..30fe0e9 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/sasl/sasl.py @@ -0,0 +1,171 @@ +""" +""" + +# Created on 2013.09.11 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import stringprep +from unicodedata import ucd_3_2_0 as unicode32 +from os import urandom +from binascii import hexlify + +from ... import SASL +from ...core.results import RESULT_AUTH_METHOD_NOT_SUPPORTED +from ...core.exceptions import LDAPSASLPrepError, LDAPPasswordIsMandatoryError + + +def sasl_prep(data): + """ + implement SASLPrep profile as per RFC4013: + it defines the "SASLprep" profile of the "stringprep" algorithm [StringPrep]. + The profile is designed for use in Simple Authentication and Security + Layer ([SASL]) mechanisms, such as [PLAIN], [CRAM-MD5], and + [DIGEST-MD5]. It may be applicable where simple user names and + passwords are used. This profile is not intended for use in + preparing identity strings that are not simple user names (e.g., + email addresses, domain names, distinguished names), or where + identity or password strings that are not character data, or require + different handling (e.g., case folding). + """ + + # mapping + prepared_data = '' + for c in data: + if stringprep.in_table_c12(c): + # non-ASCII space characters [StringPrep, C.1.2] that can be mapped to SPACE (U+0020) + prepared_data += ' ' + elif stringprep.in_table_b1(c): + # the "commonly mapped to nothing" characters [StringPrep, B.1] that can be mapped to nothing. + pass + else: + prepared_data += c + + # normalizing + # This profile specifies using Unicode normalization form KC + # The repertoire is Unicode 3.2 as per RFC 4013 (2) + + prepared_data = unicode32.normalize('NFKC', prepared_data) + + if not prepared_data: + raise LDAPSASLPrepError('SASLprep error: unable to normalize string') + + # prohibit + for c in prepared_data: + if stringprep.in_table_c12(c): + # Non-ASCII space characters [StringPrep, C.1.2] + raise LDAPSASLPrepError('SASLprep error: non-ASCII space character present') + elif stringprep.in_table_c21(c): + # ASCII control characters [StringPrep, C.2.1] + raise LDAPSASLPrepError('SASLprep error: ASCII control character present') + elif stringprep.in_table_c22(c): + # Non-ASCII control characters [StringPrep, C.2.2] + raise LDAPSASLPrepError('SASLprep error: non-ASCII control character present') + elif stringprep.in_table_c3(c): + # Private Use characters [StringPrep, C.3] + raise LDAPSASLPrepError('SASLprep error: private character present') + elif stringprep.in_table_c4(c): + # Non-character code points [StringPrep, C.4] + raise LDAPSASLPrepError('SASLprep error: non-character code point present') + elif stringprep.in_table_c5(c): + # Surrogate code points [StringPrep, C.5] + raise LDAPSASLPrepError('SASLprep error: surrogate code point present') + elif stringprep.in_table_c6(c): + # Inappropriate for plain text characters [StringPrep, C.6] + raise LDAPSASLPrepError('SASLprep error: inappropriate for plain text character present') + elif stringprep.in_table_c7(c): + # Inappropriate for canonical representation characters [StringPrep, C.7] + raise LDAPSASLPrepError('SASLprep error: inappropriate for canonical representation character present') + elif stringprep.in_table_c8(c): + # Change display properties or deprecated characters [StringPrep, C.8] + raise LDAPSASLPrepError('SASLprep error: change display property or deprecated character present') + elif stringprep.in_table_c9(c): + # Tagging characters [StringPrep, C.9] + raise LDAPSASLPrepError('SASLprep error: tagging character present') + + # check bidi + # if a string contains any r_and_al_cat character, the string MUST NOT contain any l_cat character. + flag_r_and_al_cat = False + flag_l_cat = False + for c in prepared_data: + if stringprep.in_table_d1(c): + flag_r_and_al_cat = True + elif stringprep.in_table_d2(c): + flag_l_cat = True + + if flag_r_and_al_cat and flag_l_cat: + raise LDAPSASLPrepError('SASLprep error: string cannot contain (R or AL) and L bidirectional chars') + + # If a string contains any r_and_al_cat character, a r_and_al_cat character MUST be the first character of the string + # and a r_and_al_cat character MUST be the last character of the string. + if flag_r_and_al_cat and not stringprep.in_table_d1(prepared_data[0]) and not stringprep.in_table_d2(prepared_data[-1]): + raise LDAPSASLPrepError('r_and_al_cat character present, must be first and last character of the string') + + return prepared_data + + +def validate_simple_password(password, accept_empty=False): + """ + validate simple password as per RFC4013 using sasl_prep: + """ + + if accept_empty and not password: + return password + elif not password: + raise LDAPPasswordIsMandatoryError("simple password can't be empty") + + if not isinstance(password, bytes): # bytes are returned raw, as per RFC (4.2) + password = sasl_prep(password) + if not isinstance(password, bytes): + password = password.encode('utf-8') + + return password + + +def abort_sasl_negotiation(connection, controls): + from ...operation.bind import bind_operation + + request = bind_operation(connection.version, SASL, None, None, '', None) + response = connection.post_send_single_response(connection.send('bindRequest', request, controls)) + if connection.strategy.sync: + result = connection.result + else: + result = connection.get_response(response)[0][0] + + return True if result['result'] == RESULT_AUTH_METHOD_NOT_SUPPORTED else False + + +def send_sasl_negotiation(connection, controls, payload): + from ...operation.bind import bind_operation + + request = bind_operation(connection.version, SASL, None, None, connection.sasl_mechanism, payload) + response = connection.post_send_single_response(connection.send('bindRequest', request, controls)) + + if connection.strategy.sync: + result = connection.result + else: + _, result = connection.get_response(response) + + return result + + +def random_hex_string(size): + return str(hexlify(urandom(size)).decode('ascii')) # str fix for Python 2 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05eff7661b0dcd773e3ef4c235b86a7bcf98844d GIT binary patch literal 153 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vBza+OnzaXjpvA`Hg78K=|&M4u=4F<|$LkeT U-r}&y%}*)KNwou+{TYZE03u)|)Bpeg literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/ad2012R2.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcb337b339d64bf67e27caa7f371d9be74690c3c GIT binary patch literal 330831 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%0D^gmXm z+pBOMzoD2tADnQ#P$mt zqT&Q_a|>aLj&4-89n9x3B@p-azIaGK4FPTT)8P<2Yh|E{$D^CbVhhRJ*oQple9ju3 z3vr{H959=qX$EW+hZYd_QNitHggmxcoz8$gVBJs9blL8Lr;cQ5U2f6rDoPG(++yP# z)hI;QOV&&FKsYK?d|wC$x3dbzd+?kjB4p4@75UH6*6MbR=}%+dx4*0dvQT{MhD$a)yO7AFcy)@XMpCo_ly`FH3D zFuqcnRi^zVZeUe`pu+|)04be39+UdaR~?D)u*J(woO3?Ta%Eabk72Y-%J&hjYjv z21YEM%w&$`PqPHvlof46PkYY~tB~(@I}fg?Z(@oJEa-O&B+jx0x6?}%61TIufiJTq z%ouI};10g)wB}x7Bep;ZT~6gQnauw#)}gxiX2;vO12Ceo#NaWO~;nmF0s_?C~E0_ z8mEcw6S^6SL*_BbuN3nQ@+9DUN4DjY{>x zq!!*;c3p!!Ym1!NC;&NcDrTRMr%?OcMTZyx*%_iBtmzk87$m39a4Gc&R0a7BLTk9E z9hS(f(t$a;G-_@N)+p6(DiTdgy_UB!gHO{Z&bqs&j01yvdl8|DK7x%W)P8@?L`vU& z|D7f^ibw289Dtqp17lA(uu3-Q&{x26o4T^>)u2U*t1C%XY1~t2{AqAextjhP8K6DG z2Q2(~B(qGG^&*Uc%#j`l7IZq^U1oD24?tW?UD%3C?HJwngcP}O`!@25_uA$m9a-=& z9e)&0I+F+KT}Fn@hYtyS0NJkgEU?!RHgV_Q*Zu+>f~hQVAy?<{Q%g_^tz?qBr+Yt9 zbflPgh*y}Rf|aC4cQM#xEvG|8+TCPHuE!p^qOVtMF*TBvaz}BHM{BUe=&$mFMaiYu zt4S!x?BIBi1nxIer0I15$rY z$NNr~8{N@S@%yjWdW@3Dt*|unXr0Y0Vxnf)5<|q43_ki*WCz;mA3!UOPE2kIjBa#t zN740)_Pi6y9bg&(m^bMT0!U&^G!<~dR42Kz_*r%$mg=M1;}4)*Ao)31-aSZ43PvX* zDM33XUX^U4a{C7V&X`c$C=KM*RtNfCZEUFu^MD~9k3e>B{s*(jG{cYNb=eZe3HC@#78eD{DBv`u2POY{xQz2cu|6WyP4 zt|_B1hsW6>4ruC&YN5m`Tip_U)?@It@+hDo#+J|o>xXK}ZtS9FWjC?mw+$A#(gGSE zauS!pqj2+kBAF_et;?8A{Tx;AL8Dj7EDM_<$SN@}O_n0D)c8)f@DeGBK&4tC`P zo|5HlUgS*ax9{0OuyOA==%JlP{CkE?0>t%^;Q?OJPOay>)>K^rhOY zyoa@i1P5mPZXOdg=N!I)XzO+k$$*=#)*0O&Alz>i&=CO?=UuYQ-w6GoqWxN4b)T;q zs!4anfJuD<$}nQf#ledfw>#`Ud)V+b$)P4B2p;cKumJWCqZvhOUv%)t#njadZ){>i zk8KO^k_764L9^hQk!d2Q-_B!SR04i+GYZPL;!Qs*^d!#kK)iJXG`SdsU~67@*9!C? zcA+hoJ7=iOKZtoLManKq+Q`J!?)jrH-c+p-w9o`dIGk!W1_gf;H+>d1##`>%=`y}r z1x+T>ZK-i|E%1ZHZc7E+howg=!ijdfOdCm@k#B;HgllRlYq7sBfk^M>sh>^(*Cm~A z9R*UgnbEKw0+$&2Awr*ITMY7cm*ZT3>Km`!cG1|1T>*|Mu`w;7+LG_9Vd-0Tr| zc|P?z8?6D@yq2Z|@B^~_q84SeEHWGSa9cKytv5gzb-2X0{yat{LKXEzVr8Z5fULPN zaVo-;R;esurC(k$k&WRGq_BV07>;cvc#SD_+Ngl@ciyucj3rixuJLU zeZJfzi1BgDYW&1Y^JUyFqiw+Um144LZCKjQ>yh3?g=^U7IYC(lV5k}g?!oFyXh_jz z2qZB}Gcj;X#i^nnzNg@_vlUYhDCCvZ6oKI~0LOxCBl18Pm?>7dC_$^_5rs|g;$^$C z(-weMa(tR4AJMglW0z4 z18j+kqlB)LrD%0nvfwYN{JpTAwxb7ScbLmfH2)H9($PlmviNW-ya<$EECi;{5B4ce z3~M;h`M%;Ws{s#`z7(x#xtjm|;_Pe_2GHgv#1R&z>2M|InOWGJ$B~}Jed{gCPJNDj zgAiTRn1vBsgM3LADOw6EVDI*LR`OWw=@BGz_tdSCh&*grM< z8qZ4n5hQ0#2@n$`JWOu^!6nvNp&(1*kSZDKGe={VA|MFOc%^%%J_J8#5Fl03WjnQe zO>ORj(H{bHQWv4`HBr#ku^7J`&#wmxlfRn*=RimSEB5W;8CIA(%fmb4Srh8;Zs+!J zyF(tz8MiE}j{zeetTroCFdvq&SQWds^BX}ERmk2=TjpUlAv%@MhZ_XcuF3Am8#@r{ z%Jf2;ac<$vfJ{s~cv%lt9ITyj>9P1K6vDXXXimw#2vAn@{VRRx)@^IH$OoOEii)oqbKtr8DU+89zn@CpSwTx0boJvxjo*LzYd~=Pl znU)Kq(U={3a(~oRVru42QuSpmdg|Ik?8^gg51AbWW1P}O0Om_o`k3PZMzr8sxE;o@twoDoUb*!ylj?@eZa+YH}a zD{k^A4W5KOQZ`Wry&qFiN_;n-KR1qmgJYkYShDg+@89YP^km(yFc%@7TS6XXXY8Ca z7*4kq>yET0E7`~Z9b82o%}@sC9V~*T zodpuRG)$=?+^~z|xFuxe&Yy!2b0CE^GRs%%X-OA6efFgTDlK&tx9*~@a|wN=Qa*qk zi6q)mVfDD4LuvRaFoM4KvBopDG5ZF9S-{6A046T=Q{dI$B(~hMlaF-B__RnvZ%TUe zXcmZ5!jDKnp>MTuDz-Me<;sV{q5hR7N;eyPwV4S>Ejsm4_I5G9x)wQLDcY5(C0wO3 z1ld)7noNHorZU;9vCLnfO~&YkRWe?=P!EgNWI8cjYSX{n&W3+|_ZJ878A$tkq$GhF zDzWCY$M`S;-S|g2$@s7+hgb-)=Y~h(3%}RTk!sy3{bAA*E*T(%by$nM&lw zD4+s8qf$Uq6@%1_@Af1{=pZp3!DNMj&fCmW;76Ak0R{MwWt$>bMY1U>sq$*NVJsVd zBre=o%H)8Pc`#hiHw3`|$z|THFV+H<3jKoXn;Ax|HWEU1!0oP)P!Aq2b%TgZv*odZ zY0Kc&bvF1Gk6jPLQF%o1+Oo}cI7C#M#gC7wS1OWLXob!9hfo|1hj*h((XK3gSgs2B zA8FipAoQ4}0A~VcmW!stA2;sbo51_;xF_hD%qq^pFzayLf{Xa zD50?SnfO(~#53v|1OP-qipoSuV0T{h;H)ECDN7I(iS{T#(0D4<$)^vd(HB2d>=dOv z?RC^@Xw+`b;Hn8!-vo*W0Ws?I*-bFR2AHWgVs>%3&k}97qUUIvqqi6RIOs7k9t_6 zU#_|3;D_WS1KM>2=&ujYytrnC!m-I)p|)TODnUZ{RB#m*m)WZWwtcvRY)IQ=0l+Vi z-6?1WrfYvL`Ye_&2=0j4J8TzR*lco8>L<6C_r9By1B8kb7pi#jEQ|Ubb*mqm4McX< zR?iek-?IV{5ow5Vl5E^??q7plD-_P7w|%Kyu0`r5D=^izE+G3m~e&ib&`K zR4i&VL0T%Q2gTghE=1+Q{!7QEI{Db>xqJM{`B=t#}v}M#9D{ z;}qbZn~J--@i8Du1b;8Cws*(d)>(Gp$cr08tWN%y2qR^6E;5ULYV@(omh3Wb-2DDp z)dcBW>BYSjDeXBU8xlqFpnD8Or@X^*A=|UlVR$(FojXwSEZy})KK9*GoVx?#vahqr z3zx&ooCa8~JxWSVw&e?Mdduu|A@L(RYPm~*7{TPxl@P1o06IkWaAdBees|gQGV@G> zHON?rtg224)J{2Euwqg?o;n$NU=m1nkuZ=(idISB`+ond?KmwWU=-IWWM{miNxRH; zp1g$f-;os6wHTTFZ0EdW+r=cDg590AKKapQgtTk`N5IGAl3izP=VRM8thPD4e|*7O z&=24#z{Gpeb}f$>t&^F}S;x^6KtV_Kw{&rmt0HrnUs_N=6IaNG(J zxvAGYk+TS7mC@n_jjGal!2+;BRndj{NA-;2ETbZlD64P*4H}uoQj{{3T^0)Pj`McF zOUg??D4zp2gK|W1%SW>b=WG)Ykud`Y>hs8N7Z=E9`ynjJK#@%PaFXZf+c+G0Unx!O{TBG&?!sl0z~l>V zeKLWehj=&*60rPWy6(|-y|=5*Q~(IyNkkd7#7^?4DV4)1h8%7PQjli`cN}e-6($*D zjJZNjSuB;!RY>8aoYSRZynTP4wf#DO-(xBo4d0yj?w1dsy#5w=<@anS&l#fFs7a&_(PEC{HB*>xe9ZHc zg^ZMxkUUsw(Ba3bNSCA36=^2Rv`2^iyEXc8;Jh~uzUlCr^gW>d*O;Jgu-iuP_9yA1MvO~}&SCcQ@uhg7~I!K$ZN(KA!L$`x))klt5XI-#u#^nkhw;& zPUf-h$eHYzK@r2&MnN|qRtYKoaQ<@n3{OsVr;5(m@)Mwyy<`fm7SxxkoU24LaS+^_ zidi+F$|PqN)fII2l|GAMmnn4ly-lXA&sA!oY9D%FUA+!gfpENl+}S{lCr<^yr{&zG zD)xK?Prfi@lGBSCtN7?~tYB-8Sf?3|f{jMgNqvY&5t zZ0+|wqa?iPkiit94Uyfmco=!7Ak3`hU^FFwKA?F~b^Vu{aAO%Mg*7jPS`y zya*O*@@TGpoZHb(h0AS|S2q!?al*4CRVji!YNf6sjgaH{vf&NV2PD@;Ak{QlRbvM4 zhphrmprs6H1IxCVS}D864^i~xK8mDfOY9tWcs!9Ig|Uwqg*wR`D4cA-l>knFDIq=I zq}IitfjlNBALIv0Zb`HOGYj0brU7K;u^3yEJ(dhsOs)}`Q5*r!glayo+hev|L7&)V!;pA1R(yQuoS7lZgohiZnkY;3faGK_K>L~dLM@&~n<5J?lMrc6fSO`V z(Bx5vf4Y*=3RntZpHqT);7>>)L!ux$L(8?>tb^uvH>w#Ohq@5bG)V;pmC;VeIMBrF zNlC}4u5!&a_SG_SG)FYw(A|>m6$V0kG8{S*;VsUKfI-piNre+>>fDLNoYn_5 z$_N?q;wlyHlpTJ~85DfT8Cq>uQA)OnGE>C`_m{8**_nOUWW48RXcN(5a%n_~+`RCt zCv5uL_2=oAjZp4)L{jEuoHIy{fZ}gbDFp+2!5daY@MRA6I!y4gU2^og0(;RnZ`csV z10A*Oy6CnKis-yaaKvh8g?|r9u2K%^qlp7Ay;lvM)`#ig0xU`|wi zG`>LCS7ep`p|(cjCoWfbK))bg8^t9BzxM{^W~9wAq@ptT?EC8pkzxAYzeSHSuT-Gh zD})r?BK&SCFJU{D1I|JsZc zBIFqA9P=+osK&y$edFUph!kc74yx0-`tFBzpzlv73JpMixP=U}bps{@O;S~v2>opbKXP_Eg~fXfLDnk2$B>Vd4webxjtzDz7s za>L=|a}?Arkv+;rwI6cD(zsP?JFW=oDINNXi+8&Bjn>&`nV(_!Lr+Ad!UC{OqSb6A zxzE1!J|ADSynM6$GvoWkDodBO*N6*emb$jxF@ZUJzIxWAwp(o~R-8!AdJr@qgCIe# z^U+$~ClZDxg3t-Wu^zCl+#X@lP;$cA<1i^ZH%;T<5moy_6CCrliuNltHAeL_$7!be zKL-BNW1eHtl9GK^xwG8tuc~7ZCP2Wcy4>WVd6%}bpOOEzwSpNxO>VcIQs5pDlRw%ssCVH@$gJW#&WhXV5N0^NEW#JG>~f>!R)T_=9l! z5{s%m2M!kr3w!tUgoNLRNY-ski%8WGx6&x*mT--qLl70*k8VZcw6h;;aUx&=N8;Y} zVXUy!umUtaSM*t|Edk>uR*CNP&U(B7=avJIZCCH**iup^6xjd?(=?>c+=YJwAgfjW@#-QSX0ZjjUH zBs0RmJ^_N%bYBDd){UyxO$S#YK!8hvPby+AX%qP#OPnRXjC64;P5Wt1hkN3v*Ij#QU__>_&*BCvG=m*Z z6rBu(q^#l2P@N3L_4cM?Y|Yz%=do}gGTqGQ=v#Q&pmiGEP6bRJrTvSaMzH$>tU%s< zrNIzE__yZg)15ne9JpViRLVMKbr+mI&UHjK>u}wC*GQLp9_Cb~vuP%j=nRTA83SMv zxd?rAa?ESGpARF!OK*&DQ&7H&;h6}Z=L(&;tb;Q-K)k_kYD7&vJ&b?~!Z#WL#Q=D< zvL5Z@nS2)b)xHMNCi(B+_<{Ar7!~!&vM~|b?Yj=1z>!|oKzsF}Wm=$pRvsHaR*B&u zh%|O4dQC9nm+sM^ntM2NXZ07n` zVKEqS&}(UmDyPn2R)bZd`!+Rx;eNC9lW}+nwTuav(8zE^YO-3$4ACH`bpR}gC;|!v z;!=PqzYE#QJ5bhOV{ycZZ#!;~JB*pNMJX^o74;l_=bOWVwB54n>=Wj>FuzOMrf zngwPx5E6s!=+BDxw6B})-0U-o7j78*P+1G`i0+I8->Wh9NO4wpGC%%tlK|fdh9Afc zMsk+o&ALB&NB3rCmW4I5vH*!RN=(@2iuhBU7}B77B6veYU5Y99?~nv{eEaG8s`cCO z`r%4gYIFJnlM+!`m(c`?YCWe9sJ)W*sc>&P(uy9Y=Hwce(iDZ{4spDR9=qkcV8K-G z3m9R92WmqQLJ66i_)AR#1aB+k^$p08fvd<;@rkOb+_-2YQ)p<>=^h9w<@sO0Th7tH z21t--S&7Qod8UNZH)2af4xlAm-bQy%A2FP$B(r;;i=`|%eP#zxo|;Cm|`1$oJF= zNDnCDoO!S|_3k)Iqj@=tuwP|C8Y|AOLeS57+$7XSR@Xmj`DULF$SFHdHZRmRJ-{Gh zN_hPiEia#G9BfhckM@{5XGSVRYRRH(D7p=|OQ3r%jRFM=w`_1>I%lcF=q7+tl#bI7 ziRI4mfVt8rJ>7X8AM_Q@O=WZ6kOA4j=VJdk{%_+oNNJQ+Zt9QA={ zg~k)QsN*j6zt8-5g&_jVniRmKt|bp2&`0L^(IfP-uAAb+*ej{z5y@6z$Vcq2lk)7x zyLsxTQ}h%Nx2|>eKa0Xl#HZ44_pK%r891iiV>RG1?ox=N$J+U3OH{jWVS!-?M4DcAs!M2tp1_;4mwQnp(4Lew&OEarru;Iji zh^MX`iaPbHbEI7?bPa~e=1~JSib3GBND1gQC?t-ia4O7gCr@upZ|=y|zWXL_(YAA- zP|VJgc&*S+TNEd?FeJ0n`ZUoDrY}wRE_Ru}5D<+OMo19~s7~j-r2+S9(sH>jXqx z1VTZgf>^5we)k}y_$GQZwwA10ZZ3vDOn7OT^_1^1-=cyMaphjNj^*Akh^Z8Xt6BEM zBE~uI8j9B1%_LYa=N#}*Fc9bl+!4edp&G-6;atkvXmt*FU5e$joogzEX`*&{ce#-| zO5(Ht2<`aPHK84GocS|%Db)UgM_Qr%0i7;sqihrO)P^QG&U9Vr(;>`dKnI(ia zSQmjYy1-$EWdbGfowUEgY<;v!0q0V@+`S=`RBp4JMk&}J1lQJ8*06gO0mjaoB>aK# zkLI$sU*p`e%bCka>?J>VX9J)a;On7?Fq@&Y#Yg&h=%i|!QmRX%b4GqWRElJ$ zndlkQpZNZ8nFw!4n43U8kfD341T6c{L-6e9ic+-?5PdA%z?*>Yo(5V@g{{bz zrpFl+K)ci#hN=Llx0~+^Cl&j@g=R**PVTAk%JQ^W!-_G_W#t;RjGvgFT zH#4#PTB;-taYMRSVe7Bu#&Cs&-i?nSJ=TLOFr=r(CCUyFs@7O7=)7r$Y^qagk_b#? zP{aMG#y3|@xoZd%2L&M4Z2BQ44p0E9LP7~g;ZXfoq>C&ovaH^fAwl(P4ItT~ z9?z}K(#BIQ2^1!=H$9f_{QWtfIAWX}U(z&{-hiDIUBCfx&Rz4|IXRoJT6OrNFky>k zvxr1X@{)E;tI0cYax5$?fYdUGucc3e>Wc|*P``Tw2LC3AW3VP&kO@zBfimZ z+P1M*qBm)TK$bP*G5{t5rml=ajWGJ9<2~R-ce>`2kXaI!!fk^gru3g3(tDEB~bVh(Tv6G^f{zi~7Y-;L+b6i~~KSDG{@1zBd`7$;dfzUUfl z!XIcOj=Wadfl}!%(SmzqbjJmUIp@|63~dP@pHvn_1(e5e%S_GAb38yJ^ttOev$wbY zw@fD@Ukn$rPOGul1j5Xlq|8n;rtHjxK?tSwjhRD6#t%&mOSX!5L;c+UPVT{p#?Hf0 z*D=b5t8Zg88KI8`3#hB~I}C4uBh>4KXbsIdYO1`vwRMX^0v zG~*c8-pyHNkX3twBop#_nFprZBzXjfqJ}JPc5hYjz*fmV^Xz1Lmg2_cGSK18-SjYj zsKVBu{hmF84EVDIP+}Uo>jan(1%ZqTNx8OP;bQf+l<>;lt4 zXLezn08f_@STP-2$+PQ4-xTA6OtLKR6|S1moiO=jJS>f=B`Q|Yo-Nmh|7Ki8 z^`b79(Z(Am%`+hN`^Iss_CUmCVoNy#bl)WZj2bHt)+ib<7|-oA$zJ<)OvaiEJ{l7& zrN|nIKgva?GU1%Xm*&)oY~Edp$KqO@GNEORbYafWf*SSSYO*6rs^%?INp&0|>*g*| z!$sd`31hhTO0Bj`NoA7+T4t7Ui$TuL;oAq*XAmW@w+MUD5g}3+Qnno^WOIXP@qe>< zzde4O8jw2i-7g>9(EAp6=`+}O8Um#f64rQ9A&`+%J;kK)hN&(Wevn&JREWA|@p5?N z%S2i_^VGiuVFLNgnxusOag8L?S;4N%rs&>_LJz_T+~1cpS_@qWVH$$E4vJLTx2oWNdFP-xQk1kVLZfj|~$6gU|pufYU29>?~66fGzyeDI%Lh-_R3t+L~+$i20lU7;<_XsA`PuPv?F>ObU4T{y4JtxsqN<0tDr z{PD;>0y;q2@C-|CqpB)0j#80H9_SE6Sc>a@%^0MNe)S1NQ;US=~GPyUUAcsFb1V2a?L?>yv;{iVif)9*> z1$42@tV*poRaVXAJ^M>y1#f&@(K-9GUbI5j;P0q^)kp~M*_swaldx-)NC*9o1qFfr zNAy5`zWN(YRf#bbFP+U~YFhHX_QeF83HG8n5c^?TvmcKnvf?>ccqLuV)+FOm79EI$ ze$Pc!EP+H+>2Xa*4Aaqr4n^xpcs;5X@8m#6o#q81Yl|Us$0M;NYUnX*8@AT$^)Aq@tq)01jD^}W|C!2 zno}GUx={gCB#^e-WI%$Nf%4IvC&3DOnTMg&K>W*}xzpncPiEi>$l9hGpYln(YJl7@ z1Z$YWFp19D(z>>tLiz|;%nCn`NM&*IvVsRaol@c903X!p77%W#cSx~AWeBq-Po>WR zz($iwBA@1M=BYT1DAyne>vFYU3hNx_?dV1@oxy}1O7Inv4O1%=k6K^_tgjq+EKU&V z?#Tx5M-@7?&v8GI9_m~eq<)1&92t#`%-ytnfgPT`n^n9r+zff4M(FDxl@D#q$S9p8J?Df{M73Y-~09dQ!S8*qMg~n1hbh)c(t*HGjhlQp!G!6tZ zAIwr@ok6kj#Sr589=)KFO02lRPMym1*57Y~qC3mpM{3UPK`B?+^X&8M%(QS0V7z;f zT``jQCC}$y|NPJIvVZ>f|H5DXc^>}xzrOo#{A>CXe;zItvA=-8R{s@mJR|T00$i1N z+x`3h@@_}Dt4t=UblE{d1yCY0`!RocH+=Z(yMK9y%)=59d$11hv)}!%?@%lazAIig z{32MBj=~p-yV4OTzV=>FFAC;5*F@h__<>A=(f3t0;~rEzAf4qul@U#k5ID?z{3*3g z{+Fmh!+j(c4(8p>@Ne(_1?X!!N;gC_8RIK`^*Y2--iv*H;r5aV04|Y1T$|GwtbZM0kT@#g@U=m*n7=hEt zRi7L~_EyPwzooa781)L^Z{O9U3%c%ttlvGrOHYu0u zl|KUBzLV5do*<@DWRZIea8n9E5J+McruiZ3ML(&y3KeJ2*rlwx&;UD3TjTw5ImtSu zPp4dU%H`23TSX1waWiZ?oP8uPgPHtsI`OI#H`O1l5HP|cFNgi%l<2#ghw1Fyzs$pT z|EjA($Vd5WVglkq&<2&?LIs*CMd($=|1I435vueuS}yg>c>G=kZ#e(%wfl%4?mgU( z@mpx8|27V@3e$%u`hwpxE8)u}Dx>ok;vlCo(dbtF5LiG1Xef{rnQxVwhK5VsG*tav z(^9nOyP&I69Y^>!eWq>ZSo}7oGp68{$KY!3?mn-Rai1do$THtYqIlFKo+mv}p$FP!q@!W=JvrW4Hlr$;q0)^erd%a^(v7DyM%CF}yziJs zS-7Kwmm7y*I0@&c%y#v0IgIR#iBXY;GO?i^1*%_5k%^qN+m3cq@6_0#%6EFIfGRZy z$*bZLhD&XrLa2V;#S6s73H8nW!DKDVENC$IRAEh%;Z27BrCtP+aX3mgVP`fc0`O!* z<4UPT7+g@G^uQNjNg|+dy!CO2kBj~SxB1d9Y9}b%WoppNx+ghBS{^?srAaUf+_Uwo z+vw9J4#Zz8AT<7@JD*b{4xLWcZ(RQCpO(?1yMz-Ba23!mNe+gl8L-8vNcel3F!=re zb78y_{FW-bG?OP$KYC6CYYfR|Zac>;z32PwSH9nQ<@@KaeE;H=?{{DMe(#m<_h0$` z;Fa$?XRrN%*G>>Ye0IBgju^d-ul#}64iWv^ul$79j?sDT9G%w=60D6s{|sn0+nbvM z-ko!ri{jUSlF`GY_wq}$@|pJqzqgElmzshfg1QcL+XJ;y>G2)>Tj;~izjnX#*T1`Q z2)GshdK|iNJ-#YcQ=nkv?-Lc56j9F*!Y9D+)nJ+!ISEC@`Uf*Kve+21bvwMddiNLI zta9>Uj1RNp0CHl`q!aSQAmN_Lr2OHWnF<-J<|m;!a3%{=(a$7J#Bld2D31%Zms3Lf zCkX~1Oa`UqS4uJ5p5PHbIkK!@&;%^-;iz8_xJ{a0tY&MTY{`y(L^8&ZH&B}Nqzfxk z+3j{NRaq_b4;lzp*p3RB>KgyVMbMgY)lDH@oKu$k7?2p6%uPNnYX0o6Fdg#rk}FQV z&14vGa=@%gqd~wSfPP}#e|$Q&J&)U@qgB`sz9ecge+m|xQ!R9_UyX?{#yvrKF9nao z$&r3nmA=os5@bbm#Fn`wkg#l)^66DpzsfVyq^hAX59lsDb=ha`F9ABe6Q)_TxUH`5UK@tIW~GmZQuqDHY8^OFy|WTs_3lxzkBk1h;(y z5CF@@Ejr;&$5j1z3yI8}&>nT26Zs`so@yts-8F?QrSWbQODRUoDDZm*BK^b3+X+&O zIj1K`?IVW1yaot;4G;Pn9P~9b=xbom*RY_kK|xJwa*#;2}AA?I8aMklHP7 zYhgD&53Ewv+W8-k)+wV22i~&)K?GR&C=DC6yDO9*&`j?_gB%ZfIE1DUHu>iw5xz7w z=^9_V8mE$+ib*DmvB#f8^MOGVkQ1)qJ&M8Ogqh#xgm+ABJkg|Ce>jI*g1JLF(TJ9A zEx=67KiolSQ!y`2s)3<+++cEY5Tf@^LF#CHc>cSk(Np;CdHGKj+cbC<2xbw_{p)BE zJw4%X?3;#*Z!IzXJ=&zB43C!m&fO-xdxSaD2*2M^R*t^Wx2D6bkGMSuWz;q|fxN$P1nV-%~TThAH(AA#u9GcfzaLhw0$%uE;clkw})F7Rt|isEQV?TZ*45GY;Ks9zwKmp-a#B z4gcemzxMp(3u>>}8ucvUo8jyx`0jfnH9iKvj>jV%=*K(-6~CKejAwR4YyZnN`nd6% z_zEqLx(^G(MCeYbMQbr3IEwn>ZcQ*w`cRmhj(lD=VJ*uYDE3M9J$#EKDkSNoSyhFf zrd$r7mZ{}s7H<;3gD|tk{H@_~N#6h+K zbQrHleH14b)_AacQ=-NlD-ik9K*6~iLZ^}*J_%ZN2A)xPt0dDAn6r9mAtm05#;!uB&u4! z_e^R{`Cg1qIoU&{+)KW)X-+SW@D#eZ4o}QpVU+VtumH$Y4~9L-Wu;s?Jcnd8ZB2i@ zZrxoECsP$=pH7TUYIu0F-hP z%!;Snd4FMWwyx(P1DKqcI5M%S4j-HghC zv?(3jJy9m5;G{kU-TUxo?VeF&n1?mFX%&Dh8WMD>8Nc>e&rEhlQv%)l?(&`{s-1d| z=;ZKLb%Dyf%qU*CVemu2)m)ltcPdxydz?<;anhW=lI=Xzi_OEVG6x7Mxo>}!eD;zS z!lkeGQIrDHc8UTjqkwkDWMDIV)yz#!5z`*&;z(Sbl^Q*9>Yz;2#1S>_v+EkS;5eOL#p!X)&xE&TlFN9CN2$;6bZ`|1XR7fge1<;S2HOY-rvr({u8vZ#HQI|xK8 zdE>_mpR(OqPSRhkm#2=jy%0iXnOP;1&*K)*Z>@WO9--Fq(gLqu_{Zx;K2f}%DBjbI zy89LU%?Y6N$^oHFMC6Z1@a{t}y>^6X{e0yoyvCCc67g4l!fQx7=Sw8p*%mGSmlYe`9ZFdn_pX}94;xWYUj$hq6%yD zhZCnP+c6Ij;uOI_)je6Mzx3D7pwhqHtRDRse}@M5Oxz^-7R5A>fqvP*s3L#9iG%cI ztgJ64Inc_<20n|wf<1PZ7#@)sW|}q-s}Te_=ezW;oCXjq!hP?%P@nIBG{o@ic)4(8AgF3kEGMVTk#SR%0XkEXWnOi z`BCQAeBZk4y$`uboyg4Yb|aaIRPyZmb?tRuFPaCzV2AR?7zo^T`eF?f5bfM`Mw)32 zg5e&z@UK6_YufEU6r*N$*O#jz{K#mCA`*sWJ~ zy&5ka>zZA)x?-(GKEL>B+kyYz{noJijifeEu(y6a!SBB+<`OIPv>cU-9UcZeOx*zb zt;7@18-nGxyN$e!DTeB(S2_KF(1SH&vNVIc{tbRSck7&mdd)Y^#*imft>Xah7QJ%3 zWBp_$Du?jbA0pad)y@%kN#55T(Yb{K1b-)fv4IO0<^9-&4Po-9TdORB+=$$9FnPZ_-Mct#UG7}xMmDd?w1Smg zznCq`J0rSU%LRhS*nx zR&q6SFDB$KE}duK_o&gZJ9YU}7nB)<@F6feS3`?#Ih^bs%={T^2FC|tme+ zH_u_aXa<6sZS>*d=-KR~{ifMGrNS0s+U|f@9*8wUXciN}kXC9hZ+FTH`SohFmtfw$ARjWGIR;3n5?H&7n!TuvrW5gc)=pZxg~~3}p&zcn9b@Xz2D7;+BlBPp)7OE)WuD zc1M9_Dc0tGw3%U?m#g0RzSwbtHy<#8i@|J0_#y8Y(Yy{cv{yW?xV+-sHshKxo(_z6KO_1O!s>WbonL2AojQjO9x`6L%xC(sb3BGQ+|c+eyLg7U=sElc zH}%bnCQR;~@j04zPi_wO&wAysH7s%AcMPiBy1jhy(r@Ylg8tL;cGla)AK7%o4qhC- z@T+OchQPfu5QCyo5;;;g8)_^wZ&@^Rpyrkx;GL;L&b@;*Z^RPy3@yD z(Yvczr}5JFmDZZWAv_$;W|LXBeYxA-%=Q|u#n;TxYf+~S9PC}_=UnLL#+z_2)cg=8 zh~T3_1rkocc8@xMt}1-`qcoY__r~RqqI=gHUQLF(hsoBc3Dr9Xlgry(^aa6k@{e}& zjT37^*lsj8+`;+`tbYkDPdjH87Nt9d@fRan?ba*1UhpMa@hjJT=nW=c42Ri0i@9ep zcow-UheCwFx~cyO2Gl!RmvAiy*66eLmA?R^IhCz{+-pO{bJiQS`h93(h>HJCYcaok z3@;N_58-9LTNcY5Zjn1^^aAf}sL{NAakfX3Id~e|1zgTvOsrQhnHCZDNjZcEpxtBX zxV^uQ;>>qP^lUgpZ{6f=`tUf1|CJ%h>)oZ>@ERVxIB>QPgbP!6!29)GxSjjUo%_q3 z`^%mC%W-Sr$Kdr7&MSeaZ1-;YYjA)0H_tRKjm2`#d&5jE*PS^zF6ZaP;@263y`~^1 zXe^1w@GknWb1BWOfuq8S2>>`AI|qA0v)dXum7c5-EHcU9*pXCu{^M)6ED?71_r2k= zxZZgN+QbKHMyHK)YU$sMKaD3}#ye$wfmQsI=L)@YN#D6yk+tIe#by^dq$1Qv3W5t^4~~f!>PW;X_5N{8jNj@w=n; zA5Jc=j=R_Vb=rED@30)t7rk*`0P%WXhxtmQ$)LP@ye>yYchMV7*XuR+;b(k*{}r5w zyghuoakk^^1jFp|ookHXwyC$S_su17!Sl~wAM1^ttJk|)Os3D{QILI}d)HeB&*q9u zgPC{JbXpv!nNABWSs_#T+h^UI%V!wIv+niPP5b)hs&%SCp{?BUR}`CrC9d=o4Tw*M zz599mRO8I`gyysV{49e^8|Vz8*Fw!na>KakUO)R!{W01(YyIije}Y+K*&7-$^Ec0i z7{Y}AE&1mQLO|mG^P*@C=S()+3toZvWmXt5;k=w{=x-!}>N)F8r9yV(IXl&THxdpO z>FM*zNoht*tt_<6FjPG%?t07N!si>(&w5{F#C*hI^L|!xNis{D8K4hu-W$F@irbanp^?rFJ{wOIWP7u%E7k7#?oy#BiXwyM$;iW z-Mi=<$*h@!-+O`hucWpwyOr-7oRYnBc(v;5wp(pc;VOSrkSG;sR@^zdo`?-R)kAAf zQjPii?eEVf^Z8YAmzaj<&N7#Ed3oMl-rbd7v7*MEcvn31K9`f(-uJ~U-ZE%Vtryk3 z=!(&wS3mv=MZ!g)i5`e6WR82c!(w1Y)0?K3(*MqxFQ*{?zf5MI@;m1DlKcfL=qv`k zsl1wlBG@P5YgrCBtlqeHFZcA@Z>MxM>dij|0Pxg(RY>DEpsH{MKYJTspG*!g#ehy9 z!{&763;8pH`*Z#%db9q+d(4Wb>~=Xv1lsxBpA;lP@ofQdwR#Q+-|dN%XXXXYLBDu6 z;mvkI$WbvYaYY|B&mb4HHjC-QWL$)KGv#aLYf*f?E@q<=Ci0yDpt>lrpy9h-e-4e$ zVR60I$XC3qad=b?osCTytxu^KlGc z_-~%wU#4#o1-pa_LAVP|PAj;0SdMPT(BnOw+)p-LkTq{`jo^W>qEl(Tch&FM>1cU7ECvf}Qs(Wv@+%&fa$4Vh|}drE=4 zzp*E#;zyDVdkLcAJabh~lW7U~(&D?yMXfiX#({HL5qTbXCR|wNx0Npjis13To_s1m zwl9jyVs|de<8dzLbN-!)oS{d6BE6w}wMVTk$Mhb-%w1Rr3vM>an~c zEPe(Mhckh@!tJ%(&j2?_IW0aH1d|w-R%l^z8tXt)*#OExWuTb5z*loH!Sl(*oo9x` zE}rX)yQH4x9ChEF!IE2|b;J}r!0^%X5EG7y-hlLlrnGzghk~DzCBZjFc|IBY)?I%+ z1(3|8a|l{It^!n$7^^p|00(Gkn=cl9ZM58To`tmxIVEw# z$pqQg(M>+99LrrO29jO(5Qmtlch^UEcF9+X2zf|n#b^TjM5bd8+VtbKK^y#XSoEoQ z1impKUbH-KJJK%b0zrM zQO6+$0&406Y$QbYG~+#9r?n ztI6rBH#qN_=RUrHpwkf5y)*A3OgX@iC-C!!5`iGP$L)iVDqnaUFXS3%RamEw8I0t5 zh6o6)aUX$jLir>3Lg`~)T0>ZZqP3ABuITaVr2TTg(V#a4xCY=$74xK<554(As25t4 zEKoz>t#y0D#c46VU+~)MSR}UtbVHDf*dV6(@%T?V7ChhA*QcS14{;@#^A~499q=Z^ zO9rs2xgc-al`cL|74ktq-{Kk!aj5|?D~dJJHmfX*6-j$YD*ir+Z&d1t(? zD*E{DwC4IyCD1t&D=L9FUz^uurL3Wsnrc*iKtC&)syyAPk3KYmw^$sH?p_F2jSK9= zeHIW$Hj31P*2jLrCV34hh_h*6hfPc^?VFItV0E(#3!xr^#ie}$xt@5_x1A2pamiT&>3h#^>+l^WaXB{piQi(wcusO zjUS=XxcIub61so-WneFsK63c}0Ne(KVWF8B_<+U$QI2U>YEF*N68Z;?a_E4C3&ntz zEilhV(;fk%=FpM~A1b;rM_%|AhO>{dJ}@}&Z5n)NU*cR+G@ChqXZrR(^rz~-AI}BH zfNzQ??WeO%ne0@$Dn2^O08)TVmxRzpQ9uYohgcC`egc#y%fzm%2_GBz5}Lxl&cHFT z4BEd5gSjfBH~3pG03OZ@fT4=t9#Bv z5KvJ|0?tB0)y{XKXW|)a4;tw0cr7^dZzsVVf6}*+zOSN{d=_|;(P0m%V0h>@{WK8z z6GjpO5RB&6txLEmTmX3li?RSoumz4==?bSz>H{h*CjAL`ta2tKEw=a$5q)dFERb(j zP3cNVJqpF0T>_#*R4Gt3r?PGG_Gqc=-t4}>`~D9=$!iWJ_$>36&N=hNqO(U+ z3E0?s`Az27P?JYs83CtmfzOYpvQNLWm{ti|{j%q+@@NjrTR9J4gbkDpu0yqB3zBm= z1&)H_%Tr_XuywO9#|%hA<5gGQ`-c+6D=DXBmIDV_m?Wq`q#&GRB*weJg)hm6GTspo z3_5XAv}-xNpY;Y*H5e@WxCp#G&jBBbZ7s6S?szmOO8r84FQ%!9-UZhz9S&aZr_; zFQNB4e`61Rt~*DD!Xp<92&Yf9RmPM+`htvWk&CQ+oloAk zF=8-g$cttR%2nm?W3x$h4VR8{00f(tqDN-4U|$3}>Ak55_dw|%IplCzUCxR=k2Bz;ZJo}bd(py)$1%OGEBF)MS$rikcFDqk z%I;J>4n?r^A}I?FM8{OCw8<41wT=Ur7Xt&t)`mZPHu*1r$5?P9F_plpc4n8U_Q7og zx5l%pR=3JDIVy$eF3vnRKh{^M_r1KHLB->ky!)C%kbQALp5CXYo_HSh!j`VW&4aMY@114qz3 z>zo}|he7O_h)GF6J)2BML8Ac53=2`v3d$hTEL9v(6tB~)Sm4C4_T*Mo0H7HuuT*b2 zC|UI%rp5iGHPi1wPS%Hx8fy=VX>YdRGZwpZt%OrJDPN)?6yumLKeoH@XF-hW7D9l* z%~dDAe>trx-#ubS9wX&|#Gb@Nl`Xq^H7=97>N-GN~Dm+w~fTlbF zAc}ynlVRC^H0mI*{1U(l?Dx}826y4L-+O4`Oa)I1(jL+#LW&PdYU}n#d!Kq)K=-L=j*zs>D5aEq?^iEGt z9Abi%@=(gf0+*Ds+}gLP@!Aow>Bmk2MXGf0s#JsBRiW3N>7}9-6K~)s(5DZN#>Wmm zZm7SYUqF~T^Z63okt1NClt8j`$T(?{USWYC{rKy&RFPy547E0AOyW}WCOjLyI%9Q1bDa8<5vKP%% zb;6|6xd{fR@Ncyk7IH0@J=8|W6VD*PD*67O`!M6_PhfH#Aa9!3{&)Zpr8>1ma=6`e z^NqigjolQ~wj|f^lK|8r!pnZbp_a9j3eI@2k;F%&ny^8WJM%CeI9H4GQg)pLkl~>b zX#++wrm}-QV#c#b;cH%}4{mKJzfj~1ALon1?qYe%iCNakWL7{pZz)cV3BwsB{5$ZM z)ivw~=nN71!i#yQ~fZDLH4fYXLz(OtVmSeDV`TKZ^UZEgk43N1)>u|jl zv;t`1l!G%_ZzCCU%U@xjB$t9v zimIaDh$ABX6T-QsJ+gHRBf48}R-jW|R|w1p>WFQ9qatrqZ-#RcNS29Vi`=d*#Qwy= zWSBo~T=tFzm+1CdVZDus8{yvCS-pd9g2MQC%;YT$_eaMjFQyt$!~}viWA|B~IIga@ zXekaf>~rl+y&6C>Q4BL;yGR30MYcT=vd;LUJY|X=B%F6^63~P7siIwwG5@*Ow{yTj zTZi@E?B;&F_+lnpju)aTfQ#81=~AkADW+Bqtsy98on**vTwS+X`sqeY;S^567GIb{ zJ67pen$k{} zJP4XZa6i!#5?xu@?!jeD(Hh`)EKG+-5{}2NyDXnTW=82q-<87P5n_TX0$K(t9MIz@ zj0CRD;mHdnwJ#w3!R2M%d@U1I+mor{-cq^^HAvO1@lUhuKtBlwMKZ%X6-EM&ptB+! z>V*L_DX)sHx+G9r#F&<`=5zuIUDV2@?8l;j76>{m27f=fWiegp2vnpP#{WmTxqKWw z)wa6qtn>MT5)8Rk{TLo&(9lwT1na_icLFG7kQxm67M2 zuPXQGXj^SZ`h5JwpzK`%6Xl(jGRn%jnfmt`OQZv36mRS=MlYBK%B`ftMO(?>DF^e6 zpk%$)hsgrAYV38zQJX?-AI>Fc>h+~KT2e9)M_KR1AsVtD1ml3qdsNWH88`)|_PMzQ zt_y4wYIhE)Dzu8o8(TaQ1^aAhK3b!8+L+9NMcLY9zq2THDsqeQ=*CZS`9i}8uRk8x>$qP#S z3q(8z1Db-Pe16i3Y1utdTS4ChP;7tuY*q9-5w!}Z5JavGJkdDg8)U6kM}_bKu@wSn zP_d5$CyN(2n(bpPzkt6BSu84({*kW-(ljEEUEX3w0v0QT(6W0TtB`Pz+k@(GQIT?% zbYKxK%!(-`Vbr{t&QDZ-b7WKrQpLO)TGU{jqk}LCeDFpA9$XdF_{7Wkr88~~J`;l; zd|wt{jOytPM&-Cl^#~(3l|yNn%BmD@d~Qz)`a9~jVwVv5b1|@ZP77Z0$uODnpoHvi z0Uc0WBCgbzAAa~i0fzDbZ@T9l-ZgS6kU7T1#s73&jBvwR3_+Fvx-K4J%h)q(Fecwj zuP4O0zef-9K;9YiG0|iFa$7(kE4;+ZDn17U;q<{dS*YY zZ|(^1BcCETXaI|0+<$a_;A*>RmwkI@Tp=2Soh*mYycE75CgqFW zF@G18B-~vBg!R(odlQiYYq1zyPfW>Zh|}inowxU{E+7k#e)dj{u{+<3)1VFrM;zdQ z%;VA(FbKdU<-BiiseDy^GsJm)fcV+4RvV4E_qoGQdw0>G3bA%EbWULk_&LedB?7PBJ=yH+!2^7o~>Ivqmo5v1S_ z2$SuSX1P>V;3!kNKDy|P;o4`OoO+}kuOtDoV^@iD*s~{<*X|O?D4F&E$JTHG!Ac<{ z`^?93G!HqI^!Z{2{X#Ilh6?c}auJ$-t`VWd~jopd~fFZ|RGK zvGds^V(*zaw{-{BJn)gpuC;y)aA-Su1mGQug6nNVtm2{8B)~k73gH<96L>=ZA9X|h znIXV${rDb||5@3Wg4szZa_s`;``KhUy|^P#OAIg87#_5p5nFHIj&UrILEJ57#T-rSbJq_h$yL zTx2a%^i8ngYZ)idIifi-^5ir_15n+P?7eS8x(;l=?p`#*YDhx@;t6;iX0Mp+xly?Y zFDg7<;Angvst<#YZ|loZf2^;aRWD;*eO?qaY@SBt?6}0aySM(<_+6ByIwB`+;q6u1 zTqjWiy5@5fctTxEFUe)B&ktw@ZE)#Uv9~<56Sa^E5h+#lkx(p-2$>Hoz|QroDhB5j zT0j1>u(1JcK*%%XUuX)tAen>`$yg2P6{otQZzDjGWr4u~o&v4MIQcES=i28yv3Vv$ z56TYaK4BFOa*btGNgddm2IMfo6@`_sy@)dz1YV+@>-X1*T9?%I=lh8+yjZ3M#}xJ5 z-89B+rP5(qxlBK@5OLWezUO00)-+~%zqyJn;E;6akgb>`9@9Gzm@TydMTpY~cNFI^ z0f}d8?Fp_pvjBcfr7mz=D()xn73{|A52BgK?kFGX!mm4CI*7BrUFM{9vtlRB0uU<) zij3D@rRFQwYf$i^W^le?YOJ6u*Ed#03PEc!WnJT+SR$N zjYxefA4FeQ&@3AOKnii3GW5X znHW(5PyQl&${LAP#^s{o`r2Ak7Ye?lLzm4`(p}kd4j~SZ4+N!b?Y9H;ljw=ko zuoDGzxN;McS*McK8V_ZGszJ{l`w#N=nwUms@YUGfo?@SH>oPl2V@T1zq2e`qQYio$ z;5P{DnY!Pa7k?EouThW4pQzkKn2#H_Ck05b3O{e19Y6cqvM7o-`^`ES5NtJFikj_V zqmr}VTiy1nf}(F@({2QU5Cl*9B?}&jDtYY4B{0O)r-W!vu-GUCS|8UhK>g>4?x1o)67`pX!LJ;yBn}A4D+Dhd^qNLh z*r<}2NRR|1CN2yUa~Y%i@tlFY4C|hhReYoVfe2Dx7~$$^higGKIM{q3(z0QDVs$13 zMruqJhEF}bVz=$u@Tv$YX7{_(y^GVTH=)I z=8B?sOBZ0FjPpu*1U*(T(WSGLph~)71r^gSA`Y% z?I5(lY4`yy+WgFB51QZgx+9Tz0>K#t1uqcp>kv{&kNI+{tT>1C&_mb?YIK~pdD8I- z5oN(2?}I0Jp_*7csl8uW7+N=YACT* zDI0n}Z?AX0vaHs;sxt7c3!_BAMAahc;GE7cRQn+~ujjNh>0*2Y>!IR-MKN(_up7eF-O=gwD1xaAWw%g9m~ z$`};0HvK8b#z3*A1hPjz_3;AXsA4g8AxfmUMU_P3F3;|Jy^+^5}NmSWI-&< z+cCH-1*P!u0l_SBO2pY;EZM#MWBj;oUv@6zC)sJmb#Ew|lRAp;VJ@fJrW|sEhUEz3)7YE-bB&N!RQLbx@~W0OIuwsMjLeZ9o~{Gyv=nI|l4i0lqQ$Ne~d z!5sySjmL{Nyi>tSN_+D$B_qNZJoN}}$Nc!pUBSP7_oy0M_QttK4nLo|suw|WMJ zPolhE`+#rwu{sRLHPZrXlUOUXaaP}MV*1))30xgqp6w+dPWcs2hyW6qcRe7|+;{p~ zF&x;_4Xk*=UZ7_wZq@ zOWo_<(B%|Vo`8-Zb}Tkl4UXpi*yJ69<_X0p7{LG*KD_t%DWgX0hD~wbB>yZpR#Po= zPCIV)R1r$yfK#2{@R*D8>7^>9z0FNofSb?#q zZ+k`;{AA-`MxH!rS z38&u_r7nTFJbo2SiZ5&8&Y|z0YjDR{Zto_OPkcd%U);mbbvU7d+Cc}vf_8eD)oLVj z*6J~_Qt=yn76div(flKf5P+vo;bK0@Udx{gH~W`Blv#U^EGMSN=$6s4^g4bWcd79s&V=F$Osh?`9{lzoFp@_ z8f5u|y?6F)>Vxi82jjAuu0AI)`LnncHWxYTWqc)8s|wA_MPJEqNkY^P(J^;hCfa={ zr<*8EnEZybnsyg7NYT=&&}&VIvf8BwdpNRm{N*%H?3B37Ms*qkGo6lsr18c_Zrmm?8VOx*;izHDMk))-Zl;YJZ>$+2T285Rkj?{A(gxz13?#K zx1^=yQBe+zaQuJ@sBfschoBjBAC;g~O)&Cs@{4Gk7xLc|cK=Ec5PK(B=-0>gZ-lT< zgYHcSj3jdTHdq}BGJ{gW#az*0Wo=0Zy-#oYI7HGQb##+FUgCTE7FrDF`hQWI-^uuMF^3z=U58s^{Os#umTrf8GFnaN( ztZ2TZ=mqHcR-*fa-Mobw5YC2!1i`UGs(TEQ5O*ltuZGLHAwPzi?cv!nMNU%%^IbPYOxQ!GC)5R4SU*kQ-ujgTRdW zdQMs;SXIrna@`xzJP1NRrLYWcjmc|>w@+SU zvbJ+UrIO~ZRWePTHO=(o?W_`H6)^%aQE46emQlD6Qhzbxtq~WGFXrZGxXIi59UWld z=;)&@Ullr+4e6uI)7YhZvQ6~VI{A=jDT!Xt)rIb%sR?~MuGS0&fU=^i<`wC=kU6IM zTy%xA@Q2H|UGBFVyVIGw5|(X@HV)h*P%S8>iBTlRef6~Xq9lX6H1~6zqws)Qd9f^6 zsgqItl#?TlYv5A@VtQb5@#eZG3KoiW<$}td%DjwZ_JsBj;UhaxyW*t^bhV^f0PVWB zHC$FG+dwjHCMCMXSp%NAp$!#1)s6@dP?RNC4{KY*`CFvNEhBHR(m$smuv1L?NNT z9@nMms)*Ck2%z-X8hINhv##O4NRiSMzs?u(lk@@xCg&-*BQzN-7KT#`$Eu^gQ$+h5 z;2941U|g#{hQq@o4XHzwE#15nq~syA^G)m?RdJbZMgzbMTv3Ou8!DF_ zol2-2{-qMCEn{NvBzZs9g;VN7n+!ElN*R|Olt%?dGK%Q;PZd^8$y^VpD%T`RH2AeB zzFrqIT#g>%H$rUUk|4wZ+$1ac+GsYSn4{b%51AGBka$q7B$mb&0iThzhxmZjaAIcy zQLQ?ofXIW6W9e6ps$h^Jnd1_RP6K*@#AE%3;&o7)AS4S06uNhEXhRyfkcyhzDTl8>x^d<5i$&@m`Kd9M77x0u=pW7w=zq+JicxA540&I?{LuxXJR+2C z82KT0AxTI;;CNCi!N0TSiHW16_Q!15B0)OcX4pIWl+KpN3D z6WUVXxfe5#h>&nS$&aB5m>|uIN0lZ~+p2r%8-Oorznub-3UI)8f(_!!X);&2^zUzw zH10>ZN<{vwK!{zcTpM%F1fRON6}Fw_d^?8T2nLuM4F~ipFw;JL8a?i{pwD1ixx@i| zqV-J}M+i3N{&|J9F*D(*=^UhOn+8tZSc&lC9Lz{?gdqMlrW_2xZPz)FFoxfV+ z>Xc-!P?NMaTFs6Ps(^%10EM$q8~H|9Pro~Oog~s=ewI9Ay>^$(v5UJS3EzUxluE}Z zxM|l6oO}gd1XX#t7SoB^$?LBNF7BMwRbZ}?AKY< zn|F04&YVqsL?9(;APk4#dT8b{X6z`M7SQ4-2g(HpS&+R^qe)QcmWfKF-7M{S9<)|iU5Gqk{OLN^JRPqP3@R9#12LteeQM|j<9yu9CzS8(u(*$0 z@;nmzJZ#Uns%ar9X1`bOf*>B9yASFcQ*z5OR;{46Q4{coM^!y6hY+5Tl|8OX!d7HY z!W6~(0vrR|FlVGoXpO=Flr#pK6>SP5(ht%mt5$l_UUj4GbrQQ)98K`95b=|mv0#C= z7$PMG0?U-_!Zg2t5fAojt$6n+(6=h=@g9$KHH2;9X&Zcf*FHdvgBOP{BK%6cH*eV_ zAs;fXoPD44424 z6oMU4H5PUt5U}-z_GpO0&RO^9qKiB*$AQ>F+ybW!X+E;p24(SfsyCJNmb^<~|M@O! z?k;Yg^Vj-h{3)iseb&4#x56eAf8O_`aL03DJUtoz~yd7rs$-8i&V|vLrG7A&cBfjuw!AzfT3VK zh9qv({1=NFx$peE9PeYx_G@ty+mNwh1J(3%id}#;A$o`HgQhFNol9eN6|M4aN0Dpl zT13+o$>$l6V!wd#vyLh-vDrDEGC3j9mf2HywY6tYIao_M3@Lb6{z>ei8?S=VJ=kPU z&gb`wL<<>lD;AVWILOsP=67ehm-y-ah&Ty+A~ zVwmlUp9JDS7i@hBWxbp& zRwz=8Q!`ep5!cUeQwD@J-#Dcp&_Okt3@6-L8ZM1DS;!rS}Cg(hyD^WACUJ~KaErA5TN#tB9wSLe- zP*S|OkuQ-oh}cAEeD;Z>1cnPp1NJ!8XT-+8RpMjMo;p8f-QlP*j;#Dg79nm)&VIyr zWCHR1^_I3EgzLa&Z^p%vgz#DkE?TuKF(0~=26Y8#LM554BQXYZuytZ@LrZ)u(PiNK z!HGxMWu-Jp+(V!!l1Tvsq{!L>y021W`^LJ8qG}if`6zS~mE0gM9+Q8X!{+(x4 zS8~Yv;R1RpryJ=brglT$YaM7-zKb+3bdu8-Z(p3z)dG*R>IdL~GeaPG_r$to;6Bc2 z2+z?{pB0Wb5dk+!D%G7bmQLeZvJ4qhd#yY1L7?^_NMvt&26e>26<&5~3o+cWKm`LF zVpfDpZ_RZ&-95l|lPMv@fqnxZ>4>i2R7uoa7LUmp@zJW5t@6n&l(}_X$?-)dxx}0%6t|()y+|CfE~o0P zVuKBVfKd(lc()u1x~!hx0fp6A%y)$)8LSXjgv+*}RKA2mLph9FinJEh@yH-#0N2p! z5bWQ;Hb`11w^rY{kY?{3zXfch%^>tULQusQl!c)D0r>-#*QCStDq0rGX45-xf|Hb_ z&Z8HEvmL|a(E7U>)nj5Sl}t-k?|DZYxSrGNuH_K;V!10>5RTBR`1Rxr;vp+wtHgIR zefK$s&KSx>z<_2Gc;2TmFca|wY186yUulaZL0SIS@JK#|zhj`C3iPhKr+{|jIfBTG zBAm5zMzvzx%hRqT7|d`CT-tc#DkVUJ-N(kgyK3v68k_f&So6S!P_5~yv8JcQnkuna zosp-;nx1mHzFbL?jtnygOAgxtUs4DcEn@>5qRo#%ActT)4s#njc8{tN!2kKSTVlBC zmaK)*ft9wkoJnycOXOC;0B$78yvbe>j1@^ukv)awvpoa-~rWP2K7w7*PsR259& ztaEl;1>4RT6QvHQ5V++IkS+5HH4^P}j#zM8b1gL&Rd39nqgr({MI&1d_aCOky*roc z_YmJ*P9ZX)gR=k(11^}DG;++BAKP6-t0Z!J3+tM}%~gk8{z6Vuf)pJK4{cgL$u;zb z|D`p6Ie#B6p=zQj%o+FtZR*K^FTpBNUpQ^VnP^VTPG(7yT|}-CQv|kc-PNV-8bRJ6 zu#lKauvEws-oj@9w|+e5>vwc|>ZqzG8IqUs;DwJBUCGa&-6Ag?RNrb+q2?FVnR>Fk zS9|Zp1DW$8^5a#hfT)-RPXls5B`F9bxnEcCGR4=$fI^b+4Q2w)%*E9Z0o@SvppImY6~<_S zws3w$BWG^a*+lOrC^v^A(VO)j+^BM!T_ZHn6i-d2&AkMV8+$3*amkZ&*%L}4uRyKV zx%#vz5rGz_qVm>m;pd=Y7Uda9>(H?fBGb%#k2rvq9RvCO!|^-ab10059{R1DIk+6$ zE4)Gy?WCQ$?T`%kN(Qd9o^BOD*a3@|QPQn4iY6&$_LQci?F*$8cf4>_F7``I0M}qv z1YcTAEykechBW*DGWfYfpn>`Vl*WF5a&Yd7fo?ffBP}5p)t?bfQledduUs5WwBwG! zS|g{?LfBF;_Tc$kD>>g(zmfx$Gz0ItOXW#fGoS&mvY?F z`FpDP2UPS!xxEt+FWaT9*L5)J=1$oO*xVn6b&Ii$;mz$1AVipxgYJg{ex~TNj1cO+ zH@n3xZ39eQQZ`$WBI zc`DS9!4S6SsbK{5w(lTF8xW@`KS6&^?SKtN1H)5PDO52KjD-YC`4vOPZ_^hI9w6pV zsXf{RGqHN>&4c&YwOnMWz>qFMofAn8+6DTM^4#ZVYN#t+S)|qIizaMACW|yInMwH@ zvq>Hu9Nx@M+Haaoz6L{rZ5^6E*w0e6364&*Ipz}h&|Q%aD(?5xl|$tF>i4hRwL{%A z)Cf)+4drHN#P;%b+j&uB_MaMc|0W#0ij{B2vvUA_-_4O!bbkX<6)*>f^Cx)lHwK?m zR@x$nQK(Fp1JRq_h^eL8PHqd1^IU!viCDbCIgO|4tq{J6$q50S7~=j0l%KQqkaVAh zk`kLL1eeNRXroMAhAy(Li#vqAf#j6OAphcpND9(DiUu1XCDt(pv3RWxJR{GAkXhb+ z*F~v&wwo_~4M+1mh;jEAqIeH+z7N!xO@U)v)m6~5UhC2#CR@1j%>_sRV}6?pfZIrP zX2XJKjws@9n%!qP1?TM?b_xth2ih>5hU8^^t(2GDk#_O)V+#yPQ4lCNW z%s@gj97}RG6P9Kb$ugFwtTC$dY$r@nPj+5wCd)9KOiq%-Askaz4`!hGtC8EOrsKT2 zQzsT+am(Ihcl3(xdyG1ey6UeoCfD7VL%#-tJNo&3BFIq&Tio=Z`-$}M)mT$FEy(Zm z3Qn~}+&lzdahW8F0i-fI!?Rb(jM*9zIEP@R!tKSQ3V-boNB z)>#82C=mgcAz>-KgGdt)%IzELj-?smfrZEOU*a`h(Nr@Av1?W0Xpw#EWF)4!@<^x8 ziJbloH3SAbsZl{~twJiZ+r(w2w4O*%XZ$l`P6c0}D*Z!yrn8~UY+(K7Hdp8uu0W7j zu4Z&232rlaiWhEl-TFifry@L`!5EQe>VMS$RE?&e5VMD5K$DgGo4r#ho8FGYbU9PT zs(OvD{RF+<-`{_6=-?S7^^nR1ST!f4BaBAund_@o`&u>ilcI*-LyZ>h>$G<2SjtOogqju07DLAk995sT^C;eksHOyon(!kMH)yEs-~>O(N5Jz)+)dil$|iC*!h;a&HVldO;zx#m9THwYpze4Yj8LfotTlTDme!m)ywUTsCOph_6McvfOf_cQN8nu zr2=ojn#pfr?8`5bF-{^7M>VoW^28!#{;k-kJ)&{l$;Ou!tnh&um|NGPf2c%eY!q05`}mRk6+A&a z@&Fmh<*fyOtUwo^uZ1iR&-^;b@scV~H$5J1vTaHm((v(edJPc}+>v+2U_wLrrU7YM+_T+O?OyjFCOm%Zv_!X%=}+Hj>2LXJ&8c8-If&wy(Ff(WlP6)9q`s>0HW zX!w^AIP$b|Y2p~o0!*35%o5F1fpYcU&=9c4iD=XFfwmkdiV{&?HV~M~%Km3?EBexp z#R6~VX?Z(?3e=W8xi}MmEu%t31`kqQS!oAjcjczhMuq-bhM z6rEn}3;5d6II85*AxJ76)mf~m+VK35;2o-+h1b+jX9?aSW$13=D53T0-3=Hr`K{;R?f^$FE3alAK*1 z(>`y@;@y@rAaBMpz(^)%*KlY3)ppYqD3W|i9f5uTU4PKh_TJaILRd+co%N|cRdauH z_ZOJlykbFu_r{wBvDBL|cyNvNrgCsnHoJ3}_!i!vIIIce2*en(7=49F$a+eJ3 zIn{>)M$bs7r>Vv&Ea$#-#wMvGR{*p1p74`#Y5R|?MKZ!{Cji!rvl*OJw=cCx ztkniWf9>F77jJ>JTaX`Oy@r!phL}5?7hlw#fGCt@2!Xto3LJYat*zd*HQfz2y!r9` zOM$3Gki^YJN2-!eoL?lAYi(jgHe?)a5Icbsu=+7yZ1^mdcn((UOjhfnE9wN6bq(fl zIy*j^!^h4T*N3lBwXlMenlHCuM!sW)@bJwTI=?C&gp|Bg3gjF) zAz;5LxmYE|Dp~84;V(qZG-50smES{G7aSP|j|6_RWmRfP``;m^8Q-)Gdb`P*YI7;> z6KW-HeFC+Y-*^>B`}KR(>K1D zCgA8!q0V?$I-a=7IpMj0Rr%O}B*ICEJF%la3U!l2gZ<4ek;3O2M42@p;r!6Msu?Gf81*W z4$KhINkTgcM)LE-`biHkbpMVHG4i)tFayIyT5+7Q%gY8YxQnts%498<{hOz?T3@p-T6#U{PN%7XJ;q z$I9xWfbbh*kQBtRD8Sbo+~Cx3q>^}!L{O8=5yclz*CZG6WU`7usz;E5!a?f%pnl{k zypM1TfHij-Plj@RdA6qzG;y}au_xB@8_eeg9phvvzM_g#YjHIh^nHe0Z97V~w%TDA zmO4|!vRnkFG)(0!$zKXu&s);va0%I=RW(U9=pveuo7&?w{|19Q8cjuL_i zY73wv<%at(qlvQepy!>D2rKuZd%+Jq;hn*eP~Om^nLykzA5#@TC5q>3&JgbT3Ur1eQM7>p>#Sd$?F zP%#qu_A#cTA%(NGuM8I6eC>K)0;a{_fY4`4uTl^+csUBC(Q!=u_7Is?yEDIpd-@U( zRP7$1aKqKFjodY(p{gju+>AesVGXdVXQKp8Os!xx301S*)%!P6JFi^cpoU9vd82lX zbd7go+evmw*`RA`;>mf@BVCydZ$8%mukk(fD}td{zK_iDXau&npvRqV>*Lv_B5^u} z4OsJUpV>eE<9Ffb^NBEAh?hP8yJ!DBq_gDzRrzAdb7-qjcz~kM=d;825DCwUPZxiE zdo~*VpS?f5x%l#jKRl0(vkL#wYC!i`?-q2`tHbA&w*N7Fr9;yI2LfN##`e5%aM*0T ze%*W%TT1ILyXWevpJS~~>-o#gRfGdjzseVofE&AM?l%thUp5q|XxrTw9pzcn}515%=}+{LndXywKHs!KKZ& zAV`b7y+edGTaJxEfTwW1%~#u6`H6MshH((pS?>`$bq;glXO5Zk3~^?1ssuBc^QWnI zTcDvXo!PNHDTNOy^Tg51t`EQ?WL-aPW)Fz6hRVdG$_0##VW_)4zh?90+eUs>LBELa z7>Myn;ax$mF0&=qS2xF->eDmS!wmWuP!?J5dUMU;pyy$y^Scs{)!%(7$Bn=FZ!sZ1 zmaz!_>^{!d$Fg?bt6-b}<%#WEukejPM;{A37Z{7;@}P^wulOb~mDW(L@69!`r)vgb zu6BiG#sg*RQ)79u%_$UqqA9Fo?S;wrBDXGoF8+BhC*(sqWoZBU)3fr}Vn9FbA<9qP z-PE*u)7~v&FD<|`Uf-=Xr0MX*oBjP2%;b5dRO8j_TE$)iWUQR`Tx)L+Ue+kq#Di6* zSo7d@{%!|KhsPJRU9AN>cyMG{TB^T&Ihj# z_FqTYT^M+rv70)p%QTvuYjO=6>^4 zjVZtuv(B=iSe+A&V)Z(GTW3p~&HY-Pf{jpTrWjnUVvRbtwArk6Wq?4|o5ITt$a?_a zknF)TDOjL60IrTD4tcu{Um?8e{yv_AHE_C8sB3|oQ!F-k*xX0hMl|*bB}yGXRM{YsROW zOM$m2yuVBXo+ZL_;Cr9f7E6x^nC;Ml6Ftk-R#eKE6tJUH<9wPRa{WRctakF$Y45hW zr)LEO8p*Q#oSwerAHUFaM{h$B$Bxx}3{iOs$ z=>Pf6?BD+8H~Q!Qd-warX!`qUIo&H&33PAz>E-?1*Ef&9CoOwmf2Zaw@b}v8{P(>9 pd%9}Am_Gi`|LwnwCiM6AU;ho7o&O*B^Y8xe-)#T)044t8{|^R2={5iW literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/ds389.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/ds389.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e18fb79349e7894d687aaaba26341c9e76229a18 GIT binary patch literal 308126 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/edir888.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/edir888.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..634580545dd35370466e761292a7196182e0cff2 GIT binary patch literal 176106 zcmeIb>uw`Swl3Ct?*rHv-~cvkoZpF_1E>estu0=3sfN#iS)!_1r*#`q>h3**K_f+` zq?{s|oFrK#O=IBKFyJRJ{NIn@huHrNzlDGKTM@D1lFUp-GLtIR@yy1aDP<-jR;*aD z?rX){fB)})^A-N{zx^Lk^nd-I|M=DaLx1pp{sI5^pYi|m{|^5(`sxo~jsD>e|1kQ; zKm6n9p9Ww3?%(~}Kl~>AzyH^N{OUKq{wBbGzD~nWUw;?KKg5G@u}I^)IJoE! zf>|<-htI)%k`AMJuy~B|UrBHm1@n0NFpj?c7><__emeNqi<{ohL2I|Od$8NW6s_G> z_W=KF?eDhQ_+z)b_iL+t^ta%4(0hLpjN&vJE|T>5au%iGB2K2k@4o)$JZM`-yDbIn zFpWa2EuKX4ML3x;zo<+JG zE|zIHzP$T0=;e3}TCELJ=cw^*ZyoF&b@zzqTb;w!8~mevh(plT3t8UbgvC>k?{Tu6 zE^4o#efVN)I8vJ-2;$v1e5k(zF9-cT^N#yyq!`UxY``dNhPE5w7$A7&$1Ve}O(mU8 z4&Q;=@5CIrsQ#9B4lBXJf&>SNnUkQu{zYx1fF(7}^;eI-6oD)VddFv49<_J#zJ`?C zZ5;+be+!}e%f;oz^~w3=kG;2NkkPFj_4wWC+0DuIN&lDYli%N-;veE&f!KruR{I!^ z<8U60BnQ0+Cy@q)k(?u~vq(~a38kSY2MpwhfgG|a$n%gx@G({1g~JbL@$`dUL@_?w zor)6OUgTTM6Ud3=V<-kco?HX>J&AW-@XarS7Vv)>}{*Gn{rf| zuXSqcH-_`FreH65ls!onuj6@z-LBE ziy7&#ca_E;p~C$TRXj@#q2;)TGbJDh1PF|nTxs$BX}^DRVTq5LhX@iu+KfQM@(xzv z=fr{lz(&H=?c1}{<5ljQi<-KaV2$KBOu<4%4_=3)waIm8$-j&FjUAz0PU zFquq}sg%0E^I+*>;=i$KAz08cv?vM1+2v0VYHu%ZFKnrHdv#@=9(4KR6-ky0a*l+MUx>+L-gAdQ+Wgc3UO)8%z7WGq zAEW3#T#gsNUq(wW6qo6$eK}U329u~SQspwtBA2=e^(}KEN6~zk#xqI6I}?B%Luriq z_G8aO+S+S(-DB#EB0+byLsN~j9W)N_Q@tHI=qi>!1EY&+jmPAH!~c>`OKS$j8hGoC zOJUW_Wp!-j$z})w1|g6z$d9(c{%NPlgb?%Jhr@Y1iO11RG>&GE$uzoHPVS;qBca5W zYPU0-UyS&UM-23k0gtIxo;3q=39|4w!JL$^KgJJ_7S|d)Plv+C3*W65_!(D|y)EBk zXyUfa5d#`LFrzoIkT!GPhcsEv&Lcwm{4s|6cfC0S)?kDCo<<1lAj))>J(h*F#} zO*AFkW-V@cs3vgRVO2PuK1ON0h(_M7uFYk^DbE#%$qLpXAA73$#OoC)L!km&+!-fB zIL;Q&Q{gc472y=%Qt${S54WHE)8kMgI>uku<2fBBoN@9HPkZBW@+lgTv^)>JnCAYk z-7?kij7AOAutEw4V&I&GcC~8gXej1!y@hs}`ou!}@jSd6`voIQM4DWl8BA?wEm_=U z7lHuvn9n)U0F+sG&NgOE_(Nqfr`BtW#mS z80<2BeUXq*f$&~vHd6xgzH7=WP^6Y4*bEQV1d#iV zWN(fvTso*8y31AINqOYs3GHzrEL5nF%W3?VWhAZ5oxn?lbj?-%X(JeAS&l)GcIC6< z1tPqbCIqH04Mr%V@mLF_^-`{z=R-N6L9$}a(-)Mxl|{~!eHM1pXn|b04;27+xAa2( zJ_~a_p0v*b&4muEZzaN6sz=yoIs+(40y9`61j%Axnk&sI>GYnL6QsMu)mw-A>UQ7W|@H|CW}X-xP;3iH_pbficzb)JNd@* ze3h-H+Sy})MOh3Xaz=gDk#YRV6jA!A1gmxgKxt!O_sJ5hK1m#%KgnA1kQ6%;bSnSPIj`;i*nPgrI z)2y*D-`n06&Ox6Ca)N^Wk&m0sY&c-?$*UB;t>Z`Rqt_;uDD%87=`IU+%!1`rBR`g( z47G6qHDwNJ=*`d#+kyvdO|34X38g=80j>$)6Y?!Q9W0m__;a|LU=5x{(}%^Q&nYR; zu!T{jVOOIDJZuxhbI9regMJ@2cop+ywMTJB1okfH|qaTR!knAa5g_&kph(CA0w7;&WM%lmtT>M8`mMCp#2 zUIL^>gs753269X%0Old8Dn~uUx-`c|Xe?YYBTMw#Zi`iRXE9=!&5SYukLJZJy z%Vc(~KldeWE0HZ0V9;&kiyi8tr?cG_Y2uY|u?}RJ;3h{?R9s7uJ<=TN^QO0czTDO$ zR^^ehevc#{ud~t4b%@s63HCzFK5K@p%^Kxjh2Ry2(9t+#E&tM@6r4;a*4gQRv6zbzxy?Q9+=-Z zAvRkrKK_(oi8^{nPsol3DweDaA0<*kuG?cs7z>UtbnxvYEWTl7U>*&Z$mn`L`O7jK zZ?dF;8X({i8e5PYDF5i@`cMQVv22}3QExnl+q3c}4WbB+9QtV$`k~30Wuo0e9F957 zcRc_({z0VgVTeqsu!o^l)lFQ)|KC_^@lQ!q2ot8Gn}AqA;NBcUaank>=U@!@FBE89 z;xHy3W0YuAa>K6}xdYy55Byd(WD60@a)XvqKc8TrMv*&ENk-@smQ~~m4;f1Z#0sOx zk5BK*wjd6H^gajPQ8%F!oB47!OHw4WQvD$^|2;W6r3$;&{D21vtdZnOJt(TF6WiKj z_nBT89YHvN{MdTgy39aZTNd$8#k=W{QwiLBi3T-Pf#Q`^kq5u}{RTjLo}j`bqWc*v zs#lWi>!^x-T}XsumosBYTS2cS|Gl zN7Si!R+kH>Z*HYWB|cGyHVfCINFy8$sdLTSa2(pDkHyAJS$=0v4i@Oq6g_)M{US(N z!3!zl{dPL0%;IQ-da;pT%5q7FKtu!sJth^Qi9wqHyVYWW53sFTDv`OkX%x&W>Ux%Z za*DUajOF>`a=|r?$9>+Zi42%2YS6^6UN0^SoN>HtD>T;HW7yrzYO<&}lb{T*Vu&WNhzcO7p@|~c`hdNsA({ZJrJDyXryr(B%X*7u zQz~E3<4o`W+R4_Md5NxDIT;j)Imke^1(eJ2P?$QpENyd7a!nC<#D@ZHFe8NIN4K*Z zz6Ed(cw+)mk_67u)rEEki!-1X|8vp zNaaK8N6CLsQ~euJ6Od3`Zh!+FC7LYn!4mlM{(3S#~C?adR9% zJ6Ds+tuI>oS{`AwSH2*t%t-{x)NjbCYFb+@-Sy2fHhx4mAh`TVcdeicpp(vzmjI-EkRgYA6e zDlCwBYn&-%vQ6+ldljep*Yc^y8X94CVhPOG(6wA$g7kYNb;FJBDGbXw`FlMo@{+BA zUv{BI-sje#wgP2wm+Y#vVFzJVAoij?gj z;NrdE!=;lN-XpN{DKzbX$`4t0@6CbBElehZ9?6>yX*8A@HTAwjK5|q`j?R3zyy_-7 z_Y-xlUX1DqH2`9^pgRW8Gj}nwT~3)(HJk8|qmZerXL2IeCEH|_qdLw6Q9||QMQ&S% ztoZ02`kauz{s1?DIpd1rc}q|GXHgf5*#j$6==?N6d&TJj{xn<~f<;Zd zUh!zE@EfsCFM}p}c&mG)5a#0E zac9xT$g2oGE4;ikVZK_+nhA-N|5)hSNDT$&b;G2w?hkGc#no zISakf^9DR|O?rQM$E*(c-1wXg$CmKWw;QtobvuFC5*GzAwiUlGHU2i=-Yc5QZ)Z2; z@tsU&S?D4*? z!+h_VS`NA2f_>|#cAFr=6@J>rbzJK${kTYN%;j`j#TWZMk_DP0R79E=*Sn;F139wX z<1M19_Bmo_Nw|E9aR+nyEE39_+Co1Wqy8`ew9 zPWF`|b*6aTlbz%k%SEfxq5cuBzFhA{X;W2}>m{Tg=ACzb>TpK0lod@V2k3l}O;?!j z>q;mbU_rUEy|(x#-8a7Ux}J%WY%jmPg$V!l{IY-g?(|sn*b2O88#FDZ9{U#&oq7*P^_n7mBjcp37Gj|zj%;sBGs8REzK5gh}cjx^JALtvRF^+24P{3PeuWt6Re};W zAFP<5Qf;;8X-ELO_p{ZZLgRwevA zlfk%&!d5^|S%zGbEQHwF=XFlRt$paaoIc-PpH(|QN`Q$(RBN2NyicC+j&4gBJq^dW z8+IfU*nB{&&G;k;``Y2cj*H`Dg6k~eJGdbiCUR49el~PkybL9%Rq8%mVDLSpN-j7i z=7Z`68N}vINmklh*W{V|rgm{Omv^Y4;`;b88h)5n7c*;&*3Fk)ca^%ZQF*4&);#sQ zOt)ayU++rUBB%bWB4xbtLSOINn3d0mkGS?*)Yik}_o2q=eZ6aCTV7eZqu%k^2`Wv! zcrm2H>s^>J;gK+(z>tKCQ*}A3wvn%QiEOJ1Zu3t2a@jTJvrKHEqqM)?#j+u+l7^{c z$Gdp!S%vq7vDdcly&*0K@1Z}*N8$9_v?W75&j_hC2fESN?Q8^h$mtXn3=b*VCHjyV zysr$xR&z$X6tq-6EVz!+f#Bd2SoSwOGD%OH*c}CiXY*PWODY(l(NjOV7o|ms=?hV8 zUg==W=A1SU77GLo7FSa0iZ>rh-X?^ctEVC4jHAyD z7z-K=m^@dX8!Q$H8mzN;a_3ixw#{v12E3wI0Snh^%jeCemTWy#6k3uCfRsHHVLsJI7~(o0xE))B5u=K z+f5`!fq$a1EL-c$OsV**+5f>sP@XA%T5 zFstmIncQ=UG(pJ*HoU~P&XgqT94v8LwcmZkI+?)QBlT-fG7`K|UynW>g)>=lnl(gA zVjWq1u*%FWO}?19ii6fDSB@N8Az3qK6|fH3I3$F?U=5dJ+1v!~8^&7B}2l4_emmm<0_DW6=tf$EyO9)D`YKA9@Y zs|Z$qwMg};q6u8V>a3)K0wg6DEA@H>r=xL1xc1NVs=Nl8BG7Y4o=|HQY~d1vI+=!d zSi$j?4}Z_kurkVk94ru{RbdJGk`n{bVBnP{;t7!$trA2w6UTa*Hs3I0Q|6mAH*Kzp z)iw<;hHMmG-8=YRM605ay2X2ARin!0>dw7HZcY1mj2-#ihphXk3XokE*%7+BqNPPL zJ)Pd0J8Vi6g)oOBf)WVHn>TbXgNE&P7-Qev_SKB zzd#2R?MlmM3N)L4j?0yhK=CrGW?#HT0?zzrN$6FQP>Td?tpTXNrq*jnAlWwgb6U9C zaX1R%dsJo*I`#@1=^}5R;fzglB=)Q*%@okg4?o3FtUI-41t5T5^pNjC%3-Dgu zm5v}FW!mcfjy7eNJ??q_+h($h4Ptq1? zz@Rd_6HkfQuY+mbQi*0Z16YFii2=ZH$< zT!F`IdG3}yx3pHz;<;Ch2-0iCGo2C&`Ef>W_*2iObId7o0S4nWs9H5o`l~-hop#vHlO%>Ct|r25Wtkdep!STLna2GeW#b6OMB>@}jP206_&? zeEVLd8ExZPkiu4H;{&%)Ed!Hj4UcS+kW|ZDMqG;N>NNr1E&Qv0hfE5?GdHcavPNe*O?(r+?tip6g7d`lh z7ZY`|XBV2#G+G2F=NKpGjYcxzRDM(4+UHy-<=c#)bR^GFgw63x8_NgtVsL!*U3Rca z^uh-P+O{YeIgu4wh{<~S3=5a5AG*1V)!651YJ&HGi;*pzSjk3t3mHh%TcuRh*fv1G)!%9E~23ZGNAi zakH=Y3#UQlLdl7p9FhDKgR(#w5si+g%b?SHw8Qe!+1t4!>O?dQtcHuS#kt}dZPbw1sw zMrR@%$AkWb|E3T?`nm%j(m+ecVyrNKPooEzb?_LCD&VG@yE{2U70=J?e1z`cAP+*w z=~VO$@yjLYc7Fx!SJ|I7lFW+XVYWGwQZ*X&qcLpl^!Yr(t?OQH#8#JSw$R!v9K9GY zwutc4Im{q|sVZC5@d0XeYd>ltVZ$;%Dv&qsOe95G-vk0~9r5GEZ4 zdP2L|+iColWmJvbXuHgYC4aDDAoxg)rq(q$>lqCwS>+%X56!0~nm&@hZ8Q*xO8)XJ z_q^r~Rt$qVA;}^cCgY0Yy_+jjW@*k~g)r=M*!vM)fr?wa1@%I^0u0rTA?f4Aqv!n; zZ+PczvdbN;7$q#;Mw3y6mR`+iT1CbrpN2F^CjLUM)FdjJN?$w=pOfgc7Wt#1Aks!c zyUVP1WNPzDEdLFC4;|7|m2LaDSX8z9a|vU$OBc<;iW$vf692qC431E%FfDr(Xjefd}Y#245o< zvr-UDg#hP>eEY1o2AQ>NW~GwBh2P&lr)%?N+bm4YjTOJd%r+N$!9cSrE_%aU1%0ZL zCs~u=v(LtvvkCX!2NR|8HYJ@FBAX?eU*2CtpE75wIONgNT?9lTrc8;6=E3ECfMHZ8 zYSS#Mq|<=s`Pdg;7!CE5VIA}b*YU%nl?3Dsv<2uqpvx20I7)46pvrdtz(KVE`dtN} zbG=p$?C-V$J9PjxWP;Mmh+G@~?!>4QB7;*ZIAIf(`{R8{0A>XaPFT-yFo zj2DOj(b-+!Gl$fl2G<~YFmpkWH^;Vn_i&sYQ$J-d)R#~VC`L!j12JsC<2JaEwzC)~?=ecChuH#WJP-y_4m%%29U-J+pzTmq~n_D!TV&C7Zc3}Se9L%)`=U=5xkmZo5ZNKbL~=y_}9{vNwM zDon@L+|V}H}uMwFP$TgjA(z@97IDU9C6eypu*oP zB{H83ihM8H62T3vD8o!Od6#=iDr^c{m6Vk*UnE|)q?BT;XenK0@e^ECHuhrarKDUq z4|~vYukD=TKsWKiZ@SHv#mr#lyFaC?Dxx>G!IAX!0de1<&Fac%VUu&pHg`M~%kv)_Z)>rCzlcVd=x2}ckNcb{W9d~mTH2QXb8>g=St(OWgGIyv zo+4w&xcfGui+Cy|1r#H%a5iSIoZcfln)#ry%IZ{N5=$nY%=dDWDpR%Iz`zm;1ULNIt60 zXLNc^I2?*ZpLDe4RdyJ!@m${2>!ojH49^MzLYJbFv3R^q)m!)XpqWlc*Q=1^P)eYy zn!p~MRc&4B4m?>p0MZ#RuCQYm<5INu?QMI#$)76Z%@Lu zS@g_jlt-~ON#14(LGA4*NgGj^i?FBDlH^c4-7i1(&TdbB=^Y=R3pf~uAM+;~;`EtXqunJPvjs&FX$9Nbu1*jOTF*x}cON^$`VnCN2 zY(T*|7&W7L(wM>>pJW#%v>)*S%Xl9gMsqvpy*~-02ND_Zx*-HdXGBC;Q3AvLotRQC z%<8>fZ86Lu+{N_6MObY$8!bRiQ*#B(Y_Ni>A5H~*05M(;T(cS8;PVuOd>uTij{UB1 zQJ7dwpJ2aQ-i_m7JwmeS{6dWSog6l>sHJ*onXn!e(9Aog66lmJZ-| z&j(tgW3I)z7&V|_tC0sY3>Uci^6x?&H-<|H!D^tfVIx7qnWDDEK4>$XY#rJ#Xdp+e z1{zyJ612hc?#~F8RX0@Dfu{xzcB%I;81P?iYr)d-FjN5Xh@7H=a&CB3+gLH4?1 zjbQ^Gw+R8GBQ6?hkqhL*DysplhHV69eFw1wdeFz&tj@qEDE3_C475YO5wG)Z!1J<~6oHx@CMXzD%A%IsT3;OPhg4S6{@NwrTWE> zTWgo~XM#nL^=E=Z>&zMu_-Bzj_$(ULe=eXnMwbgf79gLNUL@|TRLGEz?mbA@gxELT-bgBb23Dc%0|H1g zQg5TyLo7FlKtzsU&F=2$Omz6ManBTWEJaDIXUkAy(E&b4$R#wSsvRi}?1vgMFk^0IDXhusjZyP9 zLQ`g}ZNRQm6gBMRsBQ#sHPBX|X6pb@i(H_MIBzB^NCB!3gKTa5V(ixCP4yxYfWfxH>kap=nzA1hVs* zzRksO$daHK@-JTwZhd>H(%>a^NHw{70#ptKz66KRbq63VVG+q2RpeSOqQy_hM)0As z%+2C*7YrAa#+DqLkC7hz<+e=MKJaQu)<@}fRx8K;oU3I|5Uo>x(cPZB(fR*jx2QEI`{)IXi&s z6PAAEO>ScT3mz4%_U7RK^@FdgPat$x=pUIb2i=W%+DlNsu4ZBIZR-C5z}Jds4)%Me zKfi9=TY9D-9UJ$r9(XOwb1?t?)$J=sy_U~8Oy|`@-`d;bMk0J{ZB1(4d9(Mb2_Nul zTR8{+UjqDPd`AeapIubZ;PoE{4=dpHFQUv6 zfI{*57f@ykdsZOT#ZzLaGgTBqR_Hwr#X zqmgv1;TqND*orTfIB;_#L@!~O9a=|05s`qJvfg~Cr!-pf5)05*7UL+`3pklB(&wuL z*CBm5OR==o0o>B((GZuh#Pi9QvjR(Bbyn~t?uMneDzoPcI~kVJYA@gm+zWkKB>TB_ z%xQsy?w1%hxQ!;0z$rY;P8yfQE{I3Vrak@e;C*g@| za2sD_Z&=i)z5Xdmd4>y=%7Rd)DCw=9y(n=n$?sYW_?;Y)XwM9(K5O6#04fKPxrDm2 zmRiU|G!mEUehj@zaq=@9-IZX-z>K+#Md&+H)gt&hQs?gK5}nH0PjME#*0l8pvS-HSSi{!bZH@o0DmH zH-=uq%uJ|SK6IArg>be;4h;o`#+KYnjlPX_?Q{6aUYFUaMweu5)pn$#zFJf+M(9TI z1jK>ciA8V2WV7Ce3h^SFSdpC?n<$S45A+>*TiGO6>YpXahb8)^ifekk6c?Sm=uny* zN0?!_?{`ZY%f2iB&%-D1Q6&eiqhXSIUCZpjo-uMjELx2X6+jNYl?`#lKcSpaz}HCatu}-AT^#`W#?!OnTzWgI76ob8F&1;LEeRA?>I>-mq62~k-pl$`6k-by zF;>8XZG(gkT+uEjyb05X$jd%4C%O=L9&9VXyS94M{U@1(L<7d{QU8G}xG8vosyN4c zvLW%Sp|CZEJbs{Ziqx2 z$Qz}ULwyFrxw6<*b}9EvSf6`P>J!L%^edme1AX|Yl%M+)IY9auDEe+Ax$*S@W66z} zwJ821d);ac`gx!_WU0nUCGT)Y$})}m(Kz&CSNX@kHcL8WIR&_6z^JzCtTs%@U10?V zP{}SDg0P%+nr8Rtds6Ai9nQ&(oog_Od;Qw7hqY z9(lP;#PNmqP~5K0R}fAoGvV#sENJg3=V(TKvM{4eesa|J68;0HTZMV_dBHq4X-Mup zC|Ev3U^FY|C|8(U9|$#f#Tx?a1EA?&0Z@m=Dy&-*Ij=jOlbYaz^b9BWoK&_X+t+tD zO-JGE3U}*?UZLz)I)9jWnOXUVzX|sZgULD+fq6VeH>6w;i>1q6gE4RglP=PesGHAm zRqg22U`%HgIU6gqme&I#d*t-4uEO`STWXWpDl8=&c6%p)@_59Z^-A7M=d%eDe`T}L zVasdU6K~dmm_TJgWrOO&$qKml*5G78M{xF$VvxpnA`67k`x;?p0cqn_=Q6BUgA9td zhE98pFtct0=}c%sBr-!_ zhmwFhjXuV>eDO=6V$JyJuj@qdT7^cvSn@Q%+ujU-Ku z$ePeJY5%U(Jvi8H>H8>fAF9JbFD}2mg^Bv@`DOp~-RW`f=JfI+D5TUJ)y$sDfsuC? zFe0!|Ry6K8{}8=GNLgkAQsqOcfX&(n%wr&YLQsxs2~Ed2TA>5!3y5}ejRekvBuPFB z=eP+v^lJj&KKNB#I_=PC^PH!pt9)&qsiaWdw8Mr{pM}b_S0XJ1$En%owJJL=I_(T5 zj?n3}f;4{#(zM0-Ir{CZPPAw7eYEi9ni*cb4T@x*uC5UY81`eJ={3Fv{oA5MEc5*1kGeZP`SM=`=>N)9VA%mP~K}hT}1` zy^+3M=*Mup^y^Dv90<)@J?)k)m`#8oK4{w)>mA$9==Iw_93h`^5qdQ*-@Z`q*qmKJ zHwmA9jM3k|W-p2cV<_#8&D4J;?e`T$c-p#G6p^5S?)8PC+9nqZK*EX`CZp(8X+!#& zM#ADnGVP6LkD)PiUKgx34<|?53b?OC$p6tG>R2)Nx{2 z(hBN5pw$h$2=!aTZ9ikDl3(gW#&tOZpXeX(Cghh^AdpDDu4y}>%N7B z(ib{z`hvLRT9Er|zQ9BRZtDyd&R_5S6B2COEVRIW1$Q^>?Y`M86 zlTQ!2q2w%$?jtmt8=WDucj=j?W|ropsa4oG?F>ceAdMDb>Q%7nRRpCdUh8hld6W*$ zPtQ-RI~#rWZ-Z0T*0B+q^y-J>L95;LRIN93oZApCtzFKIB+jwunQHxdMFlEyAo`1l z8`Zz-1!innlb*BH8A3B~wp}>inz5RO^KC6SJ1(50kwP)8QOqfQz7mCIv?{3Ux*#>t z*Fl0KN2&tKz6;8+>`=MAy;Kv_+R+0S=6C3P2*vAz&yfVHad_M6p`g*wF@=V!g2zJ_ zCK{kZ4d^NuG=OT{QU#177mTaWN+!%b$-Dc+cXVfkHOP_URRQQt1|Xp;`|OnA)9YYT zLwZ8hITAdU)tOJdi}T*aPrVDNRcgpekk#R2ZhO}-0>=3c|FeyjUlL|E^d!t@y^CHN zh3C=a4vCnLaqVWAY6%!Opn-97tQlD?wF&p7TnpQNaxKT`M6OY9t7@5~S3?vzxR--8 z4k^2WC8VmwiZ8$gAu}O_6~4L6YSZAiI{U&@RVG4uH}B2mwJ6t#eH}_Mr6X$Sd8pJ} ze5f#&5{!CN8=QrYftkgoROP5?a6Tqg%xCUw&V7Pn-)y}B|_@l${0OAwUyP5{Q+Yg4aLaySjvH$R+RixttH-$aPCBD>GaxG(@z z+V-x+j+{APa@`hFdfz)E|A{8NZKK>`Rafw9|dEgmN1>64d|l(liH&1tc*pU=;H`)Czd5S6Ajow+lrigC6yC-U~Kqnj0ZX1)?q zsvz@(!LhIT=q#nyP14@jtTmC;aX0M1rJAH@mMOu}NvU4E%WQWepzvOdpkRq+m(d7$ z(&Kn2(k(#xc9)}K8bBheFTtrTVO|>P9-DQxrQ+nwL_=H(V;nBm(O;G*xW^@WxGls> z*k)~vieNB9b-{pDg8mRrwo5VMwZ_z(@zqskI&Q8A77u5f5r(u6oX}`)DiI# z$ZUYq6Kf0?vt|j`U=c2sUMB~e)yVwJrse#n^Z7EWP~6`hGr{8>#rUuhFatl*`5i3m;K{^%cNoQm+LMSUGc_ zZ!1l8xp!ExW;TVwBmZ?Q>W%#J=wl*vcIR}L zSW&r2bE>FDAX7CAUmd#wegv>g*+Wosd{3rDv;}ajWQ6SK6#>?FB8{T)BFql9VLGCX zS@aWM9k&9It%Kd8E+x{mTAf4T+*P`<$@~^OD1DQo>mk)-Y7}^9635H>pABknYCP#mMrcE=jc2>LHqdc zJ>zReCCSk+n<(of2sKl(A$*r66E8NYak51S*)1@&A-qNIk7Ib2u(cP#qgMC;<#~iV zd)WQ#tMM6c=oWFQ^}sBY>Y@doP2W18)SsnmAD($UQI43=?@^=eeXaD1L8=cCK^jg+ z$>epysgDxils4NY&~CNji#A@{a{v>iE4UhXM*R<7OFJ$CQ6F~#ks3+7J`nX;2Z-;I z^dW)E1s$$XvLY2?pR>O8t=39`4J6(8?s*BYc6M%wX)-U;iUZ)3nHv+|yhW`)H6gMY z9#){yeStb*B0&H>g9p)~j@{KHd{*Bg7r^(or+pvFE9Ko;yISg}jl!=rHz4@x(};?7 zPp0=tI*e%JeO9pbvjf87jt4QWGWCP15?(zuT_#GaT@jF`I$&N$lNcQ?{Jewt$JrB% zHhK^n;W5YM2XuGk05*11FA2J^Q?aDG>K))Eq%1=mNMRQtSKrHJX?%oR0+1yL03??D z5ez2%7@@eu&u}#GRoXxn37GXb96rJ^aE}PwV;!$|rTLlF)2gX2yYF&w94pPkES%?g zvD^(weVRjKet99*HEw&ND9C&fPG(*dm|=01map5zVSZ}Iglk;R(a#Vi9g1;m9|Go| z8Utd#<<;~XaQJG=XI&hV6XNB$7Xj~hODRig-&woH#PU4LDElQ&b{dbO%`^zlwey`Y zEM231oF0#pX*5Wd5Um>NKCaL$X?zSK6Nd&7GQ^7{4cn{MwcSIB*;L-}nwaMFny6X+ zYeD*<<_HgIvYch|Ys>sQ-i(*lAH68p}G*YS*KH6 zwu0Woi1GQFnw57zPRwjX&I|J!_V7VsKzaFDrSN0`}=3jpo{87K5Z@>N~C_6qXgrOoeJ8yEy zr(^)$hK&d4WFY8Ng`k@mpz;#-GXu1d@14U;N|11n8KE)=oNmQfJj{ilSomiF$j?kK zS;0}=6}+iC0Mu?N#Tf_rNG!$yl7rj<+Q^WtwvQ0B?huuU5r@<6bv$G#vibLkU4-sk&9!Fxby-XLUSek9YMEvdgGG zLiT7?AE7=TvSghPL&IjQu_OCu-hW20 z9TyTV2$svcc(FvgIs8+PhkvKIe0h$<9{dyex5sIM0Ivb_DvVRS$;}AIb2NJ!y`>Q; zfdv1PEFPm&{To3fR7Zb{yqpC0V~O-Y8VPN45c{7~nkfDhlo6vjkNR68R5_^eK3qPD z4W|a}7~?J;17~=?oPL-lpQdl=rbQwM^QgCc!beyqKc9s2kA#KRhe=Nt%P#9v6Dh{wIr2E$Bn62Wtx;x$6^(Ff*c|##r;BXQgP7j8l zf{eQa_o>QKDf2`~nWt8}We}Q14@iB2d>ol)I3bI8DyZ*tI-*LZgv6L``O3&Yj~0)~ z2yX}#PkIySuSN896Q#&B3dg6osEP`rA{qm$h*CK;&gr0kp?`I^L>(|TnImlY*yTcL zuYZc9F!VBr@0JU3ff!MQe5}L~X!V}jE9%F%T2kh|yr=lPelC-P`ueSYK^zSPMfp*9 zR+aGyk*3f9E5bk1PuqiN!5kiJq@ftZ)?3 zHPZfNI1Z%tp;T2LEqmK6hx312mP7VLzS2jQ=5V?R2g&Fj$r2)=IRymTMRYkFE@$CX zDx3LA=&G9W1&Vjpc$tESQ1Wv{p-p@cPwpNoMc9jMB|R|N)-|V8rWHtAYO{cl|NFeQz5D1AFZaUGJwXG*S~A(7As{l11U8K^Ft=9q+2bT%Y?oXBLp zfVTqwOyD09mXbh6IKGJ&@^AI+rzHI#s)YpU#Yi^+-j z>@4X^h@rY0!-V=-CeKkc5dE$2B|o6fhxl^{6Yd!Ls{q#g(RaKR3pA5`2b*1BLK_sq zo8~@J>;B1ENSY+7aFhUr4^WRVie_QDpo~iW=wtL4565V#1Vl{4F5ySvkh&Nhhv`Uv z7thZ%j>Vl0*e>92lszTjD0EJCu)l?VfsJ@#Z4VMB_qr_DJ}UCxj?ph1ENkrh45MmT zs=6MWg(Bf{ZYU2IePa=z-pT@NxY&}_hhW7{&NH^ltYvy<>}uC=&tc0BB|q)&?MZQD zDb5)=%+!}ap=_Q6^R!8(pC$ye(-K46-qO~7Pq-2mI5#{U3F16LUL{^3TODZ#iST_g zq4EOR+Xgfu1f;qek>WDvAu&+#RF(Y@w-$e+8AmMHIeo}a!JS*>R3oy7OE(hwS-K&K*ydlL7ttAMu!CWiTmd8q*5U!i2479h*z ztsig?1?!O{dizDOr_ThJERD#DK+UN~CgkeLUm%MKWnlHma=LgMjza{L=)riLe7c>E zX)jTD0Y949Q+U1zUihBe&!II!T&ki&{G4x3!aqT0G7L0^hmQh7yvuku7e$KSC*zUW zHw3lL$k(Wlw1BKs;S5QMk7z)HqB8`~AkiO$<5qZfT(_oN+PiW1K!fHff;9eLrFJpz z4U})Je?b7zpNK{+L@DaZ0~xS$Kcc1~^24hiPPu}WW+wS)1kdytKWUhWk zg-cWfiwDXtD2h4ZwVmRW!edGUmwF8GDG-3TAesirb0|MIL#SIY^*~Me7_V3tU)Qj)5b@aQ@^iUl>42X(E>Ftz3ASEA5m!R$Qlr zZ{W?vDL2*A*+-I~iEs+b2yOKZaYmxh%I1g^eK~Gg9h#Jm+CPGS2HM>{Hv!6>gEEh9 z%Y-;7supn1p4C97asJAn`=5U6a3`n)+B=*XDI+BDWd@{tKXUPau1qO&IJY=t)koxA zR99BFvEA9Q-zBy-b{J6tb)YiplTh88b7Ry}*&Ss_-h=`7JaUg!KLttwK-2`}O1h9l z-m3OP=?*H|gM}l&Mu$O~W_s;g0kg&C280%=1?6DE)Ph1X5}5}^u%U;yYW@kRN6~!< zT?ajjmLwz|!Ozs9Nz`GE0k03r9tyhfjY}38r6)lMi$1b2L>$dBL@gc$ACQ<;p$<4) z&dByg1`0$q>?4Te?c!560>(193|SqN-di{{ddD|12dBU@O8DZRDqEiPG<{Hvj{`i= zS`0`08};vPh2nJcWzf%3DrZHdy+cX>a;#Ez7LrV z^H%0x1!@xYb6-06Ea+*oH&O2J8iKNRpNL5@iU!sRyr<@)j+cbvoFATs8*z%re6@=|Ga|D2NuWiq)F5M^})8 z*VeV#^=8rh8IJ%zU_08fnWr#yL>?tueCH1na`@=y!iX0SUk4TBF;1JIu$|x{7<|M| ztW?&^2_>Cqqop8)q=<{?Mn2Qw%qB7=Fztwpa5>u&m{l$M78U~8bJDKSO$zX2ga$P_ za~Dc4j8=F8VEaRfyb99^{R$45EAraZp_4fd|YC{pSo=#>W zBqx3$udl?NlQJTRG31k#Yee-Mx{y-;p}Z^V+3I~c_)xcak)3tyCkQD~-gZtW67^If z(%1)9Cl7p))5$_V&GgkUin|a_*w}z6w4!9nJ8edI^I6N#E;OZVrv5iUe$fY+f4W9}ZJ5K8lcxxo$)uX(-O>1z}gNutm24X}J;`*c8*$p{8=Xm>=CdlR1kMiqOib_PXB`{8X3sOEybD+qmr<7*d(_YtzG#ZLh@=Va6Ub`aTDbQg}o^G^`Q$tOK6 z;~BsFr~@@Us32qtBj*y4gwBc~ zRYTpqmUHKvIgq}#Z6#i^rw&8-?uxl|F}wSQqD;ou3DmGA1-$F1ip4=70ebJ4d2ZJ( zL+=K8tXHIA*?RQH6neTtv6Gc}BHy9#WQkPw2cgA)8m^#`fC6xwi8Ofqgu8rAQgK%O z<$EZ2pTcLet%3obbB;`tvJ$-8a`opb-Q)_;^0Z=5L0VU~i=aRuArzE;mPLM5kAl9( zC}+#0_!i*^m6I1(wt*5f)*eKG+VDW^cx9r^Q`wr`h>C_1+G)sxf&1{Nuwo3etFZj3 zBoo${)vqvnhu5YY(Phaz7JIT497=HESB>d4uSjBd#}fYrBN5tUY@=X8*tShBDMW+-Ie}`kMPSGi1EUS2=Gm2~y zQ6e6V6n_LJ>{8wwdV+3K)F>GPE};jqwyU`&pVN_dF>h`W+eTJow(2B@o>w|8bkM^^ zO2*NU4NuDuBvA-jbPtwUTfN-!BCjTTK1q;ZxMdDfo)2AkHid5Exy8!Ahiyg0Ic0ON@t!i06w zLvo+1VM2L0-yt7-nIgku41*4kp~tn%DN&FhCqQ~J@W!;ha9$FD(p$Ccdb2v#Uc%+7yXl|2$2cC8O4n0*?_lwNVIf_$K|T*(Kod#vC)g+S#`qjCBPJUt@E zH{vbE2;vRuT0~tpwl4DuF_@1r5|*9&SWOD04WG%_q^IKM0~(hynk3KyjcQ7s#&Xrr z%|mqQjQC>px)(gomyJz3Z@MkY-BQBB_`lvFmw1HUEIUC)lC6Fs$X}+Zn3u+XW}fvg z21;!(&jzCJ#TCWjwVK}a5=C+v8W3uMNWh89i3K?t6|+z>jz43!1)MqoW^+8kI<=*Y zz&`laZ|a?NeFV0(-R(o{x265KaaFU$S<_TyS!5%zC7D_IiM z-Vyrvdsu4HlMWK12f~dg0tfWhO^Vb`aqq8sEx)Az7#A6sDNje}fTQVg-0xl8_OGsx zB}%`=Uy=(C5IWMo)lcbn_ERt;JuN=MpVW10s?rSbAD zeB#WEB}+x+22pT{5d4eRpx+J#XN-@*ne`S5MkXTy&0Ant>p;mZ)ym+fRdZwzR)Wb`W z3yoipsz%#(`Y=VsiFzxrKYy2`C#d2TnwTJfv%yWeq$^m+A)`f_Gv_(Nflx@C->I3M zS7%8ms>q10&IVRJlbQ&7g_LB81S_XQ%_S9Hv!C>%K2UovLSX8n3xP+dr{I98$XQVs zq_2r;t#C49K`FuFjHcoEZS)vIJ)?LD{fHl{KP3(GL*7oJ?n~-*xAFoboV~rhzCynJ zPZV-ZZywR6O%^@jozP`v`m~%*B(Mx9B@0)op{pNAhi3+TAmttLKB=U;>%W{5QK(Pf zi;C+p#b}AT)zd3#Uxa$=j}dS}x!+ngZX_Gr>O_S7=fERse(!jD)Q&dpA`v;gVV{>Wz@Q?#sXi=WdAKpMstG9za%Y*`U1vD<`_T_ zh@g0a9*erEWJ-M~ab!-X!!bI9fkT79v2uQX@?<}^h@jj-o~w$~BsWDCMdCk~+C)Q5IYZSi#do842eUF;8LXPeg@yKteG2R?XfKV??rM5`7k`{^1 z59k@hk#Ybw2`pp~L$Q$8i5xcIMgtseLdOc0?C3i!o!ZR8jrHI(%#f6x3BxwP#fo>8 zOEV0+fm%lgCZXbP=VVe~;G4W=!pwV2ci&aMj^^^J>SvvsUJ=(2`VQbGWmq*K zah3qQ8-g3-wz7Efh=k_Klj;ho(FDy&XuntE7FkaeJ{9gHMfYw4)xQV$NV#0;Qo1g{ zXLCt!4`j(<&`mP(kHfb=wjFY6`b0nr$d})v2)!vXhsu%)P=)gWhGGVYE0OoA-=t%C zTumarhghSJjaxvt0_c%4Twp~UU)^HY>DlS!TWGsDz%Vt`BeGhMifH@*^xY3p1Z5hQ zNABAJ#4XrY_9xnumeEc%zT=Ugv5D&`Q)v#fQhmnB_oTcl1D!rrkMW)LaK$dP_NZJ_ zW&37lQ)aJc@>9cBcln?z{LZY$aBaNDHlyYNW_>hAnpyNoqj<{y9`pyYfjAIq9=~IXm=9TCZEK-*RN!g8RG(f)PPcEa$ zWcrjOHawWSZRd|MwZh4XB0_eow9&zrPOP%=z_w4{8+&Z~qX_I2B4YB0T3lGV>W6Nc7v`V>}+ATFp4+>a3NW z7DJe1NCt-~M-;JYvVRl6*E>p56)=^5m?g`<#Zt5VLNOMa`B{X;gxkUdP=O;mrXluDiW^kdr_Z<7@THHKx8(MnZgpP{vIhTuoY)x0r!=EEw!hCC|t{|2mo>KM&`0cm=KHy%%X2V)PyzDEr5n zKds|+NRmZmfk~XT^hPhw`JgxWj*VsSv|WW{<_QAHqWnYR7y@1NQ&~MzRvQBtdA6g` z_CSXD{o-_9G<-jf=aIaUEA8Nfqf#768M09RadKDs^&dnaMP5pwFV+x4>cbbf7v1kiH&ayT2_p)#W6B&QKBz-H|C@2^TDO|HZoL?d#iK4E> zWGQo0BsD2gsA+9>g^1NbdI_NA4Yqt!MQ%qOnsMk(jwDNURQ{H%?Y8ML^N}?#?T`50 zdM09Q`UPs<=s5RQ9!Q+Zs&SL%hR?D-e~I_w>oc1t2*HKzIGxXzXrl-xTi#pwBa_J2 zzffK|IVPWVsaVT^c=4{<4#*vG%q3-MSAxi{zYr_>&ca7vZB8>}z`RDH-l9_vww|;5 z7=WVxW`|1l-h9LfsrE|OQiGMys7HDa#|8Jbmiqz~NmSUPv=dQr3M9*wA{p>)1RtgW z6;FggTXGofZA0mmvvE5av5>1Qvlqgm47irmKGT`uoCHk>n`&?Bl(XAhF51cuSi8Lv zebz4oxhtYuCq1iUCf6-fiY^73DnH5fIj%Zk6k2rdpEzOGA~{{Zi1Tq$SoU`|_$@|>gx(Vk9kPPVm4lPs;768sQf2qRgX`cE*Eoth z!{h+q%f=>`SZ2PUf{yo=DT+2ZgU5%4*1tPKd%hLf#S`)tC#5LZZ=6iqPdJTq$Te%iaKiL7Ly zE7CHT-{;CqSFT!k#W5ei$`bGg>OMHFxmB^b6i!$uFisfhMY2F^!8S5V%rA^9>?TkP z`zP!o6FD8+>Eg~h+437dk&or_i2U^<$*+y2pM++39IKNS^oM)7-p&kfS z4k#?7s!J4gNEr07L^onGKJS~20uFZH|7zSUXgAZjkBP95!xoKMm|f10Z}tkN%Dl3FCD#0N;nH$m+rI{%EdK4vOZ%5_FlC@|{2T7G$Uosw_Fvyjr+?h?CQ44v5hP;(MjqY@pC^;+Epw*6fmR z=ks*iyR20^rE3Y$YC^?bW7Orj`X1Z?Zq@k{C zVaph|CvQEl61?Wz#M^_H8r6$_B@v(^u=D`Q#xs?FK>CMzV(EeWsPCl6@l&a&)Ko(_ zT$O)ybb%kUj$Eb0aTZXkjwMp$L|2Qo*sUs5OT4)n2h{I$EGk@lBBS1|CrQ7eW$VBu zHH|U3K5Lhn70Q`hA>+--ykLQpd902vNG|h2FqGBD(w@(JE9`YY4R}ZVRHf_6bz9rq zfbMG7BCO6;1HEXwF(lWvXueD%JGOywB8yid1)1%ZbHof~E&fa`++5XZ9q=)wAi-0I zE(q#UMH&j1ck(!A@qM(AMb<8K{Icbb_0%d6=MMpz zbFZiXS6-H??-~`@fGc1?JqT1cX|=4|8JYwf;~nP0s^MWKO+gJ(@-m*DC7+6aS^N@- zr6~I!n(0&)n3`3+?#`-B=+jBFU(ed6~8h%v7VFvB0LfC>ji;X6T(1v9F5dD97EEclsvm-jQ# zeIa^+^to1EY(h-0-~QnUy~-9MHC#WLgik-la26{c5Iz5y)@Gl3@gRpEVAF=^`{5!O zoh^Ff*<)xBY4(V2y=0A9!} z1U!6)plgDh%V|&CT`LB+o?31k^{R)ehleTMOfUJ3JMMdVk1$Pl^=U-tKcQ05VMIUh z*RN<7cmXS7Zf8R!!#Iz$u&t|oam?6;SLB6fv%L$QmaAgRJhAWOW~pIhj>>Z77nX#v zp^-r~`-!5TvYvJ?*Y>XQo_@8rw$&yJWtY8obS3hFavC{5swf>mrG|;`wX0S9MH-qo zE}R)=>)U9eOEZX$ck18J9X}|BF5anrl5#A0Z?uV!%Ka7Zdbv;Ex=%HJ)_D_U27Io+ z)iq`E%^fRso{y_FHR1_9TK0D$Ta-~-SAUh6&3q=EE1)WCuG9uWma5<%)E7bCKl*7Z zJ7Ma2@}jG!3NM(luu$T+EOO_1px&AQXvU>j=e>*Xa1&P0LqDV1{@hlFI*fD9kObHhEJ3mvkM< z(;N&@F<{nRkO+Yv$ZDsW%ihVLyXKKm3&UkyDq9o7%Rs+bQDGoXuL=K9{0sk5+^XSq zR@*3(s|bLuaqExYY80c!VaLyOIU21=R$yP=%UADvd`%DDA*&QQ5z74ftgG(WyLc1M zKU7+^T(2skrZvkh#`G@?r3;4fx5>Yd=x{KgzUNwU5xOYC(2bTxRx)7Zd`O;>+Oc3f>9}o0^|(s%)x5x^Kg0aUG`$(>|=C%n(otvKH-r z@JE)*+BFTtT;yqK1fyLCVk0EbF{4O{(m9nDq~bI>G?phqG?v%tHMttiHl@aqy>E`x zun$ z2(7K^ACfyu<+{sfee{JMqUAPKHpnN`gJvmQ=b{OKs5)1!T=~I8^t4!g3igK{K%!fl z9*TZuML;zah{Pa$k7_NEUYhp-LTY!ykHtV*H=xk9wgx=MOH8k1;6Q-R*R{((uFuq* zs`^0g*Q;&^U=^@yR$t0Xb`**YbIR2>$wSs+Q8&CkTS1}+Nrl`ZG}D!ke8j4G=*pXH zyMv+OCad3;z4LF9NLI;e>qMsY)ustG1ye2q$uJot84DpOlTWlL)29Rax_!9y&TlH@ z>3$K`#HPtYx6v~Oug7-N4+rPCe2H3FeUI)obja;z@6u$FeMSXzTv;O)okoiRn2oRa zcg0{XDX*5$({gpv5gAW7G52K5%jfo!caFFQ~_c;0DU$5Es*+gMJ##A1w)q zH?nHu8U>ytUeVHLGNbLm8_LDN&1mPyU@KC~hp*fk;$ z4iffddAgFw@unBB>Le@(uV~22j|qXJ!;__cjNb(6KYtSc`rAK?|M_|@Zm{|V0sQp& z>+gcEhtvNgAAPMpSRhbBFXU}N6vF)aH-Gz0_#ghmS6}_+S2;!+e!>^>51Qob@QyhB z^l~=G^FQjD#k;+)_1}MzQ^=o;Mk4T%`j8#1wT;9ceyKVw+av%Pv1T-0K*C?wA%Zf!&br8 z#`)ya>f&zgeCWm~Cd-AaVB03*_Mu{`YqbmZPX6$^e~~-eK>-@3XfQf`P|>O!Y~(L0 znaXR=WNCcvgst|Qg5NF|1(@IO9v&R+xAzMcNH;^}PIcIA7i!T%S)q~>_jm?omQBQe}o>Z-oKiQ>lSjsJL=&F*b6-utPxlLUZ@#>fTpv~mi-HW_Hi99Sf9rcOh``fi zyo%a_I|I>5Yxh728P4=tIh@HLN4t?nN zS$oZAErbkrasOd!ud{pT{VgEftMYLx`*F_7TU~HrBUS}6b3QxT+s{8!dK*QqGgX88 zZDb3+#uik3k5~4+>|?J@U@+FviUV`2(h65MqYUa+r8PouW;Qx+ zY+14Gy*1`@ugx)^dx35~uL!%>7MaogHp%+F;$r0$;yP7!uv2A$ohn4vsj|RMl?8UIEbxuL_O-YB=BNUmq1sjY+6&Vy^fUAp zXZ&&32M+$Y5VI|~8bHf)L3E^GgsdJG)0~My8vTRSSchakDEZGJKb!MPYL~c8y?3y0$W8|6n~D&BI?}xRn3*uhM_|>MQwQ|8MVK7L(b(%;MR%@sutx8h<WxXboBf$ zbU$=Q{r4uw`SvL;yPoB?*wzyQ10#r`I$2gqvRl#WQ>!ybb)m6uurDxAFxUs#cQ}9dE%w)b=H}*?U_{V^5mc&Xy9ZMz6%lkdH#fJt znZNxH|KT@Z;eY@2|BB=P^Z)+Gul^tUL;m*<_{aZ_|3CX5@t?t0fB0(f4}bWF!9V`t z9|!-``|5Z9?%)35H_^ZUZ~yq!Z+`hr3;+8%jXr<_4^clC&SsTJwh?{*$zB-lx}=T>`bXKR0}jVan& z?cII+v%R;~?%&Caey}$K(cbka5y>rlhgMV}ma0qtILKe3;VZ#Z? z_b^#Z=C#+*Ie4};yw;nc2;$u+y05SI1`;KX%`qLPob=>BsL*POp!zj*mWE9smC31piR)3dANP zu-?aLG>m5PfH~-SG>#1@g5(@&okfxcOeqar9pUpaC6zI5|5zK04`MyW3W2 zH+fW=qffX=cwlLCu_c9%Rf(rLTT=6V5gqFiD&Xj_nr9cqGHen~7S09+(o-n>0MIb7z>xu~g&3DHOnqZBM;a36F?+IwMS4wK2<@E*opC<}%MA&<>ybgG5nc+k+T%-B^hUIczybaagUDNgU> zNk3@cI|skC|K@9)4339nqvVC*n4CCTBOAfENp;go6k z)fiw8p*6-w?&H8y+TQN$`sdUeg+ceW!%&U49W;*YQ@tJ8-_<;S3QjkqH6D@+4*!>& zT1GV}R>9kEdYh%GZ@OUBgSW$nORf-F2vuqPSzhvEH$!?k)(lfH8D!g*`J zFW$qf=IgHEdyGuXRv2Q7#%|fcn^;Fj81H?WET(5MVSV;6g!^~3IRnn%g8QCEXt_h! zw;z-b_(S*b@VM7=)TVkTs3UgkWH9?a8OKNB_cqWMBOZdgv$t2mqiMjFGa@f0fJ0!| zW*7u$Lz7rCn;*rWhG8{jMi2tDHXsnZn-z4 z()sO(HAZmv;uL4h5KRfQS&3U2stMfgh$=jsJjCg69uI!mOiwSWiC?k#71;07s2`s~ z2}1a4wdgHV8<>LBc<`~R0UN=xC~FqnD+Du#6U3?w$i?!ulL-tgBbgy~#%u&?QL+`( z(4Eo+ytduJAdM;5sWDv)b{WHGM9Y{hGiW1li(cl#J)g(p={yAR)%do6n^7BqT$C~o z@&+l}z}+Bm?+6PS3WYFEpn1e|Ob7*`wmNU%Mj8d}VoMF)us**lI-`euHB)o!(5!@4 z;F^jxS)yo@3i`9?aX4O#d-%_29!=t8VF|yCov#!>df=8nawEj=X$L*!yf9p*1m->8 zlGmWHmZK!54AlgXd!Ar#jx2mSs2;k@Rp3c^l+y|AajYympxmu2@}=yF zteeDh|;r;ocGPk$j#6 zyTd$!=HKZ@*%MfaF89USoJRLEUy~*iTo6(tp}(fYtR61M{d{@+!teNc@0hI{CNxTEr5`KZ{gt(xg@}! z!O;X`@HC#>&mTe#Nr8gRnGE{Gwe+Yh8MX=9IS}nYK);IrvOr`i=xB$KyB)6)aK-f@ z;6lK{va*w`_C|&P&7(ro6E_o6lh?KS+?RN*RIXSHgKi>Q?7$p7lk7H66Ps>PLZhod=JYlm ztqMmdM6%&fUpBk-%cZuy7EK-*>vu@;2|62{Tz_aSi{iC7A*Nq6!Isl|*Uqjr4vY&V zk*XTX?x~Yc6X?Szq*gIWpa3}8fyDwf<2CZ~0PDHkUW*t~pg4IrtJ%`Z)E)(9-Q1o! zUXCLCqo7xNaIfOKI1SB$g+FF3AK5Y0+yI}bOE$@l=NHu-_sl4lEJs7DUP%>yT$fNq z>|VuFWXnf}sT7lH+tg94gR4q@xw?xJ@dmfB%BM1`D-mqgCl|yeNweA!&J5WZU-bKn zX+*`d0SC-?yI#AdrK$Dh(GQAQ8x3E6Q^wUU+LqdZE;b$1MgvET?p2j5J- z;u}#0W^sRkgs!LKzbvBBI!o&50a`LbV+-Pe@{ew=3q?_q$ktgLcSkdLJu7cgFOK2I zp`TWvADUcPCb}&Qqmd-}t_C2-J&5c*43S9`4luN;dWnnp{~Kp5;TeestK*w%ofvWk|LLt$`6tEAIQ-uQ`ooW zdoobV8HraKKv7Md*!H%#&&31Qi|;)6QUCy^dth1XbMQQm=Z1&`Zj>V$G=W3ABEfk$TO)T?3`{tgyDJ z&qe5{T5PzE>?va3ZG+4oQKk}DT&|qHxrH8;_(UDrEL@K!ji}$J#x-xFQREgr78^5V z*_~Y;tYt>i^c*Dhiy##RFQSC^o5_gsisJ#Q#Rg#s%OxQK6%cHhF{uPi4cY|Q?Y0Pf zfbEo0sl>%~qhLWn*VE*)SG%QVEYBY21=lnl_hhHW95B<=V2EM0UR)M9lX%%iXso?0 zu=|_UU`bteS2j^mCkla-S*^x+MccjTjP8j&j}~q-Bsz#K5ClMB1=bl4){@bhIF>uI z(Kh`;16j=SjQb`J(ptQ&y)BUtqr-t!OwbYy5++EED?2h)PxS_E0*&o$iH*&nOsmq} zBn_-XDhY&;KFx)|N$M6K)l?<6g%zV(^XB9z#79tuS2aWvSVZ{`D`=_&wmx9*X^18O zYn#@Ai^<0clCs{S)s)T_3^>z!zwBfS&4MJ?4NnIBVFohbrhvSh0DWo4)TFKNNUkXX zU(2CD6U-P9`N7Tf+Ipml84Swl*YON9?Of@(S~t@c&Bh1|)EW8Xn#(rc+!?CGAJPOF zlh3nslA$tR(DIuNJJdv*c-*4J{2?Kq>{a{;)v4TaV)ZGrS<0SRTAz@*0tZrMEFcB! zq!GfAejBg)=wmiS?h2fI?%ZDh35OPv=Ror_I1qTJ zoVsDaEauCZ7&F2+RFBsTIL2W#i09Dv>{?e7eF^f8)L;!`4#fj@r<29Jdj~A=Oo5J& z5{PNLF=k5*inKFAh8ndI8Wj&1HcpX}o=us=KzXCZm9i4Hx9#XnEaZ&@CE*K0c;@?L zG_dAD2?6hmI_QLGTKdcAiFp}WOsRN)A> zJ2=Cd))gY&;rHIT^)g)Xc|%9EW9UO#hrzqyC1I8l$@&MvX;mf@^7^0C)@qwd+Z1h? zyg)?BvNK7I>*E00xt_Fq=_`4J(_HzStTHbTEK|P0Q`NM#+NR~3V{H70UO@2plj<6- z3ZRS5o83422c0)%O}t#CTc%kmv++*)zDWZ2PR_SZf?NhMmH2Agc$?x!tQI$cIOcN= z8{=4yrh3F_YrG*HxovvHv0oYeUXG%9bPM+olr7&Pb@GTi1 zl20bkOs<}z*EEdN9`Y;byqHgQt_zYJe&UCraXmw_y)RY;#Qx|ud9S+R7DJKeWf;3@7s#oN14?nRSYfUASJTj$=J4h08UpkH>6;woPrWWNPZGSyq!) zS;)dpdpiqdizU)-K3HC+Y*eYR5INv>@8@gBdYQhB5pm>nGweRWop0!YEKkIM` zwGJ`!k*P38-mUeel*u;5``lHWm|yeLfHgG2?9>v3uc2ePz5(g?Na=HL6yhr7|Xud;RQCyitJ% zg+H#A7+kzJa=1)R!+XSaK1a3}Q28O--F~z0a|@fuU`7h2LmEwFMoqo%K#m+$lA|jh zZmzmc&cZ~UuNR|sLJxqDE$B`F49r~2Y?oK$R80#!kRW8r)l6Q%x@4QIa#Y8cpbDsd zeSzEdfhazvf4-#SuRg#{V9t7?WZu%#{zcSa6E^tYZU|aM1QsZy^?Y*R_ z!gh8|9{&ZlTa+l9ET$Z}*C^!$H9Hqglp-~Vbyx?tngY6(nWOxeWV{6paSPG4q}|b3 zG(oQP7!uG>e({>OeXm>4`Y%nhDQ6~L%#t){XpN#7EznTzt=0I8*JZu)>z@;9E{BAn z2DRvhupz1r0JN&jrf^Zoc&I7*_Dte>q8qE8`|VzX)SLBpT-v#|WZF`yHioTdDK)ak zd!`EWePCue(`^)A;`d1AXpK-2X+d1?f(CB! z$h^lJL{;r`B+im(@i@c<%;}TLdnY%2b)m2h8L{=$mDxG%zQyyG9;(_a7ezpq7#I+$ z))@p5g_IVUSzc~^!S>c0+)uX)G4ZCey}h%&y@fI%x<{Ndj!-SV7^0)&D~QTi|<#KOr^-sENd=Ydv6Q$T*e0u{C{_WYt(aF1$L)Brc6-3*hX*HeP+|GZ< zA2a>9^h4Ea?x`iLGYal``b~Bbh6b_O{xu zw}b-wbb)V@&Vq@LI(;lB#l5VpP%9KQahwcPaQnZnB^HHAp!P}8jlOq)RK3-DkrfFA zWR^=x%TROy zh&RWD=iO*A3u+3#0eD3Ba^ayk6H-gfCY4|aH`sUDy9c|kclHbFaXgLLek%&~x|*}1 zEpx}G3q9@b?C3lM`i5vsqFOE#@YW$?d*Qh3O0d}IzLG-N-r6@lCGwG9B1U?dpnxp| zD>kT9+rLzxZ>$+;SfUkX5H+0$`-V#rrhXbu2Fd44Xr^TA{(pxoQOf!9sB9yv5`Lb^ zU|dH_C?KaSL#{~{inZ*?I>+kDKJ;8ppKh*BtDPS$z*HitGfrLJ$0vNpG$o85`y<>7 zJKzMi5D;rKJ_cdWI9$YWahQy8nZ@uHZpgWf+?1T3HJujELkW77rVAGsd>5&bbBT$C zpt?Z@v3^gIrRLT(dFGxiT^!8#0yWfIA3ntWkJIX6W`)tZ{<7o0euVv$pKR+Tbdd7&?NZNkcD{Rdq6txD_R@%vcg^uFA+iY>1#-9h*8^ca<` zLA)4J;pHyOn(#=NPhd#eeq_})^5rg3Y*oc=-Wgx6xW+=3i7oV$_LsX@F@$x}F!k$r zHyj04;r*)E>w&2@=Mtpjx837ObUUhZrCL)KRG{yI6rlrisR0&n4Kcwfw+jw9gb-(@ zyTS%7fGW!}#qd~`Ns9gwYg;mJE3HBpKUTqH_C=P^6kW3AU+{f zH=s|-$-Zs}6m7_54b2Kb?VG-SH`4*!k0%pU4Be;bP8xD@5bY2UHkzY-U^HHI5krFt zv?Phst2i1wb?5Um2-Icg@kSxurL+d^<%V-P?I|6PQcuEN6PdKgb@{(r-dBjOJuYpi<62CNHqKX>8_*{KyutaGzV4V)fw_&xao7_fWK+=U1 zvgT7zfGHcrZiK>iwzqZ=0We*v)A%lA-&8h~ism)~Mf(i}@l-5gZ&%3aFamoXC|Pnb z!D+-nTuZ2A)0C?*hFu{ehJecCStzetjlYh>DDYrbR-h^@egCyY`_2z9e~6#XpogeS zr__ZhRpP>)jmhMaT~7tL4vYY~xqkOrwTtWZ)8RBIT9q*>DorZ_LTQOSC9YvlXTkRq z<)uGVfxuXX=SRIO-19b{p%@swj|0oUmUOL6QV*SGWRprp!BO`TJ5`}<5B(bs_RAW- zoMK377U);zdGTX41hQ4X{^#Gcod13OO)F3DQGpzzF^w?%&C%s0u5SurhX=px@9piB zwdYa*W5^bd$>+d>SB(%1FLTR|y+?v^47W%;Y2t{o=4jAt#|^}%z$aP@VU#mOv1@j; znvBGOk_T5bVTZ2>tcV^07GU89_xAgE#4qn*+w$}9S@aTm4 zvsGGG`;FmUSQn>7R$ZD+#>iBXX!)8lr85SB?Ds0WXD1I_ zB27@TfekOQV-mlKI(v(|yJ6Vn>n1nK*(3eyKr&Li@xbJV4WcRgi?UX8NsKG2yjGdH zZO9ihSBW=Sk(Z-`IIP2tSp}>E@uH0Y7Od-NG2&iLh=#q5AEHmgu)6Fzs4+bz2?i#6 zSJ1}Q-`#Q%n&v#vKoQV=tPRcP&0UHkWodjhO0$< zNLn<3FIc^mR8W9ea)}vYR&X*H#f0nd#MR1cpeb5r4(189Rw3p%F(?iRULRhD@TdHQ zQL7B_U@bLT6_#MGY_bsbdO=BVfe@+DDnaBjajd6l^9@5bWxlbw>2g)9wrO}VWTWsJ z55%1czQ+T&?nlVcUt86vvbiSoO61nGL&_?H-+j#bx~c%VDG@Rd%RbS5~WjHGnXUlP!zV_U{^uv&!mCvtye0EP5P{7h^rM$$$)UW@q)@Ni?J2Ukf#o!B^T9I_u!v@0!N zD9~=cc9%ZSswHsXkbpP;X%YohSk)o{S8D+3uc(tG^5H_zU1!Io%0=%u90kKWG@2kj zd}tncG;b zMC{kWwCNB>Gh6b$n2?MOIa@VO_-j|TaPQ_3-NH#0&!(q##R+xc9L{D4q2pYE$836T zSEfL{W~oS*bDt{VQkT_tVQf5&lf~?0K>B@HMb}E-sTs9phphsl zDb4c;(mNY@(O@L1A%bnP;401N8uf}4HaeRyq`B_QnoMeVimR;CG$$v_!X>Qw(I&XK zyZ`ZYI0-74$?kro>D`lZ`u67P@_aG=3AY-@>GcD8Q#jXEZb{L+c! z-{&5`q6St%XLO%Vhy=3Ql{>rA&?fP`b$o_#THV2b^NjhM>Rt#*DAPXI7|Kxc6vx<{ zz}&lhFwc93m)~Uvt3)qyP+$e9%DiJPghj4EU>%7CtkS$9ZDih)i7LQtY+kyXV@DQ8 zE!rv?SXSz~WU(|*1$s~r$+G+1M&QW|QxO`|`=Q_HZP)puRfKI%7+EChQcZ*fomtu= zF^&L}2ALBb(_M%` zVSlbSNbaFkbBgYKyO^Pb0k@$e)$u+FEQ9neSPj5{x=6JU7UN-`$D{Z$oN4ZLq`Q*4 zes7TCIfV}B^LhMuO(qp?Yh;Bh^m?DYb`b;xLl(m$rsZS1(>C&GwV!xr|Ccs0@PcWv zy_YL)J5c>_HiRh92Zipgq%#qXhP|Wn@J%6r%*8Sxq=DwS#aIy*pT_sF?BL8ARKU${ z?(XCaRXo2i^a1W+0C^BXP9~~DQ&^hI?(Q$3{VMy@LH=7YJi<1oELh{gQ9ObhAbmQE z=MPDchqJvaG+StJ7LHyFm>5O)=?s>T!c>*5+6e(_dE`QXb|i7jT#wY9s<0hxAvxe- z0EXy~JFf*Wm&cS2S_qSgP(7lt_swMZmqlES-5Ar%g(ZKmVj$#54JOWoW2+erC|T!n z7Y{9`C7wKxD{#Im&TLIeQzPRx~}D zmSRTGZ%p3SYGF`gy>j4a;veF8is0lY6}5Uc2t-N|1U*2m&g>87}hTbYOK zca5_vOoHaFn#$^DN>?~jCRvVVrTCnVPRqb?^hUS}Iszt-;bB7Sja!F%?}3R@<(-yJbCqZl&o1uHM02)IJZoLtwJ?nC`ET12mUL_gJRf_?3uB<32&_G+b2JAe7-$F3S&OczRrQjM z0=@5{+5-Jf7iWe5o$IyoV1Ks}*s0gDB@>jeE~aZ2(Yl&&k49?AQ2I>+G48$B9>D1W zDIS$zE(wTUEhZ?=*bv-rJh-{7CywJaMKa)JG&EAKrMf8QzMbkc+EJRr^!~O7@uy_8 z7{|RSGI(-xh)ND*E^Ys)#%rkoafgPv(G%%G4X%NCuy8?;w}iL5cW|5?Qs??0)R#~V zD8>ZMTWZ*rjN9NsI^JeHB;y!&0jLW0AW zR7}GxIFESHafA4b;y~BKdDwL8ElZfeG<1JTS5-uBVuK^^>m%a6 zeV5gh(ZV|CRBZ0yL@~EB_!=TK+q-wTYtvI2IyWJl3f|UY|9%mT2+>a;;2#e;Q`XX} zaI}mq|L5fPFtCWHlm?541ENL8(2-F^SDsZ!3MfWi;cUWQCBuh1!-b%+%Ib7(l1L_* zEc6O%3MeBOm#tJ5+Hi z#Uea}uom}%mx2jY75+cVjKVOr;QZ+s_@-%{|7WCChGVn}rRqZ==Y4=~jOm>22;ap}Wf#_+5lAWW4k8H5t`|kbiE2m4y6RTtO;zxS=B+OLeckV%6Cyv`&?T8kpRt0f{YFtV8UF}A&DMVGsQ6v&g`G+C;28HGGm9DQyi|B|P5;gs- z8MB~pJ`q9vhv5im)0>m99T7dVDdkaYOpEsE{n-qx?IK5NbNr!uczE3FwO)mnJ_$ggjt=fA(t8nl zbKhDKK$%mRz~EjL9_g#mL#TK?K`8SIKhX0YEjaBhtQfV<)V7IjL^WKh>i9b8A`uM! zkPT`8JAS-j*6pcMSf~N(C5>3RYrX1qd*8`uEgFtruGw8zLn_*lf;9a!?8i+3ss?Ke zPC3Sm(KMd-=vtXIC^!eBcC>tP-Hc%H zWeP&R37%EQ{;qOS*jUXG!G5{8MOUACgyhmW`W0i;?|9gjLoGp-D$A*H8ff7i69zh^ zYdhlRq2_TJ?7#!60Tia80TisRUEbrJ)KUbuygB&OddL=L!)tMdR}B}cozWc7odH{V z#3rCN<>;9$I6kZfaRtoN(2amD#zmIA8;9Kzc#FoaM&tInOP_T(8`?O)>LAg9bje)7 z-U#Bw2Fk1MtGX7K)DNll&;$7r_ntHcxA9rzAJICHpECn@_LL84W3Y?#*R&qNmYyGW zL(ZtR1y`O?HEN57tw!P^*nQyY>!}*6xJC@C1zbv5tp-|V&wC35Yu<)77|N!Uy0ofc za|dkVZ23G5Czv|5hitRekXCIou>~Hr8Y;!Z!n@pC-2NFs`05UjRp9A?TRd_#5KZup zVSJBl@k#R#s$tiHPZ%eIhmDXsLxRsr4hhnJ$~bGB5EBJvpwv}_-8%5l2&IRWl3Diz z75(nAAz>hgIqe;XskB4`a3*{gU7hHc5XjnIlOhB3TKYz!gVYC!8@ z8-aOSVnR&dy(2J;8qHYFS=H$sDgBZMs_#V-Gke>&Ss7Sl>Gy*QaIFx`IfeqU9_EG)Ru#p!06Q3v&Kw z0<|+REmU{?7|@M=JD5#B4iSeLa7qxM_MiYv*Gh3TRLuP`XYA6&9%2@d_VH4{S$sz0EU8qaSoJiY4fS*^!qqbz&=UblX z3o?sl=Vu6{rpW-t(Z!TB(ux!xKyek6d?qK;^AzxP7f_VBuzQgPr^n~>k{U@A44Cbk z*X@yopxgQWgx>GT=km6m-O;EUDG89Kwj2d;7s-ti;s!suSL7K+B!FfH| z&Dh8)g}0kka@R7u!m8dlI=y;LW~hxoE;_Y=oEr<&xC>H)Y1pe?29Mh^18-zC4nyT> z$>oDIB>3s)Pg6%BudyF`$d(;*BTErY-fWDXw-K7MV{HO<6UQ>JlcTy3!1X{Ifm*Bs zK&=uR*W$dHJVOnrISkyY{n^;BLqyC*sX=MXVzb;2C=VrhLc?lZ2WVoHbST@|IQb~+S%CR zvE>+<(VvghOd*%7mSlaLZf3PS_Lp3(c!FfL?%w`%a(;fjp`F!ZKjXeigg{p6?rXCv z^>_98S8A-OXts1-d&wwDhgO#?;gq@O^;sB>F{<0Guntqkh zGaePA_U7RK<%4fZ=^%8M=pUIb`@3uNwCA9HQ<^8>yVU{QRg)&a`>sUd61@Q6@Lx2_V@)uEN2|%HE`3oqs z1%3?+Fl8blmtB=k8|rDc{o%>OgTi91nwzM$m#}R2&L5>_(O%ZY#4C%^1JOArHL2yYygKR@*W| zZe$_iz2b!&Q9@Hnm+^(1kAUsKfSXOD-4(q=FCe~)7Na?`_wNGxdz4y=p6t-2jx96z zMmEHk1nU>^_T5UM$;R2}W)4uq{3AM%E%mJnzl%B)T0zFA-*@RILy? z%k@Hd3*w=npwQUN&GhJ-Sl6C}pWJoXooaMRG_2mL%}7UcPckn?=|;mbhyz!xt46KK zdW~8&;#JDo6|0eYY+4Qt-ZB?{Ze){usehUz9~Wo>t?nETQd~^(qDN^wjxxh=dHIGk zmOWqopGA-0qgoDJ#r-4=x??_oJ!9k+v1mOuQ~(})BOBt2e@s0bFUA{M6%GA7tMWAg zDSry#0agLXNjCL}&W^f~jq!B=nT*Zxkc9*gnhe^KQ8%&>Ul+J+x-X|@V|rY-ooKU} z%zM5L0Da@}Npmi<9aW2h4D1+7xYvdRiZAsQ^hc@#f&soH;$RPjrVv+vsIgiy*d|D5 z-xuv_!s{r#kAv)!0N`b?jR5c4>PjNf|8!>BD{7Lq@(~tDa zKy@HeO|miG;ligy8Xv`@D2QFeq&F1-P7Dytuw(hfR* znA;o(J$J?HPU{0;=wAa+hsG+b+Yq^|dpILCAq43eP98WZU#YccE~1+ZqA5Dp&sDEb z@hhF(kAuvt{KMab`$oVN9g4s_9HARhE{Mg_WxK%`xQ59T=`reNGu*p9crh3=nMK~l zDy`+^z$hL$v#ZPSJ@1yfWVQ@T35VU>381#VJC3}W%%)=@{>o;f$Cg*LCtj}uF@Y+A z$^|uqlNE69jln5`j^I2(ia|QORaqc{-j@io2uK&VCYNEg8e~ztF|3LNB?!BN@en!9 zbM(_oQrrWDcE-vgFqkbq-dTHKWAKXTbun5$4KwRDU}r)TB2gHEIFuCJY5Zx3n`D12 zRBRYOoxB7W6C6KIhiP2p;H_4BTy~B2q4<9XTd%2qj_mmK^MGk`K-PqzN%wc{-TnQo zwrRbC%bh(IdVcZk4NTN;&n}Km-kltFuTL({TZNRGqnf#Mc`(ZE0!9S($%;Nr`XA#L z2&u?SK&pL66|h+wfq4u>P6*0TTO9GFGvYZ%D|8@z2GMS>ksvq~o0Ow)hHLGkuqN=G z{a^NX_u8Gm`83)*=V_ZNUzcZUDO5M@u%Xmvr7~@oNK3_WYPNZ;%Fc^UyMT!!bTX+R z&7XrbU2%Sfe*3x;?dk9?o`-VH46ohCI;L#{p#v0lGo8liVKj@u2-B!P5A2G! z`LodR*fdc2f+2NH8{qUb`TSCGD!fnae)RZ)A$2+7`C=TW!@ea^71@i|54}_sC3!r; zo_UuWYEZkgcf)ixHxP%M{%1J+E-y5Yo<=VZP}gL^iCQ9n5PUudj}moUpQo1!r-`T% zoV{t>M@F`xO^%bll+$E_tPZFz^E8%A*(^5p{RiXi1~c%d}v${-ErOC(TN1}RU&%S5M5EdeLh zaK1ovnm*4;XeQ(7D1O9^l~iHS!tfQBd>p%?tG%m$NJA#?j-C zL-e<=*^8pV7)ocyW$Hf@D}O-|o{s4iMI@-8dwF4~j?Kjakgy{9$sm4F+K{=Xk+684 zOuD1#Lu94)%YxPA;pB*00yjise+G5fbSxsILdkf!fV#E?u6;sTAYHBc@($9D7t3NR zsC$oAH}E3VZwU4Jud-DuU7!Z*;fCEKYl8 zCuhgbosA*;x5g>!nAiwSdild)uia^Ss`eXoeVX+dF&8RMjRzdOPdR_*#^!#Jvusn9>n73_a>RmmDh0r3Ite z)COmfV_;`-DRt%ft-LBBRm^AaY%mLR4U24wc7EAMHJl3hVRl}onYlrfimi%CEmP?tF}=RXvKur(d^^Z@cto8 z%e0cN+Jxe6rwP-=Y#zrKcN-uMV{y?uPt#BjLuYS4x7_LU;-}-Q4{tAS&W~EJ+R{?* z=JL`$#ZQC9IdeJVodAqCSGHcGo^y1wBG1lOLP`~6o-#Q0 z3?H4Q)Vhi7jrCd+v5vcD2QJ+t#js2U$0Vf&@h-dFjesJ1F@S=lnq9^N@T7bY6vQW)!Sxr+a?K*2pO(Zg*aLBcj`V^jn~ z7^)8jtP=Ex@UmTs5pOi6=8UghZKez7oeXBvkHf>OQ}WMv!G~h7ER}j9o`K8;I0LaJ za0zQ>xO($wz6d%w*sMn87dFlFpUh^9xI%G%^Y{>Dl;Js#ALm~jCYw2~Xa^h)>e>8D zV#$O@7)u07l`dvhV{Cl?Y=*d;Gvvjf8+ad04sdnF5|qV1u;aqt1fS6={ZHuGBXfTc6{<*;Ux zt%W;fXg%ckWsSBb4&jdI)xxGwm*m~n7IN-#^&;h278NAop590=k3S`>vU{hy#E61T zlq1S?QH{c;ZWz8icm)J0Xoa-D?r)a-+H}EsWk2O&Vh38YVFwOeycrX@8sYrNpSUHSfB^Tp%FlQhOcZYs)JCz z+0*z_nBOX^LgXHaVr0lU;Zyj-*##OLC25!|$F#h!IHyp%(FTqWGfc_bi4aE6#C{kb zh=D8Ag_hleMxc>+m4SxK%}|#+MCMIU?$So!%J6NzK#Ez+=RT+w@Egqy2)_J0pz8VK$z786 zW7_zT6>R+MfUu+m$q;u7he1^duYrcA5T(;U3`o;0X|Lk(5G`lI{Pp?AIS`Bvnu1&5 zF~e;nbeU`qUaz=bRYGCwaHhNJS28f9B11e#;if?GOi&QPdhIs^phyq^NG$mi7z~U( zRGWqQaV&h5Hc&(YW<8Ah5Af98Ate5=6ox9%__KCgrTK-`)2ivBgwW;UI98fRSh&pd zY{^tieTGA0e!ijZ3fHeuSaLRx#?v4Q%&@ph%QyWSF+cT3!@WvpXfTQzE6q4I4}tJc zg8{YQXzY)`=NcTo+VVvg$K-@~KKCjEWw@anLcQ;zU1MTC&z$yhfs>sM2l09uMBv)x zk|vR^@zF3n93_*umn{ax#i?(4zHHSj>Cz^W@+&g&k?qd!LyX6^?gl=5@SvUo;6 zHWL#lUw_joJIFe=sbjdW-sBQ;$pAtSYY(uKfncX91iP65DlcI#Ge8HWAUSNU1PS|@ z5h{ZqnV5pbgIoxT)sQRz`9&)wD|lUZ1#jvO00V&a3Bf@=5{q$wyg`3}4wC1q?IT3K zKSX6>gf#a@s7y=nTKFU6QGtUf~aOjIACHc=ysza}P;_*-{` zEKOFXhoytju1u83dab*REKzoLtDa5>@wz}{sj@PMfYR;5@VfFULaDOD8BM4v+{5jH zP#WKCFM(f~7WT5+Q2A8tWr3&;Ll%dXVd&I8mq_9C_pvezNVTjxLRMB(har0`E02KI zVE!s9?E=@GRxmO+qtMLLqzs?S6@cD??cD`NtAU_LG@OFR^H`y=GTP(qbi zvTj$l4ED17nGZwBcJ5}+cl8mn%cwp=_H0!jp*|k6WStK~$!=!JfqK8?SUANaEa`Eb z{G(MoLOZ*e?aG`odo0?O&&6JrOSLQW7*u$N9IX_VF-)32>NPt7)4+|CdU z9!L4}IK$=pVVx5!7q`Rt0zEeIPct6=o#Mv%8Iq^)Pb6v|rU`=R z7R<|NnBq-t84RAI!{y*DjYvs4_&>?~Ax`zb5vW5;h;Nbml;Bc8m4Znlk)Jh5XOxPI zKgUEeLv$q5e=|b0{}=D0#iQErL)=P%F>Z$=WZL8TV)Aj4e4f0e>t%@`?4$1D5g%cl z@_Zc4J`oxcz^a;$(6o4_6Vj2-c&{MABV9i9S2PsRPa|roDJ=u>Lv)P6f`<3#dZhYd z@uO@@h@1~Q`ClRfK(naxi}S1Fvx^_QZ%>b%RyWw#57)`MV{^_@WJf6(4uUx0{r(AjCGAOy9zP$yOp%a2o!w}6b)ByvP-(0pp?n~6JK8gqY znc6VsuDZn~4Iv$RD6{JD;{3XMa(;Z}EN5wzxw4VYorFOSlLf7=7^=QLd4qV?Plr&T)hlF=Mw8)R)v=F8xGRH@W0&^o!g*f{ZIYYd4@eaJ4e>LTy{efYvLt{T zVseP&sM^`=+utpbe3DCCcTpcnerPRmjaJap2V^5~ZZw9c-562IY)=s*{z8(>C?p>$_rJG3VMk`kI4O4{e6ggM)XVm`fc(^f2YXc`!C6@ z7od~pxF#B_Op`L|m@h+5kV7P;xYUpDhrxK5Mg6T?A|P`)o;zY|fL>{RdZ0eS_ameT zB#U|X4yidu>LnjZ8HZ8`@IE`vGgsC}ZO%wxOLwg^q*d!&~^ zJ`U_NoRIl&qNwj=GNAI!gv6NXb1ld}i{}r?0B;Btk7g6;uX+4<9jD0Vibf~6osX(O zV;Tdih*KUK=d^cpZhm#UK=T7^@*(8?eWC=d&xO+N(Fqdo(7#6^eJ!c!h%dQ1Wv{p-X%a zPyQZjML39TnI42}>zY$Kn+>F`awRYB$bN&l#(&EHy|@E}xEx!*gg%^OgOKB+pHGgY zZH`qVaQs728`&f<)RpQqi-kZG3`&=~TZ~59_RkP&IgwaBY04UtZS9E}9Tfq8S|jbno9UpdxF%8J0NS!Bqprl=+4EH}1HZkjC3*-;PpT z`{eMMkgKOpBs4&i!#+#~YK1{_jH3zKxspCkWHOt>TY-Nj@DC|VNueVeT@UB{xBm8X zl73VbS&HR5CLy4n`V)!U^tA@f%$GYJ2N;|7ujIDfWJZZlz^kqIeCTs zE%Xbl#S?3LkR*ZHXTk1K;eUHZzjCmwudvNBOgv+@hA1?aFAwaX01=et} zC2J1BlAWAqY?oQf^v>GVzTuw3mOV;-+}qw}apWk@896M}mq4Lxo&@u>Nui%61hdx# zNL^XgF@8_D66QEJG93xxJVIV3UL{*SX$Xn%eKMvJ4({j$8c_mL-v>(po3n@*sCueP ztB6~xztMka$n2axl&5^ZD4bxV`Kj;J6Vz_Pvj%1=PsJ}}eKYD~^O)Og5=-}Q;Vq6ec<^7&>mqP;|M3;bwmPvQ9@c;S2UKZn)`aj6SC z@pHK{4*vw5aTsU>4<7}FWS8-7rV2s7Peuc^ZwP9glCM!CX%1Pb!x>D859qmt!afAg zAkpuY<5qcge77bq?cFH4r$O@+K^p(BtX<5yJ?$GiIwyeWPeh~Us@!+!0SD~-kEk&V ze|Y)BiBt*G%p@P3pc$S_j(Ye8J}PDcuw(L!?=yuEr7?{l;hQJ#$Kk_TFw z8rb_JF@URpK7hlCBB}nJaiu#7s<|f;L)hya@rM?mj&dm)B`s&FwMeSvz)VUlG?LOe z2A&YZ`Qxh%F#t0+p=C=o zUG)udMxxNl<_L?v95<~AO|ql*kKmsz0OhOwGLLTChBzsz){?$R%Yjbo{NwwN0bTBH_~g9%d$3dula9$3MKiwktiV?aINrgZ2FwICt!0Dh(yO`;BS@Bzmw zD0>`k^2s8j^dtyjkv;8Th&Y;Kh&ntBJ|H!#Mjddtn3C;{3>1iJ*hdh_o5iQ;evV~G zskc5T-M4UPbPumN2dBUlMfj4RYFnQ4G;>g_j{`i=S&T&d8};vPgyKxcdPO2kZ?axZb+GscVOY~(Wm3o!Az;=+&i4ivuubC#Hi!RL#5yIrjQN*EQm|+-tkc5| zE20HoKUh#Wj+JX{__ZOSmk~Fp@GSIDPm0 zsK;5SNJCDLb_Q8P}Ne%E)S^t$Rv{&hr76S~jC4A?uu;#2^Lf2;oHmJS5vWIR=oJM{~`+86in zvTcp`{AB5hW%GtE>otF9Cyai!e3uwLG~IT%$&vd6kta&;&S?sxpE7E#8R0Zl!52AA zMaBMY5;6!Q*4a=W(FO@Ojuld zv|}QowUWImIsF?cdEgISC`~nlb|S)JboP%D8%q`XOs?Zv!AzwFicKI(*(CN*1g7;s zcpCK0eBGO$Pfky|SO2Pm{$LewkRV*I;s6vWRv#)yJRH#4H?Qwj1o00i@X1qzb zHSCEA+&J6?lCk?v80%(DKQzAJBflgm%hqE)rs&o!>ZzRE7Ji4?mIbou@0A7wYPf_p z0}8-VC(@Ah6YlbrRn2wHm+zrNevY2(wkqa$CTTcL%2DujCz_C}*ORxw$l8i=3pU_f zFGPW|LMSNxEQ|cAP78BET+WuUXjc&ro%Yvq%nvPuoIQwJdc#|4$14+Uo;ug;MpU%L z(2Il*2JRW9+Kmw`yTS^qlI%unxxc^!Az7RDb(iG}Iqb<*ekg}VUNxrk&>cyH@|NJd zqSBK`Ov|=`yZDNRfw?JAcWtg7j9X54%_NAG?L}U8tZ~-JZh(5Z4DpKuCCaxT8VQq-x?a#Muihz(#cRXS6w{+&!11VjQ)n|&iJPNN zY;V2U>g=GBw*98Fy}h%Id+qT5aeb4-7$n7;*71#633<(G*CP(3+SRWtQ!2LcE9T@~ z_?dTkS$qXaf+oRXDHYI9?OT-uIQ6O|p{y1Z(Uovkn4MhJN>!3xAte5eMoyKaS3+4< zZ%NKu_{`S4{Z8pBq<46)CWehC%d+Kne9bB)g3up%LggXgRl66QhU5?NEPt-d+K8feH+v->4`5m z_0d}W&y?cmW52mHt)F}CSob~4%z676!|41*m{5r zUCcS7MMHv&1a^MljcvT)y(9vqx0Inu*FE$WszU|wY5nSEI)F8)ex$Q2@%;s^O`Op8 z6yV^$6*FanRlPqN-VaqF3BSII$sfUAJ42EO%<*ZltAooRoIseGUH*3JiWnVkr4c5W zejac_vAQ^eALtxga_yTAFZfO)P`lx1oTCH|B9&nr%NAn<^#)Zns;V4YmwAN<(5E5N zrM)|_Z33qYpUoGgr|NDC8kh2^7-)q?J*7#43Amy`uybkB{r zuF%+#4O?=6!Y7#5)S^%_j=o^82b?-}YMSE_&Z#YB1n$9iepBzHnTFBU)vGci&__Bs9Spn0boy1+=rmJ)4%?R~f7g zDz|kiWAio5T{7pyWrQ@Kp6Vi|!=4t|Hdh3iCZg>6J4&OF5UCiH&BKViSaJ6b$79S+ zA^rvO0ES6w+IxA74nU^yov7?f{3ypL$cv^bN)+VSNWaBOmIO_DCVl)pEH!qrgM{dT z@-V8H0{wNJBC%9mw60(Cw-h&%5(hiw$pHO#3_XsHx|cUcmzT&UPl3fCDtr0ROD1)@?TQqJ%pWszVA4GDjsk*uHT8ZG_sLSHhQ17DO zD(uhD=kFLb#7YxW1aR8BP8W2^4mo6uNb}~@i6-9f^vvF?(8jaq@ z4-wQe3Z>AGc0b`n8eP^Z167Z~C6?akFCvi*OeNNsxkfF^NVa)ozFm*wPb zo=)Y(plSqqdImv6A4s@ID3FzOfBhE|A_@)UdsXi}qR=i;w|;s_&67~={V4`cIP;vw z04+0WYsw107Ez*l5kXbKOZYc^X5l=h|4+6j5=#1^S6mcQAs+)ZXawPCQcCeD=?Z1ST== zWa2Y!Gm)+Uqsi4w?%&E)YfqH@7kyoREFc(EY&}88N7LexerCxDrD)V86G!S~(jTFJ z88|o&05BoXk00IV4pEf*)^k;rn&hX+q)0u;r9RaZQD|-Yad_Cxig)Th>T|N(YzkAQ zhu&vY8fx<_^qYQuE=44b%ltW}PMRwcrL4EcPa7hVbSgfntto`3sQ_Kh^vi?d_|USA zFbzgwP4pFDjW~4{Zwowg*Hn31OtKA(TC`*c_;L$9Z;T_ZWP!_~a4EM2t zOjQm;UU1jx{hUXmkkrkkd(H|ahFHX2zd>RNQhf9sZMNiGC48}QW3mvs7ICC!fWra{ z8N^UnAJg&fWw zkeOYX!I)C7!5CduXun~kEB1*)4?TNMy-hQy!>7tKrRm=91pD_`A?c}0?N(RC3SBN4 z?941V45r&h{&D#B$Bsu%6m@IzL_lH47xjY}O*S%mfg=@=)Rqr0bUHv>iM*FxFguR( z))o&0co^to>tRq{1$v}yAQ&Wvmp9mTdUkU07K$K>XOv(dD@7K0IeXJkjJLln&iRtW7 zxl${p(W`Zty_qRY4O`yj{axB-<7bm1|A1{qqhWXm;u(_J;?D-f6Zv;fYEpnu`|zDE zRKY_;$`(@-MoSlyp7($=STMSPgr9s;HLtxX+*28o9)pQxrWzirbB2t-9+W(Y^r6n1bO@?tZWo!W5?=mJK zYSSf19!O1~Rg5Xo$4}-#E~V@78+F`R8x3?sk?V8&XPOTKnxAvg*tnx0Ak4f7jR;*aA)sG(Rq z{qvacX00E3^e!Tw5dF*Tkwdi$!mB8&+s&JzZ~riyN>-KbsCXs~ab{Eap6Iu@EoL-8 zJzZ79d|4vUTE)N7he?K%bC_~O5z8j~H!Zl02T7`9ul$EyGXJfXnr(ct?oOzX@)j=2 z;)v_u3DJRJ-|_c-(^AY=Qmj>kEvusY7YwMqV{wBv0qN7t75VvNc2f;FX$cPo_l}Qm zaId)14c~vF-je!pp@MSy<KNDZRJC=dheJCF~(5csX4h83Ty#@5Rw>nC? z6s=gU_E&^)cttTohvPB5oXlnmG^~X8EAK7;$QB12oom-1{}`{)TEMLy$b2B&icJH_ z4&Wb4u&UR^#%dRW_Xa~R5X~dJsuhS)Z#|Z$!@IbI&Rv)6E5-QutQqHu3T2+Fjr`8p zgO)?C%^VEjzD$hH$qf*6Ip+ZbP-=yxI740bk&`R(eB=@Md$@9>WjSvR zltxwcjB;C~98i>=SBgx_w=sHTTTt;tnfQU*hLSgL<6dP1Wv=-kei?@YQf~#`XW}A~ z@L>pHU42&bJqaZ6qMhW6mD|hcbAF-DmnOPZ`b2fiLCe>o-Je01$qXKF`!yYYHMysdubkSEimrO78jL0dF59zJW$8Rx882Ugo?2uh( zZ<8E%dq0Z&WFsa355CJ&-O#D7gX00fm#vk=iM#rd%8;QfB{~npzv(;GonYw!U_xJt zCnd~_UdrulOYbRp>Ynl?@_%k#=M4Y`Zc}8U+Zdg=9S*-10iOZK#-u_`KC%E1KGplV zu26u*rEUkc`LAHqd4}c6{d9NJ5LwAWm!xGbzt5GKzFc+iieuh`-KpSj>8t*Xs#wJe z)i@EMAUF}E7s&!+7r4lv<`+(qjBAi$TxCguTEt`HR`Bq22r#JY2)Ua(e!`D=c|`u^ z5%X(ndzlx+X3(kuf@h8@AMZE%mG_JiSo8yh${q#Ebm@+!4u-)TOQiRogFfMH9)NRQ zs5@EJ2;`|CLUo{(NAAq>%*?E7fN~Mjcqu`b?)>#k1Hx)FbIJvD9xWFSaVo5>H9Ad_ zkKG5PUE0lCsyTATBI}%(hi;tX*5fd;AP*d(E;&QR(ynKY0T0);4)5$q58dei7{nEUP+zY!o zq0?|Ved=gucs{0Uxyc}!@l%gUsF{{e^bImF>E3Jp1x$F{5U+=)vx^0(Mx8bO)a+^2cJQmb-t+e=1KI@Bvz!tU~0_qVuY zeL(>gta9m>*>~>mpil4b7W^*z&i!5YH`@hMWnQ_z zQfvOXaA`TO-Cu)G7XNnXrTa_0ONA5Xz0djmaOd@Y!J_pDnJ?Tiumgqj^Sf~Ft%%7S zRQ7loUaed{#L4M2w}{cU)c0DoSwo?bizqekc4lY3ozK%(Tcj zn=6icxG*IiTZvLwY2@lup0cH{Q@M`^j=*< z<-twyckOpzG+bi@SiRZ2`@0JJcNKOxaTT(Ro~n%#Wv69cxxdQMQQcqWymo)Rq@}vQ zU3%&MGEYTyf1LL|=l2-}HD`p(7w#C%sjy{?JCL{TJ1K9b@p=F+wW=5WiV>hgzVra; z*HeA9B{ULw;^=|$=*UYNl&7qy)Ko(xT$O(-c!3|Yj$EZwdJ#~|jwMp$R2tDr>{b=3 zCEi?v1L`w7f;$~~MgGcju@l_#lU&%eY!ld|jyyK|Y2{M0LOGK?WxY9>7b1`{kM;2d z$z@(BhO+#a?fJ~N%3crCfM2Pf>I7z9x3kR+=&o*c#`0V>(2EWweR6H9hS)T+XB${2 zvU;VGvc+yWL(GsH9ZdDY?Jca%0UuGS7Cd!mF`@6vq@i#xtBgZA8FQ{+mw}e9Vs)3S zttodj8A`vhaA2opOy%Q8s)B#3tW$q49|AP*%2)+1--BzekyY4$E1*XW9&{IPy{wxl zD#H%(4s&7E@Gz66pa&^=Ih>p(pNoH4{1U0Q=&8`R)9Ji8J*$4*oxK~TxD#D~%Dz2C z(p~l?FtIeaT}#oc-ZbvRfHQ+}BQez#jIf|z7rVsjy7@m^>D(Zxb%i(8YMEKE5Fod>t;N>*ShLmOF~-rF?9nOxG?zpB<~9lV_z3w zMm|^q6%LBRcZwbhX4LQUrc=aN@H71`?`NvDMf?cqbEUo5gqZG8=ZDv51UFa7^5)4n zdi-$+XR-DH(es~aZSJ{O4|4bcHm#4QDn5eIHl#b6K13El{(GYKrB5t*<-S9|xRZ$n zK!2+Gx6O)s#tED@dZo8gSPNU>U6{Q2{)G+nEakZ+yNJCS{MKZ%&eH%rCG=pjYZ-Z z$z$=A;5I_a`>Wn{bDzHTpBntE@+NXkK(4YU{dPSTQsMHTv6g90L@Zn;2#2v^7GlLO1yC3Ujso9 zXNWleRf+Rxw5oGdpwmJx+U89GT+($YPqWuY4TW8IK_Ucx!1Z4>m;EY(?wUtNFU%Hd zV|Whf+Z7cC;>?=x56!>uFU_qQUT3w9vbl-?=n6M6g{?+2Y8-a_%oOO+nz$zY;*MXv z@5=Q^c!#V~x-^>$32tR(d=WTRr7jvSvjqlTSU{pFqA2w#@{yog3;k&Kz}dQ z^(ubJLzqX69R#7&W)1#>pDGJ{6X=wzbyB@?=NT7#EkrHKcDji7G zY4m6;PlOmOuhMIBHJVLIjo0qJc~ZkcM6uYA4O^#)moF{q_ioXY_{LokA3|p-E(vB)l`Wi1pm4u})&i4`SaO9HW`x?aN89xTDi&bSj?@E%FdlTeJuFoGE zKc{J=wu+;ReQEtWubk*p0Bbh~aBT^#R=p=a14KE}CzTe@j)0XbN7pZScden0f>L{9 zxBp67N~r>z&>GVsYtmruIgq4l@1(^B7Z?)rTpgs;M7fF(mWK3G=0gIJ`832eY-|On z-qpy)485RQFI#$QXc%p&a4~Ucj}o=`cwzO0O99{u$LdDJHJbs)n zKLz_k_aoJ(&J0CAb0VGmbCkFv;(|0is;NX8Y2F72o!u&b75~I@`O=lb%7f1(>~s^% z@K$BQsziPc5O9G$w=pr(>N$0l0q@ra8zDe%g7>saw}Wiw0l!dPnht2K#Vm`1SBS0+ z;g}3fNqwb%ZrNC_2C7<%icsudoi6P}0P#g=D45^Tx%f>M6Mf5fGW{RX>Z$Bqcq2)& zQ z5T4Pk^WyCZT&edP;Vjv)bS-@##k?v)eNACPDM+fjrQFVx39SaK*tL8pjz1hr^bVcE zW)z8**y>e;K4|0YQ|9aW?+{)_QNxt74V*NR;TXaq^W4z+O1-Ky8f%ZGIa!YSojHnm z$JM~GuKL}b8Lkig4oddIxn+7byEnhl3FBIez)8M<8jn9s(5YtZy~Qai~q-+?MZ+5hu>+8{?FGlb%WLiXld!w*Wb0i z?oa*`Kl)mKFh?wbUhr*16y^K+H-Gz0^k4tiufF=tFFZyXea0932Tk&IbW5ynaxtCZ z`5(>9>fQF&=I=l86#SFHK*c61{bn?0lBZeR!ESNEk7y0YX_}4>74*PfZuf5}|ACIs8Ir&duh^i6a zEPoWRh$^^&(WBDSsw{OldHXbvbFkTYvy%_hFrRJ;z8=B&sRGYfU3pZQ)c9vtN9R@M znxGHqOOKaYM3z{`Ymsw|m)d+h}m~ngT+IaqUq8*zVR&`%U(%%!oVN zTRZe&*k_#;pS2NJ+rkZuw3fYt;E#8NV#*UT04w}+VBy!>1NREn{6v)$+ZOgSJ$_SVgAZ z$n8oiT;AHUCAKTAu^qHXZdw(*HTLtM&9R>cfo?yq2z$^L+0nx`$@#wGV#7Ad8NcFk zS8`58l6L$~5K%hcS6pwW;_h}Tt{2?M+968zv>_Q-jDU@Hwh_dIXbIykN(2OQBK>U; zI`p?esLGB*qa_Xj7a6qWqqau8*jq($?dH-OG-=0$WZXI?4tDRAWXN>#xPh)%E!AQ zaLC7%@DVbwCg|Ou^~uLoC~3C}CGA$Bq`fLTxL0L?drJ#+MM--XzV6QUcBM0NP-SJW zgJ?qS283GhHt%e8Rw(T6P&$d5s`G5wWm$^U(!i%-~A`;+s0uomhn&T57~-?fwPCq%XU$?sc- zNs7jas^B7jS{|Yh4eG{jb$3Y%m4YoEG`0y9WEJnWzS-SwZ|`kwzxiGMB%dFUz6s|9 zU1AdG^-^vM@nMUL`e+u3fBO7)|MYMF!-o%pr2pZ=AO5Ep4%ZKFKD0mVeqc|?AO2_O z5qzm1hVX0ux3AKF`syqG&;Q%~m-%@5FVo@l+u?++UmATo{kV63_xSqhU+8x09sS>F zn#_}aGWr)DclIwd?wj`R*7WJ${{8<3uOX@^|MNd$)Y<=n|NOiE<16?79pdlr|38%> BWI+G` literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/slapd24.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/__pycache__/slapd24.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6831beb952a4306bbf9e03516335470f7c038592 GIT binary patch literal 127852 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. + +ad_2012_r2_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 1.2.840.113556.1.4.149 NAME 'attributeSecurityGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1703 NAME 'msDS-FilterContainers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.655 NAME 'legacyExchangeDN' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.21 NAME 'cOMProgID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2147 NAME 'msDNS-PropagationTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.301 NAME 'msSFU30KeyAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.686 NAME 'domainID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.23 NAME 'msDFSR-ReplicationGroupGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.818 NAME 'productCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.221 NAME 'sAMAccountName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.375 NAME 'systemFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.814 NAME 'msiScript' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.880 NAME 'fRSTimeLastCommand' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1850 NAME 'msDS-TopQuotaUsage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2052 NAME 'msDS-OIDToGroupLinkBl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.965 NAME 'mSMQSiteName' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1373 NAME 'mS-SQL-Clustered' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.624 NAME 'ipsecOwnersReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1353 NAME 'localizationDisplayId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1637 NAME 'msWMI-StringValidValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2103 NAME 'msDS-MembersOfResourcePropertyList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.480 NAME 'defaultGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.55 NAME 'dBCSPwd' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1330 NAME 'pKICriticalExtensions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.93 NAME 'pwdProperties' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1840 NAME 'msDS-ObjectReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.7 NAME 'subRefs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.845 NAME 'msiScriptName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2242 NAME 'msDS-MaximumRegistrationInactivityPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.713 NAME 'optionsLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.942 NAME 'mSMQVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2138 NAME 'msDNS-NSEC3Iterations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.471 NAME 'trustParent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1237 NAME 'mSMQRoutingService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.649 NAME 'primaryInternationalISDNNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1627 NAME 'msWMI-ID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2006 NAME 'msTSExpireDate4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2003 NAME 'msTSExpireDate3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2000 NAME 'msTSExpireDate2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113549.1.9.8 NAME 'unstructuredAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.340 NAME 'msSFU30Domains' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.2069 NAME 'msDS-EnabledFeatureBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.6 NAME 'shadowMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1412 NAME 'primaryGroupToken' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.358 NAME 'netbootInitialization' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2136 NAME 'msDNS-NSEC3HashAlgorithm' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.1 NAME 'instanceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.846 NAME 'msiScriptSize' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.20 NAME 'msDFSR-RdcMinFileSizeInKb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.663 NAME 'partialAttributeDeletionList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2078 NAME 'msTSSecondaryDesktopBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1995 NAME 'msTSManagingLS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.371 NAME 'rIDAllocationPool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.677 NAME 'replTopologyStayOfExecution' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.3 NAME 'replPropertyMetaData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2036 NAME 'msDFS-Commentv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.329 NAME 'versionNumberLo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.234 NAME 'printEndTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1673 NAME 'msPKI-OID-User-Notice' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.684 NAME 'certificateAuthorityObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.290 NAME 'printNumberUp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1625 NAME 'msWMI-ClassDefinition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1784 NAME 'msDS-LogonTimeSyncInterval' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1910 NAME 'unixUserPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.129 NAME 'trustAuthIncoming' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1319 NAME 'aCSNonReservedTokenSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1628 NAME 'msWMI-IntDefault' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1249 NAME 'proxiedObjectName' SYNTAX '1.2.840.113556.1.4.903' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2173 NAME 'msKds-PublicKeyLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.27 NAME 'destinationIndicator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.2187 NAME 'msDS-ValueTypeReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.897 NAME 'aCSMaxAggregatePeakRatePerUser' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1335 NAME 'pKIEnrollmentAccess' SYNTAX '1.2.840.113556.1.4.907' )", + "( 1.2.840.113556.1.4.1708 NAME 'msDS-ReplValueMetaData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1690 NAME 'adminMultiselectPropertyPages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.35 NAME 'userPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2200 NAME 'msDS-GroupMSAMembership' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.500 NAME 'fRSServiceCommand' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2038 NAME 'msDFS-TargetListv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.27 NAME 'msDFSR-DeletedSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1648 NAME 'msWMI-TargetPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1793 NAME 'msDS-NonMembers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.3.6.1.1.1.1.22 NAME 'macAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.265 NAME 'notes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2274 NAME 'msDS-CloudIssuerPublicCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1982 NAME 'msTSMaxConnectionTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1959 NAME 'msDS-isGC' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1424 NAME 'msCOM-PartitionSetLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.516 NAME 'serverReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1977 NAME 'msTSHomeDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1369 NAME 'mS-SQL-ServiceAccount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.530 NAME 'nonSecurityMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.506 NAME 'objectCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1386 NAME 'mS-SQL-GPSLongitude' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1437 NAME 'msPKI-Supersede-Templates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1707 NAME 'msDS-ReplAttributeMetaData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.652 NAME 'assistant' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1644 NAME 'msWMI-SourceOrganization' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1443 NAME 'msDS-Site-Affinity' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.286 NAME 'printRateUnit' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1444 NAME 'msDS-Preferred-GC-Site' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.589 NAME 'meetingBandwidth' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.1706 NAME 'msDS-NCReplOutboundNeighbors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1709 NAME 'msDS-HasInstantiatedNCs' SYNTAX '1.2.840.113556.1.4.903' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.79 NAME 'minPwdLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1952 NAME 'ms-net-ieee-80211-GP-PolicyData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.865 NAME 'pekList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.26 NAME 'registeredAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2179 NAME 'msKds-CreateTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2149 NAME 'msDNS-NSEC3CurrentSalt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1815 NAME 'msDS-TasksForAzRoleBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2148 NAME 'msDNS-NSEC3UserSalt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2197 NAME 'msDS-ManagedPasswordId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1407 NAME 'mS-SQL-ThirdParty' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.510 NAME 'serviceBindingInformation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1416 NAME 'mSMQSiteNameEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1426 NAME 'msCOM-UserPartitionSetLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1303 NAME 'tokenGroupsNoGCAcceptable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.596 NAME 'msExchHouseIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2233 NAME 'msDS-cloudExtensionAttribute20' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.335 NAME 'currentLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.20 NAME 'homePhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1441 NAME 'msDS-Cached-Membership' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.14 NAME 'msDFSR-Schedule' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.622 NAME 'ipsecDataType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.645 NAME 'userCert' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.367 NAME 'rpcNsCodeset' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.223 NAME 'serverName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.950 NAME 'mSMQServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2250 NAME 'msDS-DeviceOSVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.332 NAME 'birthLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1440 NAME 'msDs-Schema-Extensions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1348 NAME 'gPCMachineExtensionNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1833 NAME 'msDS-ExternalKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.858 NAME 'netbootTools' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1717 NAME 'msDS-AdditionalDnsHostName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.770 NAME 'aCSEnableACSService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.170 NAME 'systemOnly' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.32 NAME 'domainPolicyObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.766 NAME 'aCSAllocableRSVPBandwidth' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.9 NAME 'helpData32' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1805 NAME 'msDS-AzGenerateAudits' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.276 NAME 'driverVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1317 NAME 'aCSMinimumDelayVariation' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.302 NAME 'sAMAccountType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.610 NAME 'employeeNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.30 NAME 'attributeID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTTL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1843 NAME 'msDRM-IdentityCertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.13.3.103 NAME 'msDFSR-ComputerReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1989 NAME 'msTSWorkDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1674 NAME 'msPKI-Certificate-Application-Policy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.716 NAME 'mscopeId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.514 NAME 'physicalLocationObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.570 NAME 'meetingProtocol' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.2.370 NAME 'objectClassCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.15 NAME 'msDFSR-Keywords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.812 NAME 'createWizardExt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.61 NAME 'lockOutObservationWindow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.750 NAME 'groupType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1459 NAME 'msDS-Behavior-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.937 NAME 'mSMQSignKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.913 NAME 'allowedAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.120 NAME 'uSNChanged' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.340 NAME 'rightsGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.277 NAME 'otherHomePhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1309 NAME 'mSMQInterval2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1439 NAME 'msPKI-Certificate-Policy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1308 NAME 'mSMQInterval1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1383 NAME 'mS-SQL-ConnectionURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2176 NAME 'msKds-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.859 NAME 'netbootLocallyInstalledOSes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.967 NAME 'mSMQSignCertificatesMig' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2232 NAME 'msDS-cloudExtensionAttribute19' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2231 NAME 'msDS-cloudExtensionAttribute18' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2230 NAME 'msDS-cloudExtensionAttribute17' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2229 NAME 'msDS-cloudExtensionAttribute16' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2228 NAME 'msDS-cloudExtensionAttribute15' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2227 NAME 'msDS-cloudExtensionAttribute14' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2226 NAME 'msDS-cloudExtensionAttribute13' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2225 NAME 'msDS-cloudExtensionAttribute12' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2142 NAME 'msDNS-SecureDelegationPollingPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2224 NAME 'msDS-cloudExtensionAttribute11' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.718 NAME 'dhcpProperties' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2223 NAME 'msDS-cloudExtensionAttribute10' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.157 NAME 'serverRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1394 NAME 'mS-SQL-AllowAnonymousSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.563 NAME 'shellPropertyPages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1315 NAME 'aCSMinimumPolicedSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.273 NAME 'printStatus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.644 NAME 'showInAddressBook' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.626 NAME 'ipsecISAKMPReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1925 NAME 'msDS-hasFullReplicaNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.940 NAME 'mSMQCSPName' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.30 NAME 'msDFSR-MinDurationCacheInMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.243 NAME 'printColor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2193 NAME 'msDS-TDOIngressBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1993 NAME 'msTSExpireDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 2.5.4.2 NAME 'knowledgeInformation' SYNTAX '1.2.840.113556.1.4.905' )", + "( 1.2.840.113556.1.4.908 NAME 'extendedClassInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.953 NAME 'mSMQSiteID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2040 NAME 'msDFS-LinkSecurityDescriptorv2' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1343 NAME 'dSUIAdminNotification' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1700 NAME 'msTAPI-ConferenceBlob' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.486 NAME 'fRSWorkingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.62 NAME 'scriptPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1810 NAME 'msDS-TasksForAzTask' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.13.3.31 NAME 'msDFSR-MaxAgeInCacheInMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.19 NAME 'cOMClassID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.108 NAME 'remoteSourceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.704 NAME 'dhcpServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.876 NAME 'fRSMemberReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2261 NAME 'msDS-DeviceLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.82 NAME 'moniker' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.289 NAME 'printMediaReady' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1209 NAME 'shortServerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.910 NAME 'fromEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.636 NAME 'privilegeAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2025 NAME 'msDS-IsUserCachableAtRodc' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1715 NAME 'msDS-SPNSuffixes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.562 NAME 'adminPropertyPages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 2.5.4.49 NAME 'distinguishedName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1356 NAME 'validAccesses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2053 NAME 'msImaging-PSPIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.459 NAME 'machineWidePolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1403 NAME 'mS-SQL-AllowKnownPullSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.283 NAME 'assetNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.885 NAME 'terminalServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2012 NAME 'msDS-MinimumPasswordAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.7 NAME 'msDFSR-ConflictPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1831 NAME 'msDS-ByteArray' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.135 NAME 'trustAuthOutgoing' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2258 NAME 'msDS-RegisteredOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.608 NAME 'queryPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.109 NAME 'replicaSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2296 NAME 'msDS-AssignedAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.402 NAME 'helpData16' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.232 NAME 'defaultPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1388 NAME 'mS-SQL-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.364 NAME 'operatingSystemVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2284 NAME 'msDS-ServiceTGTLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1460 NAME 'msDS-User-Account-Control-Computed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.75 NAME 'maxRenewAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.285 NAME 'printRate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.911 NAME 'allowedChildClasses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.615 NAME 'personalTitle' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1225 NAME 'mSMQPrevSiteGates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2131 NAME 'msDNS-SignWithNSEC3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2007 NAME 'msTSLicenseVersion4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 0.9.2342.19200300.100.1.3 NAME 'mail' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2004 NAME 'msTSLicenseVersion3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2001 NAME 'msTSLicenseVersion2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.507 NAME 'volumeCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.137 NAME 'uNCName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2022 NAME 'msDS-ResultantPSO' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.168 NAME 'modifiedCount' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1809 NAME 'msDS-OperationsForAzTaskBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.328 NAME 'versionNumberHi' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2099 NAME 'msDS-ClaimAttributeSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.754 NAME 'rpcNsEntryFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.778 NAME 'aCSDSBMDeadTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.917 NAME 'mSMQQueueType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.326 NAME 'packageName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.422 NAME 'domainPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2241 NAME 'msDS-RegistrationQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.3 NAME 'msDFSR-RootPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1817 NAME 'msDS-AzApplicationVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.436 NAME 'directReports' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.240 NAME 'printOrientationsSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.574 NAME 'meetingLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.43 NAME 'fRSVersionGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.30 NAME 'supportedApplicationContext' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.26 NAME 'rDNAttID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1409 NAME 'masteredBy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.752 NAME 'userSharedFolderOther' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2199 NAME 'msDS-ManagedPasswordInterval' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1932 NAME 'msDS-IsFullReplicaFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.22 NAME 'msDFSR-RootFence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.789 NAME 'transportDLLName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.499 NAME 'contextMenu' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.202 NAME 'auditingPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.11 NAME 'msDFSR-TombstoneExpiryInMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1364 NAME 'mS-SQL-RegisteredOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.8 NAME 'userClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.775 NAME 'aCSMaxSizeOfRSVPLogFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.144 NAME 'operatorCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1238 NAME 'mSMQDsService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1984 NAME 'msTSReconnectionAction' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2286 NAME 'msDS-AssignedAuthNPolicySiloBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2180 NAME 'msImaging-ThumbprintHash' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.68 NAME 'machineArchitecture' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.1311 NAME 'printDuplexSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1795 NAME 'msDS-AzDomainTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1992 NAME 'msTSProperty02' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.583 NAME 'meetingURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1991 NAME 'msTSProperty01' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.635 NAME 'privilegeValue' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2100 NAME 'msDS-ClaimTypeAppliesToClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.115 NAME 'invocationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2288 NAME 'msDS-AuthNPolicySiloMembersBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1681 NAME 'msWMI-intFlags4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1680 NAME 'msWMI-intFlags3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1679 NAME 'msWMI-intFlags2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1678 NAME 'msWMI-intFlags1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.100 NAME 'msDFSR-MemberReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.100 NAME 'priorValue' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1379 NAME 'mS-SQL-Vines' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1377 NAME 'mS-SQL-TCPIP' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2172 NAME 'msKds-SecretAgreementParam' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2222 NAME 'msDS-cloudExtensionAttribute9' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2221 NAME 'msDS-cloudExtensionAttribute8' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2220 NAME 'msDS-cloudExtensionAttribute7' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2219 NAME 'msDS-cloudExtensionAttribute6' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2218 NAME 'msDS-cloudExtensionAttribute5' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.661 NAME 'isDefunct' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2217 NAME 'msDS-cloudExtensionAttribute4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.653 NAME 'managedBy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2216 NAME 'msDS-cloudExtensionAttribute3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2215 NAME 'msDS-cloudExtensionAttribute2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2214 NAME 'msDS-cloudExtensionAttribute1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.588 NAME 'meetingEndTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' )", + "( 1.2.840.113556.1.4.498 NAME 'creationWizard' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1915 NAME 'msRADIUS-FramedIpv6Prefix' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.12 NAME 'msDFSR-FileFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.24 NAME 'x121Address' SYNTAX '1.3.6.1.4.1.1466.115.121.1.36' )", + "( 1.2.840.113556.1.4.637 NAME 'privilegeHolder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.214 NAME 'originalDisplayTableMSDOS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.211 NAME 'schedule' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1228 NAME 'mSMQDsServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.64 NAME 'logonHours' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.883 NAME 'msRRASVendorAttributeEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.58 NAME 'localeID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.97 NAME 'preferredOU' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2033 NAME 'msDFS-NamespaceIdentityGUIDv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1334 NAME 'pKIDefaultCSPs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1411 NAME 'ms-DS-MachineAccountQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.891 NAME 'gPLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.617 NAME 'homePostalAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.320 NAME 'implementedCategories' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.19 NAME 'uSNCreated' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.651 NAME 'otherMailbox' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.345 NAME 'msSFU30NSMAPFieldPosition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.618 NAME 'wellKnownObjects' SYNTAX '1.2.840.113556.1.4.903' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2160 NAME 'msDS-ClaimIsSingleValued' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.1 NAME 'msDFSR-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.874 NAME 'fRSFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1713 NAME 'MSMQ-SecuredSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.825 NAME 'enrollmentProviders' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.666 NAME 'syncAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.665 NAME 'syncMembership' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.48 NAME 'keywords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2169 NAME 'msKds-KDFAlgorithmID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.370 NAME 'rIDAvailablePool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.214 NAME 'nextLevelStore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1145 NAME 'msRADIUSCallbackNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.303 NAME 'msSFU30IntraFieldSeparator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.346 NAME 'desktopProfile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.20 NAME 'cOMInterfaceID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.279 NAME 'printMinXExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1213 NAME 'assocNTAccount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.671 NAME 'msiFileList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2032 NAME 'msDFS-GenerationGUIDv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2279 NAME 'msDS-UserTGTLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.10 NAME 'msDFSR-ReplicationGroupType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1790 NAME 'msDS-PerUserTrustTombstonesQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1124 NAME 'msNPCallingStationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.487 NAME 'fRSRootPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1807 NAME 'msDS-MembersForAzRoleBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1823 NAME 'msieee80211-ID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.791 NAME 'transportType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.674 NAME 'rootTrust' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1641 NAME 'msWMI-PropertyName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.25 NAME 'mayContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.4.1438 NAME 'msPKI-RA-Policies' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.769 NAME 'aCSEventLogLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.945 NAME 'mSMQSiteGates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.25 NAME 'internationalISDNNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.36' )", + "( 1.2.840.113556.1.4.1979 NAME 'msTSAllowLogon' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.274 NAME 'printSpooling' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.242 NAME 'printCollate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1345 NAME 'dSUIShellMaximum' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.693 NAME 'pendingCACertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2257 NAME 'msDS-DeviceObjectVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.852 NAME 'netbootCurrentClientCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.534 NAME 'fRSLevelLimit' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1685 NAME 'msWMI-Parm4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1684 NAME 'msWMI-Parm3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1988 NAME 'msTSDefaultToMainPrinter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1913 NAME 'msRADIUS-FramedInterfaceId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.353 NAME 'displayNamePrintable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1696 NAME 'lastLogonTimestamp' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1683 NAME 'msWMI-Parm2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.330 NAME 'lastUpdateSequence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.696 NAME 'currentParentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.689 NAME 'cRLObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1682 NAME 'msWMI-Parm1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.22 NAME 'governsID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1632 NAME 'msWMI-Int8Default' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.169 NAME 'logonCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.772 NAME 'aCSPolicyName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.38 NAME 'authorityRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1212 NAME 'isEphemeral' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.324 NAME 'packageType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1435 NAME 'msPKI-Template-Minor-Revision' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2010 NAME 'msTSLSProperty02' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1961 NAME 'msDS-SiteName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2009 NAME 'msTSLSProperty01' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1336 NAME 'replInterval' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2066 NAME 'msDS-RequiredDomainBehaviorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2185 NAME 'msDS-GeoCoordinatesLongitude' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2182 NAME 'msDS-AllowedToActOnBehalfOfOtherIdentity' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.8 NAME 'msDFSR-ConflictSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.357 NAME 'nTMixedDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2191 NAME 'msDS-IngressClaimsTransformationPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1892 NAME 'msPKIRoamingTimeStamp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2174 NAME 'msKds-PrivateKeyLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.324 NAME 'addressEntryDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.218 NAME 'applicationName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1318 NAME 'aCSNonReservedPeakRate' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2023 NAME 'msDS-PasswordSettingsPrecedence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.99 NAME 'priorSetTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.914 NAME 'allowedAttributesEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.271 NAME 'printOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1996 NAME 'msDS-UserPasswordExpiryTimeComputed' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.930 NAME 'mSMQServiceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1780 NAME 'hideFromAB' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.578 NAME 'meetingContactInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2020 NAME 'msDS-PSOAppliesTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1944 NAME 'msDS-PhoneticDepartment' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1792 NAME 'msDS-AzLDAPQuery' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.251 NAME 'cOMTreatAsClassId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.14 NAME 'builtinModifiedCount' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.7 NAME 'shadowMax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.325 NAME 'setupCommand' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1647 NAME 'msWMI-TargetObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.420 NAME 'publicKeyPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1714 NAME 'MSMQ-MulticastAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1677 NAME 'msWMI-Genus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2281 NAME 'msDS-ComputerTGTLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1671 NAME 'msPKI-OID-Attribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.36 NAME 'dMDLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.810 NAME 'createDialog' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2140 NAME 'msDNS-DSRecordSetTTL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1358 NAME 'schemaInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1624 NAME 'msWMI-ChangeDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1975 NAME 'msDS-RevealedListBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1962 NAME 'msDS-PromotionSettings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.229 NAME 'driverName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.378 NAME 'dnsAllowDynamic' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1246 NAME 'interSiteTopologyGenerator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.817 NAME 'localizedDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2235 NAME 'msDS-ReplValueMetaDataExt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1933 NAME 'msDS-IsDomainFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2213 NAME 'msDS-RIDPoolAllocationEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.73 NAME 'lockoutThreshold' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.50 NAME 'lastContentIndexed' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.824 NAME 'signatureAlgorithms' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.860 NAME 'netbootServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.40 NAME 'msDFSR-StagingCleanupTriggerInPercent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1695 NAME 'msMQ-Recipient-FormatName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1966 NAME 'msTPM-OwnerInformation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.156 NAME 'comment' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.650 NAME 'mhsORAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.929 NAME 'mSMQInRoutingServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1787 NAME 'msDS-AllowedToDelegateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1389 NAME 'mS-SQL-Language' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.18 NAME 'msDFSR-ContentSetGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.8 NAME 'possSuperiors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.4.912 NAME 'allowedChildClassesEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2132 NAME 'msDNS-NSEC3OptOut' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.136 NAME 'trustType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1879 NAME 'msDS-SourceObjectDN' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.533 NAME 'fRSReplicaSetGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1434 NAME 'msPKI-Template-Schema-Version' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.241 NAME 'printMaxCopies' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.961 NAME 'mSMQSiteForeign' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' )", + "( 1.2.840.113556.1.4.1808 NAME 'msDS-OperationsForAzTask' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1242 NAME 'dNReferenceUpdate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.5 NAME 'drink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1923 NAME 'msDS-KrbTgtLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1402 NAME 'mS-SQL-Publisher' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2018 NAME 'msDS-LockoutDuration' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.688 NAME 'cAWEBURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.23 NAME 'bootParameter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.536 NAME 'fRSExtensions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.233 NAME 'printStartTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1788 NAME 'msDS-PerUserTrustQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.159 NAME 'accountExpires' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1390 NAME 'mS-SQL-Description' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.224 NAME 'defaultSecurityDescriptor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113549.1.9.2 NAME 'unstructuredName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.695 NAME 'pendingParentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1375 NAME 'mS-SQL-MultiProtocol' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2152 NAME 'msAuthz-LastEffectiveSecurityPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.56 NAME 'localPolicyFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1392 NAME 'mS-SQL-InformationDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2159 NAME 'msDS-ClaimIsValueSpaceRestricted' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.708 NAME 'dhcpSites' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.717 NAME 'dhcpState' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.762 NAME 'aCSServiceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.132 NAME 'trustDirection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.312 NAME 'rpcNsObjectID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1395 NAME 'mS-SQL-Alias' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.18.2 NAME 'modifyTimeStamp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2145 NAME 'msDNS-DNSKEYRecords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.301 NAME 'wbemPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.0 NAME 'objectClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.21 NAME 'msDFSR-DfsPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1429 NAME 'msPKI-RA-Signature' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1699 NAME 'msTAPI-ProtocolId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2086 NAME 'msSPP-PhoneLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.120 NAME 'schemaFlagsEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1945 NAME 'msDS-PhoneticCompanyName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.916 NAME 'canonicalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.702 NAME 'dhcpObjName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2238 NAME 'msds-memberTransitive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.133 NAME 'trustPartner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.927 NAME 'mSMQSites' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.867 NAME 'altSecurityIdentities' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.615 NAME 'shellContextMenu' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.866 NAME 'pekKeyChangeInterval' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2046 NAME 'addressBookRoots2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.27 NAME 'currentValue' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.166 NAME 'groupMembershipSAM' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1926 NAME 'msDS-NeverRevealGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.13.3.28 NAME 'msDFSR-ReadOnly' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1314 NAME 'aCSMaximumSDUSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.457 NAME 'localPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1189 NAME 'msRASSavedCallbackNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1918 NAME 'msRADIUS-SavedFramedIpv6Route' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 2.5.21.2 NAME 'dITContentRules' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.895 NAME 'transportAddressAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1418 NAME 'tokenGroupsGlobalAndUniversal' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.850 NAME 'netbootLimitClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.944 NAME 'mSMQSite2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.943 NAME 'mSMQSite1' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1664 NAME 'msDS-Replication-Notify-Subsequent-DSA-Delay' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.537 NAME 'dynamicLDAPServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2249 NAME 'msDS-DeviceOSType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.35 NAME 'employeeID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2137 NAME 'msDNS-NSEC3RandomSaltLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2151 NAME 'msAuthz-ProposedSecurityPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.267 NAME 'uSNDSALastObjRemoved' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.963 NAME 'mSMQQueueJournalQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.607 NAME 'queryPolicyObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1978 NAME 'msTSHomeDrive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.593 NAME 'msExchLabeledURI' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1329 NAME 'pKIMaxIssuingDepth' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2061 NAME 'msDS-EnabledFeature' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.278 NAME 'printMaxYExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.16 NAME 'codePage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1802 NAME 'msDS-AzBizRuleLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.363 NAME 'operatingSystem' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.761 NAME 'aCSMaxDurationPerFlow' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.921 NAME 'mSMQJournalQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2106 NAME 'msSPP-CSVLKPartialProductKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1190 NAME 'msRASSavedFramedIPAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2171 NAME 'msKds-SecretAgreementAlgorithmID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.703 NAME 'dhcpObjDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.890 NAME 'uPNSuffixes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1720 NAME 'msDS-ReplicationEpoch' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.24 NAME 'bootFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.614 NAME 'adminContextMenu' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.2.231 NAME 'oMSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.8 NAME 'userAccountControl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.621 NAME 'ipsecID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.511 NAME 'flatName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.784 NAME 'aCSIdentityName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.15 NAME 'msiScriptPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.125 NAME 'supplementalCredentials' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2287 NAME 'msDS-AuthNPolicySiloMembers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.199 NAME 'serviceInstanceVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1347 NAME 'sPNMappings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.933 NAME 'mSMQComputerType' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.780 NAME 'aCSNonReservedTxLimit' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1227 NAME 'mSMQRoutingServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2074 NAME 'msTSPrimaryDesktopBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.5.18.1 NAME 'createTimeStamp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1130 NAME 'msNPSavedCallingStationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.700 NAME 'dhcpFlags' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.629 NAME 'ipsecFilterReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.40 NAME 'fromServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.568 NAME 'meetingKeyword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2178 NAME 'msKds-UseStartTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1321 NAME 'aCSNonReservedMinPolicedSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.246 NAME 'printLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.2.54 NAME 'tombstoneLifetime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.765 NAME 'aCSPermissionBits' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1398 NAME 'mS-SQL-LastBackupDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2 NAME 'objectGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.146 NAME 'company' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1710 NAME 'msDS-AllowedDNSSuffixes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1841 NAME 'msDS-ObjectReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.5.4.8 NAME 'st' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.341 NAME 'msSFU30YpServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 2.5.4.4 NAME 'sn' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.707 NAME 'dhcpRanges' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.282 NAME 'printMemory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.924 NAME 'mSMQPrivacyLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.333 NAME 'oMTIndxGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.205 NAME 'pKTGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2251 NAME 'msDS-DevicePhysicalIDs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1410 NAME 'mS-DS-CreatorSID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.345 NAME 'groupPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2030 NAME 'msDFS-SchemaMajorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.513 NAME 'siteObjectBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.87 NAME 'nETBIOSName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2175 NAME 'msKds-RootKeyData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.24 NAME 'mustContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 2.5.4.51 NAME 'houseIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.3.6.1.1.1.1.26 NAME 'nisMapName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1917 NAME 'msRADIUS-FramedIpv6Route' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.6.18.1.307 NAME 'msSFU30MasterServerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.98 NAME 'primaryGroupID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1837 NAME 'msDs-masteredBy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.200 NAME 'controlAccessRights' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1158 NAME 'msRADIUSFramedRoute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.107 NAME 'remoteSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1971 NAME 'msDS-LastFailedInteractiveLogonTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1958 NAME 'msDS-AuthenticatedAtDC' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.5 NAME 'serialNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.509 NAME 'serviceClassName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2050 NAME 'msPKI-CredentialRoamingTokens' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.2008 NAME 'msTSManagingLS4' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2005 NAME 'msTSManagingLS3' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2002 NAME 'msTSManagingLS2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1363 NAME 'mS-SQL-Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.41 NAME 'mobile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2108 NAME 'msTPM-OwnerInformationTemp' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.886 NAME 'purportedSearch' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1384 NAME 'mS-SQL-PublicationURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2271 NAME 'msDS-CloudIsManaged' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.41 NAME 'generatedConnection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.864 NAME 'netbootSCPBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1396 NAME 'mS-SQL-Size' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.115 NAME 'rpcNsInterfaceID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.619 NAME 'dNSHostName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2273 NAME 'msDS-CloudAnchor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.939 NAME 'mSMQNameStyle' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.882 NAME 'fRSVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.777 NAME 'aCSDSBMRefresh' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.80 NAME 'minTicketAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1310 NAME 'mSMQSiteGatesMig' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.83 NAME 'monikerDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2150 NAME 'msAuthz-EffectiveSecurityPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.15 NAME 'hasPartialReplicaNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2194 NAME 'msDS-TDOEgressBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1811 NAME 'msDS-TasksForAzTaskBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1987 NAME 'msTSConnectPrinterDrives' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1953 NAME 'ms-net-ieee-80211-GP-PolicyReserved' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1313 NAME 'aCSMaxTokenBucketPerFlow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.579 NAME 'meetingOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.12 NAME 'badPwdCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.39 NAME 'forceLogoff' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.326 NAME 'perRecipDialogDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.51 NAME 'lastLogoff' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1796 NAME 'msDS-AzScriptEngineCacheMax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2269 NAME 'msDS-IssuerPublicCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1639 NAME 'msWMI-Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.4 NAME 'replUpToDateVector' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.470 NAME 'trustAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.515 NAME 'serverReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.308 NAME 'msSFU30OrderNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1669 NAME 'msDS-Approx-Immed-Subordinates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2141 NAME 'msDNS-SignatureInceptionOffset' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2186 NAME 'msDS-IsPossibleValuesPresent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.78 NAME 'minPwdAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.339 NAME 'msSFU30NisDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1701 NAME 'msTAPI-IpAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.249 NAME 'cOMCLSID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.774 NAME 'aCSMaxNoOfLogFiles' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.494 NAME 'siteServer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.849 NAME 'netbootAllowNewClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1931 NAME 'msDS-KrbTgtLinkBl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1789 NAME 'msDS-AllUsersTrustQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2156 NAME 'msAuthz-MemberRulesInCentralAccessPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.721 NAME 'ipPhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.613 NAME 'employeeType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1634 NAME 'msWMI-Int8Min' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2248 NAME 'msDS-IsEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1950 NAME 'msDS-AzGenericData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1646 NAME 'msWMI-TargetNameSpace' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.816 NAME 'fileExtPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.712 NAME 'optionDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.321 NAME 'requiredCategories' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.255 NAME 'addressSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2110 NAME 'msTPM-TpmInformationForComputerBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1785 NAME 'msIIS-FTPRoot' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.518 NAME 'defaultHidingValue' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.946 NAME 'mSMQCost' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.44 NAME 'generationQualifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.681 NAME 'indexedScopes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1865 NAME 'msDS-PrincipalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2073 NAME 'msTSPrimaryDesktop' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.697 NAME 'cACertificateDN' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1354 NAME 'scopeFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1942 NAME 'msDS-PhoneticFirstName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1997 NAME 'msDS-HABSeniorityIndex' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1307 NAME 'accountNameHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.893 NAME 'gPCFunctionalityVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2203 NAME 'msDS-parentdistname' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1687 NAME 'extraColumns' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1834 NAME 'msDS-ExternalStore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1983 NAME 'msTSMaxIdleTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.687 NAME 'cAConnect' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2048 NAME 'templateRoots2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.154 NAME 'serverState' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1224 NAME 'parentGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.926 NAME 'mSMQTransactional' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.925 NAME 'mSMQOwnerID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2035 NAME 'msDFS-Ttlv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.150 NAME 'adminCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2041 NAME 'msDFS-LinkIdentityGUIDv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.490 NAME 'fRSDSPoll' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2015 NAME 'msDS-PasswordComplexityEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.105 NAME 'remoteServerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.531 NAME 'nonSecurityMemberBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.16.840.1.113730.3.1.36 NAME 'thumbnailLogo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.586 NAME 'meetingRecurrence' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1643 NAME 'msWMI-QueryLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.962 NAME 'mSMQQueueQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1415 NAME 'mSMQLabelEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.16 NAME 'nCName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2170 NAME 'msKds-KDFParam' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.567 NAME 'meetingDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1704 NAME 'msDS-NCReplCursors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.23 NAME 'facsimileTelephoneNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.851 NAME 'netbootMaxClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2016 NAME 'msDS-PasswordReversibleEncryptionEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1635 NAME 'msWMI-Int8ValidValues' SYNTAX '1.2.840.113556.1.4.906' )", + "( 1.2.840.113556.1.4.719 NAME 'dhcpMaxKey' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1835 NAME 'msDS-Integer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.1208 NAME 'aNR' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1393 NAME 'mS-SQL-Database' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.42 NAME 'pager' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1914 NAME 'msRADIUS-SavedFramedInterfaceId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1391 NAME 'mS-SQL-Type' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.566 NAME 'meetingName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.123 NAME 'serviceClassInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.26 NAME 'creationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.103 NAME 'proxyLifetime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.660 NAME 'treeName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.892 NAME 'gPOptions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.923 NAME 'mSMQAuthenticate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1432 NAME 'msPKI-Certificate-Name-Flag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.206 NAME 'pKT' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.287 NAME 'printNetworkAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1431 NAME 'msPKI-Private-Key-Flag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1346 NAME 'templateRoots' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.657 NAME 'serviceDNSName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.868 NAME 'isCriticalSystemObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.301 NAME 'garbageCollPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.288 NAME 'printMACAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1304 NAME 'sDRightsEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.380 NAME 'extendedCharsAllowed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.86 NAME 'userWorkstations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1360 NAME 'mS-DS-ConsistencyGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1712 NAME 'msPKI-OIDLocalizedName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.21.5 NAME 'attributeTypes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.31 NAME 'fRSReplicaSetType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.341 NAME 'appliesTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.11 NAME 'ou' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2293 NAME 'msDS-ServiceAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.346 NAME 'msSFU30PosixMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1973 NAME 'msDS-FailedInteractiveLogonCountAtLastSuccessfulLogon' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 2.5.18.10 NAME 'subSchemaSubEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2262 NAME 'msDS-ApproximateLastLogonTimeStamp' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.222 NAME 'location' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.854 NAME 'netbootAnswerOnlyValidClients' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1949 NAME 'msDS-AzObjectGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 2.16.840.1.113730.3.1.34 NAME 'middleName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2158 NAME 'msDS-ClaimSourceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.706 NAME 'dhcpMask' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.2109 NAME 'msTPM-TpmInformationForComputer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.623 NAME 'ipsecData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1171 NAME 'msRADIUSServiceType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.705 NAME 'dhcpSubnets' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.1999 NAME 'msFVE-KeyPackage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1968 NAME 'msDS-NC-RO-Replica-Locations-BL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.36 NAME 'enabledConnection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.472 NAME 'domainCrossRef' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.52 NAME 'lastLogon' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.28 NAME 'dnsRoot' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.966 NAME 'mSMQDigestsMig' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.878 NAME 'fRSPrimaryMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1848 NAME 'msDS-QuotaEffective' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1372 NAME 'mS-SQL-UnicodeSortOrder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.639 NAME 'isMemberOfPartialAttributeSet' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.464 NAME 'wWWHomePage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.711 NAME 'superScopeDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1631 NAME 'msWMI-IntValidValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.3.6.1.1.1.1.2 NAME 'gecos' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2063 NAME 'msDS-OptionalFeatureFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.38 NAME 'flags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1240 NAME 'netbootSIFFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.690 NAME 'cAUsages' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2104 NAME 'msDS-MembersOfResourcePropertyListBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.66 NAME 'lSACreationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.709 NAME 'dhcpReservations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.4.934 NAME 'mSMQForeign' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1963 NAME 'msDS-SupportedEncryptionTypes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1401 NAME 'mS-SQL-Keywords' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1705 NAME 'msDS-NCReplInboundNeighbors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2128 NAME 'msDNS-KeymasterZones' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1694 NAME 'gPCWQLFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.195 NAME 'systemPossSuperiors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.218 NAME 'oMObjectClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1226 NAME 'mSMQDependentClientServices' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1676 NAME 'msWMI-Class' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2144 NAME 'msDNS-SigningKeys' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1630 NAME 'msWMI-IntMin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.372 NAME 'rIDPreviousAllocationPool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.848 NAME 'appSchemaVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1981 NAME 'msTSMaxDisconnectionTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1645 NAME 'msWMI-TargetClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.535 NAME 'fRSRootSecurity' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1423 NAME 'msCOM-PartitionLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.32 NAME 'owner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1436 NAME 'msPKI-Cert-Template-OID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1716 NAME 'msDS-IntId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.18.1.309 NAME 'msSFU30Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.254 NAME 'cOMTypelibId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1642 NAME 'msWMI-Query' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.155 NAME 'uASCompat' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1623 NAME 'msWMI-Author' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1964 NAME 'msFVE-RecoveryPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.764 NAME 'aCSPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.571 NAME 'meetingType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.783 NAME 'defaultObjectCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1365 NAME 'mS-SQL-Contact' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.679 NAME 'creator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.39 NAME 'certificateRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.699 NAME 'dhcpType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1405 NAME 'mS-SQL-AllowQueuedUpdatingSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.915 NAME 'possibleInferiors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2234 NAME 'netbootDUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.899 NAME 'aCSEnableRSVPAccounting' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.881 NAME 'fRSTimeLastConfigChange' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.898 NAME 'aCSNonReservedTxSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.771 NAME 'servicePrincipalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1820 NAME 'msDS-HasDomainNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2070 NAME 'msTSEndpointData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.620 NAME 'ipsecName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.458 NAME 'qualityOfService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2042 NAME 'msDFS-ShortNameLinkPathv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1688 NAME 'msDS-Security-Group-Extra-Classes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2289 NAME 'msDS-UserAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.83 NAME 'repsTo' SYNTAX 'OctetString' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1357 NAME 'dSCorePropagationData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2196 NAME 'msDS-ManagedPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.647 NAME 'otherMobile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2072 NAME 'msTSEndpointPlugin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.749 NAME 'url' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.701 NAME 'dhcpIdentification' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.122 NAME 'serviceClassID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2058 NAME 'isRecycled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.213 NAME 'defaultClassStore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2252 NAME 'msDS-DeviceID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.633 NAME 'policyReplicationFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1693 NAME 'msFRS-Hub-Member' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1328 NAME 'pKIKeyUsage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.459 NAME 'networkAddress' SYNTAX '1.2.840.113556.1.4.905' )", + "( 1.2.840.113556.1.4.1786 NAME 'msIIS-FTPDir' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.806 NAME 'treatAsLeaf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.820 NAME 'bridgeheadServerListBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.13.3.36 NAME 'msDFSR-OnDemandExclusionDirectoryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.640 NAME 'partialAttributeSet' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.853 NAME 'netbootAnswerRequests' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 2.5.4.31 NAME 'member' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.18.1.323 NAME 'msSFU30Aliases' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1243 NAME 'mSMQQueueNameExt' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1370 NAME 'mS-SQL-CharacterSet' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1622 NAME 'msDS-Entry-Time-To-Die' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.460 NAME 'lDAPDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2031 NAME 'msDFS-SchemaMinorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.12 NAME 'memberUid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1800 NAME 'msDS-AzOperationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.322 NAME 'categoryId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.60 NAME 'lockoutDuration' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.870 NAME 'frsComputerReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 2.5.4.45 NAME 'x500uniqueIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.13.3.25 NAME 'msDFSR-Priority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.847 NAME 'installUiLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1842 NAME 'msDs-MaxValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.9 NAME 'street' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2154 NAME 'msAuthz-CentralAccessPolicyID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.3 NAME 'whenChanged' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1433 NAME 'msPKI-Minimal-Key-Size' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1814 NAME 'msDS-TasksForAzRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.6.13.3.101 NAME 'msDFSR-ComputerReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.580 NAME 'meetingIP' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.539 NAME 'initialAuthIncoming' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.356 NAME 'foreignIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.565 NAME 'meetingID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.3 NAME 'unixHomeDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1721 NAME 'msDS-UpdateScript' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.557 NAME 'parentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.255 NAME 'vendor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.900 NAME 'aCSRSVPAccountFilesLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1320 NAME 'aCSNonReservedMaxSDUSize' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1956 NAME 'ms-net-ieee-8023-GP-PolicyReserved' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.773 NAME 'aCSRSVPLogFilesLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.951 NAME 'mSMQQMID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.102 NAME 'memberOf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1397 NAME 'mS-SQL-CreationDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2146 NAME 'msDNS-ParentHasSecureDelegation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.113 NAME 'rpcNsBindings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.656 NAME 'userPrincipalName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1934 NAME 'msDS-IsPartialReplicaFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2167 NAME 'msDS-PrimaryComputer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.469 NAME 'USNIntersite' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1803 NAME 'msDS-AzLastImportedBizRulePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2295 NAME 'msDS-AssignedAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 2.5.4.13 NAME 'description' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.922 NAME 'mSMQLabel' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2024 NAME 'msDS-NcType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2011 NAME 'msDS-MaximumPasswordAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2291 NAME 'msDS-ComputerAuthNPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1832 NAME 'msDS-DateTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' )", + "( 1.2.840.113556.1.2.281 NAME 'nTSecurityDescriptor' SYNTAX '1.2.840.113556.1.4.907' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.722 NAME 'otherIpPhone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1368 NAME 'mS-SQL-Build' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.219 NAME 'iconPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1417 NAME 'mSMQComputerTypeEx' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1986 NAME 'msTSConnectClientDrives' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2285 NAME 'msDS-AssignedAuthNPolicySilo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1638 NAME 'msWMI-Mof' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.314 NAME 'rpcNsTransferSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1702 NAME 'msDS-TrustForestTrustInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.557 NAME 'Enabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.21 NAME 'subClassOf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1845 NAME 'msDS-QuotaAmount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1119 NAME 'msNPAllowDialin' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.33 NAME 'isSingleValued' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.782 NAME 'objectCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2177 NAME 'msKds-DomainID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2195 NAME 'msDS-AppliesToResourceTypes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.152 NAME 'groupAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.334 NAME 'volTableIdxGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.272 NAME 'printNotify' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.334 NAME 'searchFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2298 NAME 'msDS-AuthNPolicySiloEnforced' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1428 NAME 'msCOM-ObjectId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.400 NAME 'addressEntryDisplayTableMSDOS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.81 NAME 'modifiedCountAtLastProm' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.71 NAME 'machineRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1123 NAME 'msNPCalledStationID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.654 NAME 'managedObjects' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.638 NAME 'isPrivilegeHolder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.197 NAME 'systemMustContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.91 NAME 'otherLoginWorkstations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.13.3.32 NAME 'msDFSR-DisablePacketPrivacy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2297 NAME 'msDS-AuthNPolicyEnforced' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.576 NAME 'meetingMaxParticipants' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.4 NAME 'loginShell' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.779 NAME 'aCSCacheTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.751 NAME 'userSharedFolder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.342 NAME 'msSFU30MaxGidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1380 NAME 'mS-SQL-Status' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.13 NAME 'builtinCreationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.277 NAME 'printMaxXExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.230 NAME 'printSeparatorFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1387 NAME 'mS-SQL-GPSHeight' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2054 NAME 'msImaging-PSPString' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.235 NAME 'printFormName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.20 NAME 'telephoneNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1621 NAME 'msDS-Other-Settings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.304 NAME 'msSFU30SearchAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.21.9 NAME 'structuralObjectClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.4.659 NAME 'serviceDNSNameType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.902 NAME 'aCSMaxSizeOfRSVPAccountFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.569 NAME 'meetingLocation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.261 NAME 'division' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1640 NAME 'msWMI-NormalizedClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.300 NAME 'printerName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1960 NAME 'msDS-isRODC' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.268 NAME 'eFSPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1824 NAME 'msDS-AzMajorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2134 NAME 'msDNS-DSRecordAlgorithms' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.270 NAME 'printShareName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1400 NAME 'mS-SQL-Applications' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1312 NAME 'aCSServerList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1376 NAME 'mS-SQL-SPX' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.368 NAME 'rIDManagerReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1371 NAME 'mS-SQL-SortOrder' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.118 NAME 'otherPager' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1894 NAME 'msPKIAccountCredentials' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.6.13.3.16 NAME 'msDFSR-Flags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1301 NAME 'tokenGroups' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1626 NAME 'msWMI-CreationDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.14 NAME 'hasMasterNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.153 NAME 'rid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2084 NAME 'msSPP-ConfirmationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.2 NAME 'msDFSR-Extension' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1846 NAME 'msDS-DefaultQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.35 NAME 'rangeUpper' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1633 NAME 'msWMI-Int8Max' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.48 NAME 'isDeleted' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1327 NAME 'pKIDefaultKeySpec' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1408 NAME 'mS-DS-ReplicatesNCReason' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1816 NAME 'msDS-AzClassId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2088 NAME 'msSPP-IssuanceLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1672 NAME 'msPKI-OID-CPS' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.590 NAME 'meetingBlob' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.72 NAME 'marshalledInterface' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1385 NAME 'mS-SQL-GPSLatitude' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2097 NAME 'msDS-ClaimPossibleValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.26 NAME 'msDFSR-DeletedPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1826 NAME 'msDS-RetiredReplNCSignatures' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2143 NAME 'msDNS-SigningKeyDescriptors' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.491 NAME 'fRSFaultCondition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2278 NAME 'msDS-UserAllowedToAuthenticateFrom' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2017 NAME 'msDS-LockoutObservationWindow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2130 NAME 'msDNS-IsSigned' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2057 NAME 'msDS-HostServiceAccountBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.683 NAME 'cRLPartitionedRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.481 NAME 'schemaUpdate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1332 NAME 'pKIOverlapPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.692 NAME 'previousCACertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.573 NAME 'meetingApplication' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1849 NAME 'msDS-QuotaUsed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.517 NAME 'ipsecPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1822 NAME 'msieee80211-DataType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.664 NAME 'syncWithObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2183 NAME 'msDS-GeoCoordinatesAltitude' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.284 NAME 'bytesPerMinute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.139 NAME 'profilePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.40 NAME 'crossCertificatePair' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1929 NAME 'msDS-SecondaryKrbTgtNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2294 NAME 'msDS-ServiceAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1414 NAME 'dNSTombstoned' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.104 NAME 'ownerBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1930 NAME 'msDS-RevealedDSAs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2240 NAME 'msDS-IssuerCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1692 NAME 'msFRS-Topology-Pref' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.158 NAME 'domainReplica' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.2 NAME 'whenCreated' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.76 NAME 'maxStorage' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.484 NAME 'fRSDirectoryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1916 NAME 'msRADIUS-SavedFramedIpv6Prefix' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2087 NAME 'msSPP-ConfigLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.627 NAME 'ipsecNFAReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.351 NAME 'auxiliaryClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' )", + "( 1.2.840.113556.1.2.50 NAME 'linkID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1718 NAME 'msDS-AdditionalSamAccountName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.35 NAME 'msDFSR-OnDemandExclusionFileFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.577 NAME 'meetingOriginator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.169 NAME 'showInAdvancedViewOnly' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.582 NAME 'meetingAdvertiseScope' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.48 NAME 'buildingName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2181 NAME 'msImaging-HashAlgorithm' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2101 NAME 'msDS-ClaimSharesPossibleValuesWith' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.24 NAME 'contentIndexingAllowed' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.39 NAME 'msDFSR-CommonStagingSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2135 NAME 'msDNS-RFC5011KeyRollovers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.682 NAME 'friendlyNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2071 NAME 'msTSEndpointType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2263 NAME 'msDS-RegisteredUsers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2062 NAME 'msDS-OptionalFeatureGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.767 NAME 'aCSMaxPeakBandwidth' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.919 NAME 'mSMQQuota' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.327 NAME 'packageFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.382 NAME 'dnsRecord' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.755 NAME 'domainIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.872 NAME 'fRSControlInboundBacklog' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.928 NAME 'mSMQOutRoutingServers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.768 NAME 'aCSEnableRSVPMessageLogging' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.585 NAME 'meetingIsEncrypted' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.34 NAME 'rangeLower' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1361 NAME 'mS-DS-ConsistencyChildCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2192 NAME 'msDS-EgressClaimsTransformationPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2292 NAME 'msDS-ComputerAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.843 NAME 'lDAPAdminLimits' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1847 NAME 'msDS-TombstoneQuotaFactor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1355 NAME 'queryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.16 NAME 'postalAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.307 NAME 'options' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.74 NAME 'dSASignature' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.380 NAME 'dnsSecureSecondaries' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.634 NAME 'privilegeDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.598 NAME 'dmdName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1399 NAME 'mS-SQL-LastDiagnosticDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2280 NAME 'msDS-ComputerAllowedToAuthenticateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.350 NAME 'addressType' SYNTAX '1.2.840.113556.1.4.905' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.38 NAME 'msDFSR-CommonStagingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.672 NAME 'categories' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1675 NAME 'msPKI-RA-Application-Policies' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1244 NAME 'addressBookRoots' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.336 NAME 'volTableGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.65 NAME 'logonWorkstation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2153 NAME 'msAuthz-ResourceCondition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.34 NAME 'msDFSR-DefaultCompressionExclusionFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.756 NAME 'aCSTimeOfDay' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2276 NAME 'msDS-SyncServerUrl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.710 NAME 'superScopes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.44' )", + "( 1.2.840.113556.1.2.210 NAME 'proxyAddresses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.348 NAME 'msSFU30NetgroupHostAtDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1306 NAME 'dNSProperty' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.141 NAME 'department' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.871 NAME 'fRSControlDataCreation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.253 NAME 'cOMOtherProgId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1337 NAME 'mSMQUserSid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.37 NAME 'cACertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.698 NAME 'dhcpUniqueKey' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1980 NAME 'msTSRemoteControl' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.9 NAME 'host' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2081 NAME 'msSPP-CSVLKSkuId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.483 NAME 'fRSFileFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2168 NAME 'msDS-IsPrimaryComputerFor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.74 NAME 'maxPwdAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1374 NAME 'mS-SQL-NamedPipe' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1972 NAME 'msDS-FailedInteractiveLogonCount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1649 NAME 'msWMI-TargetType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.668 NAME 'domainCAs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2021 NAME 'msDS-PSOApplied' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.25 NAME 'countryCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.160 NAME 'lmPwdHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.275 NAME 'printKeepPrintedJobs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2014 NAME 'msDS-PasswordHistoryLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1836 NAME 'msDS-hasMasterNCs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1813 NAME 'msDS-OperationsForAzRoleBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.212 NAME 'dSHeuristics' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.877 NAME 'fRSPartnerAuthLevel' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.13 NAME 'displayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.269 NAME 'linkTrackSecret' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1239 NAME 'mSMQDependentClientService' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.238 NAME 'printMaxResolutionSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.325 NAME 'perMsgDialogDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.819 NAME 'bridgeheadTransportList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.540 NAME 'initialAuthOutgoing' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.523 NAME 'proxyGenerationEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.760 NAME 'aCSAggregateTokenRatePerUser' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.381 NAME 'dnsNotifySecondaries' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.117 NAME 'rpcNsPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.6.18.1.300 NAME 'msSFU30SearchContainer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.960 NAME 'mSMQNt4Stub' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.4.844 NAME 'lDAPIPDenyList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.918 NAME 'mSMQJournal' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.343 NAME 'msSFU30MaxUidNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1442 NAME 'msDS-Cached-Membership-Time-Stamp' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1458 NAME 'msDS-Auxiliary-Classes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.821 NAME 'siteList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1782 NAME 'msDS-KeyVersionNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 2.5.4.50 NAME 'uniqueMember' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1797 NAME 'msDS-AzScriptTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1812 NAME 'msDS-OperationsForAzRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.809 NAME 'remoteStorageGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.231 NAME 'priority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.37 NAME 'msDFSR-Options2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2083 NAME 'msSPP-InstallationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.58 NAME 'attributeCertificateAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.18.1.302 NAME 'msSFU30FieldSeparator' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.532 NAME 'superiorDNSRoot' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.822 NAME 'siteLinkList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1366 NAME 'mS-SQL-Location' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.94 NAME 'ntPwdHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1 NAME 'name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1629 NAME 'msWMI-IntMax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.118 NAME 'rpcNsProfileEntry' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2049 NAME 'msDS-BridgeHeadServersUsed' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1969 NAME 'samDomainUpdates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.889 NAME 'additionalTrustedServiceNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.77 NAME 'maxTicketAge' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1661 NAME 'msDS-NC-Replica-Locations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1783 NAME 'msDS-ExecuteScriptPassword' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.49 NAME 'mAPIID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.9 NAME 'msDFSR-Enabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.250 NAME 'cOMUniqueLIBID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.18 NAME 'postOfficeBox' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2067 NAME 'msDS-LastKnownRDN' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1344 NAME 'dSUIAdminMaximum' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1153 NAME 'msRADIUSFramedIPAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1799 NAME 'msDS-AzScopeName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2013 NAME 'msDS-MinimumPasswordLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.114 NAME 'rpcNsGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.146 NAME 'objectSid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.6 NAME 'msDFSR-StagingSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.365 NAME 'operatingSystemServicePack' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.21.6 NAME 'objectClasses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1698 NAME 'msTAPI-uid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.256 NAME 'streetAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1191 NAME 'msRASSavedFramedRoute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1965 NAME 'msFVE-RecoveryGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2166 NAME 'msDS-GenerationId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1359 NAME 'otherWellKnownObjects' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1940 NAME 'msDS-RevealedList' SYNTAX '1.2.840.113556.1.4.904' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2282 NAME 'msDS-ServiceAllowedToAuthenticateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.379 NAME 'dnsAllowXFR' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.628 NAME 'ipsecNegotiationPolicyReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1976 NAME 'msTSProfilePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2076 NAME 'msPKI-Enrollment-Servers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.53 NAME 'deltaRevocationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.18 NAME 'otherTelephone' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2077 NAME 'msPKI-Site-Name' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1316 NAME 'aCSMinimumLatency' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2157 NAME 'msDS-ClaimSource' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1970 NAME 'msDS-LastSuccessfulInteractiveLogonTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.280 NAME 'printMinYExtent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.415 NAME 'operatingSystemHotfix' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.306 NAME 'msSFU30MapFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.610 NAME 'classDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1381 NAME 'mS-SQL-LastUpdatedDate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1957 NAME 'msDS-AuthenticatedToAccountlist' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1825 NAME 'msDS-AzMinorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2198 NAME 'msDS-ManagedPasswordPreviousId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2068 NAME 'msDS-DeletedObjectLifetime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2095 NAME 'msDS-IsUsedAsResourceSecurityAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.786 NAME 'mailAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.373 NAME 'rIDUsedPool' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.19 NAME 'msDFSR-RdcEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.44 NAME 'homeDirectory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.538 NAME 'prefixMap' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2034 NAME 'msDFS-LastModifiedv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2155 NAME 'msAuthz-MemberRulesInCentralAccessPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.947 NAME 'mSMQSignCertificates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.714 NAME 'dhcpOptions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2060 NAME 'msDS-LocalEffectiveRecycleTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.675 NAME 'catalogs' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.134 NAME 'trustPosixOffset' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1404 NAME 'mS-SQL-AllowImmediateUpdatingSubscription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2047 NAME 'globalAddressList2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.135 NAME 'cost' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1331 NAME 'pKIExpirationPeriod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.5.4.15 NAME 'businessCategory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.13.3.4 NAME 'msDFSR-RootSizeInMb' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.869 NAME 'frsComputerReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1893 NAME 'msPKIDPAPIMasterKeys' SYNTAX '1.2.840.113556.1.4.903' )", + "( 1.2.840.113556.1.4.1430 NAME 'msPKI-Enrollment-Flag' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.45 NAME 'homeDrive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2085 NAME 'msSPP-OnlineLicense' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.196 NAME 'systemMayContain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.90 NAME 'unicodePwd' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.763 NAME 'aCSTotalNoOfFlows' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1806 NAME 'msDS-MembersForAzRole' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.873 NAME 'fRSControlOutboundBacklog' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.89 NAME 'nTGroupMembers' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.815 NAME 'canUpgradeScript' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.96 NAME 'pwdLastSet' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.228 NAME 'portName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1821 NAME 'msieee80211-Data' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.720 NAME 'dhcpUpdateTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 2.5.4.33 NAME 'roleOccupant' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1818 NAME 'msDS-AzTaskIsRoleDefinition' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.488 NAME 'fRSStagingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.25 NAME 'dc' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.502 NAME 'timeVolChange' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.303 NAME 'notificationList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.952 NAME 'mSMQMigrated' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2290 NAME 'msDS-UserAuthNPolicyBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.53 NAME 'lastSetTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.894 NAME 'gPCFileSysPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.471 NAME 'schemaVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' )", + "( 1.2.840.113556.1.2.91 NAME 'repsFrom' SYNTAX 'OctetString' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.5 NAME 'msDFSR-StagingPath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.781 NAME 'lastKnownParent' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 2.5.4.43 NAME 'initials' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.901 NAME 'aCSMaxNoOfAccountFiles' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1928 NAME 'msDS-RevealOnDemandGroup' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1689 NAME 'msDS-Non-Security-Group-Extra-Classes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.344 NAME 'groupsToIgnore' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.896 NAME 'uSNSource' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.964 NAME 'mSMQNt4Flags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2102 NAME 'msDS-ClaimSharesPossibleValuesWithBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 2.5.4.29 NAME 'presentationAddress' SYNTAX '1.3.6.1.4.1.1466.115.121.1.43' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2051 NAME 'msDS-OIDToGroupLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.369 NAME 'fSMORoleOwner' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1954 NAME 'ms-net-ieee-8023-GP-PolicyGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.648 NAME 'primaryTelexNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2283 NAME 'msDS-ServiceAllowedToAuthenticateFrom' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.12 NAME 'title' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.1 NAME 'uid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1247 NAME 'interSiteTopologyRenew' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1697 NAME 'msDS-Settings' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.247 NAME 'printAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2188 NAME 'msDS-ValueTypeReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2133 NAME 'msDNS-MaintainTrustAnchor' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.324 NAME 'msSFU30KeyValues' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.1378 NAME 'mS-SQL-AppleTalk' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1663 NAME 'msDS-Replication-Notify-First-DSA-Delay' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.121 NAME 'securityIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.748 NAME 'attributeDisplayNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.16.840.1.113730.3.1.35 NAME 'thumbnailPhoto' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2082 NAME 'msSPP-KMSIds' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.758 NAME 'aCSMaxTokenRatePerFlow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.121 NAME 'uSNLastObjRem' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.875 NAME 'fRSMemberReference' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1349 NAME 'gPCUserExtensionNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.138 NAME 'userParameters' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.36 NAME 'userCertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.6.13.3.102 NAME 'msDFSR-MemberReferenceBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.131 NAME 'co' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.3 NAME 'cn' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.936 NAME 'mSMQEncryptKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.226 NAME 'adminDescription' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.34 NAME 'seeAlso' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.444 NAME 'msExchAssistantName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.667 NAME 'syncWithSID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1998 NAME 'msFVE-VolumeGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2107 NAME 'msTPM-SrkPubThumbprint' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.81 NAME 'info' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1686 NAME 'msWMI-ScopeGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.151 NAME 'oEMInformation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.935 NAME 'mSMQOSType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.374 NAME 'rIDNextRID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2039 NAME 'msDFS-LinkPathv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.141 NAME 'versionNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.505 NAME 'oMTGuid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.88 NAME 'nextRid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2037 NAME 'msDFS-Propertiesv2' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1994 NAME 'msTSLicenseVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.16.840.1.113730.3.140 NAME 'userSMIMECertificate' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1985 NAME 'msTSBrokenConnectionAction' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.281 NAME 'printStaplingSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.17 NAME 'msDFSR-Options' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.485 NAME 'fRSUpdateTimeout' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1967 NAME 'msDS-NC-RO-Replica-Locations' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1819 NAME 'msDS-AzApplicationData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.347 NAME 'msSFU30PosixMemberOf' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1425 NAME 'msCOM-UserLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.6.13.3.24 NAME 'msDFSR-DfsLinkTarget' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.512 NAME 'siteObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.584 NAME 'meetingRating' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1794 NAME 'msDS-NonMembersBL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.776 NAME 'aCSDSBMPriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.520 NAME 'machinePasswordChangeInterval' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.669 NAME 'rIDSetReferences' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.941 NAME 'mSMQLongLived' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1241 NAME 'netbootMirrorDataFile' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.305 NAME 'msSFU30ResultAttributes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2236 NAME 'msds-memberOfTransitive' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1427 NAME 'msCOM-DefaultPartitionLink' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.519 NAME 'lastBackupRestorationTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.337 NAME 'currMachineId' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.32 NAME 'attributeSyntax' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.362 NAME 'siteGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.823 NAME 'certificateTemplates' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.352 NAME 'msSFU30CryptMethod' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1946 NAME 'msDS-PhoneticDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2270 NAME 'msDS-IsManaged' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.581 NAME 'meetingScope' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.673 NAME 'retiredReplDSASignatures' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.855 NAME 'netbootNewMachineNamingPolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1245 NAME 'globalAddressList' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.2.227 NAME 'extensionName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.884 NAME 'msRRASAttribute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.6.18.1.349 NAME 'msSFU30NetgroupUserAtDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.26' )", + "( 1.2.840.113556.1.4.680 NAME 'queryPoint' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.888 NAME 'iPSECNegotiationPolicyAction' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.29 NAME 'msDFSR-CachePolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.299 NAME 'printMediaSupported' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.503 NAME 'timeRefresh' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.11 NAME 'authenticationOptions' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.198 NAME 'systemAuxiliaryClass' SYNTAX '1.3.6.1.4.1.1466.115.121.1.38' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.857 NAME 'netbootIntelliMirrorOSes' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1406 NAME 'mS-SQL-AllowSnapshotFilesFTPDownloading' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1333 NAME 'pKIExtendedKeyUsage' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.2019 NAME 'msDS-LockoutThreshold' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1844 NAME 'msDS-QuotaTrustee' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.18.1.350 NAME 'msSFU30IsValidContainer' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.359 NAME 'netbootGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1719 NAME 'msDS-DnsRootAlias' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.909 NAME 'extendedAttributeInfo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' NO-USER-MODIFICATION )", + "( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1248 NAME 'interSiteTopologyFailover' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2275 NAME 'msDS-CloudIsEnabled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.7' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.887 NAME 'iPSECNegotiationPolicyType' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2059 NAME 'msDS-LocalEffectiveDeletionTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.24' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.587 NAME 'meetingStartTime' SYNTAX '1.3.6.1.4.1.1466.115.121.1.53' )", + "( 2.5.4.17 NAME 'postalCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.2.445 NAME 'originalDisplayTable' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1990 NAME 'msTSInitialProgram' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.662 NAME 'lockoutTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.95 NAME 'pwdHistoryLength' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.759 NAME 'aCSMaxPeakBandwidthPerFlow' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.753 NAME 'nameServiceFlags' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.694 NAME 'previousParentCA' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.142 NAME 'winsockAddresses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.2075 NAME 'msTSSecondaryDesktops' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.2105 NAME 'msSPP-CSVLKPid' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.49 NAME 'badPasswordTime' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2184 NAME 'msDS-GeoCoordinatesLatitude' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2079 NAME 'msDS-RequiredForestBehaviorVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1955 NAME 'ms-net-ieee-8023-GP-PolicyData' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.237 NAME 'printBinNames' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1382 NAME 'mS-SQL-InformationURL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.6.13.3.13 NAME 'msDFSR-DirectoryFilter' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.148 NAME 'schemaIDGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.2189 NAME 'msDS-TransformationRules' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 2.5.4.10 NAME 'o' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.504 NAME 'seqNotification' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 2.5.4.7 NAME 'l' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.57 NAME 'defaultLocalPolicyObject' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1801 NAME 'msDS-AzBizRule' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.948 NAME 'mSMQDigests' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.2.327 NAME 'helpFileName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.421 NAME 'domainWidePolicy' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 2.5.4.6 NAME 'c' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2139 NAME 'msDNS-DNSKEYRecordSetTTL' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.609 NAME 'sIDHistory' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1711 NAME 'msDS-SDReferenceDomain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1367 NAME 'mS-SQL-Memory' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.715 NAME 'dhcpClasses' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1305 NAME 'moveTreeState' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.757 NAME 'aCSDirection' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.631 NAME 'printPagesPerMinute' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.145 NAME 'revision' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.646 NAME 'otherFacsimileTelephoneNumber' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )", + "( 1.2.840.113556.1.4.1798 NAME 'msDS-AzApplicationName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.366 NAME 'rpcNsAnnotation' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2190 NAME 'msDS-TransformationRulesCompiled' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.4.1636 NAME 'msWMI-StringDefault' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.813 NAME 'upgradeProductCode' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' )", + "( 1.2.840.113556.1.4.1951 NAME 'ms-net-ieee-80211-GP-PolicyGUID' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2098 NAME 'msDS-ClaimValueType' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.194 NAME 'adminDisplayName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.879 NAME 'fRSServiceCommandStatus' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.361 NAME 'netbootMachineFilePath' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.67 NAME 'lSAModifiedCount' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.920 NAME 'mSMQBasePriority' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2277 NAME 'msDS-UserAllowedToAuthenticateTo' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2056 NAME 'msDS-HostServiceAccount' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' )", + "( 1.2.840.113556.1.4.1943 NAME 'msDS-PhoneticLastName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.2055 NAME 'msDS-USNLastSyncSuccess' SYNTAX '1.2.840.113556.1.4.906' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.101 NAME 'privateKey' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 2.5.4.42 NAME 'givenName' SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.685 NAME 'parentCACertificateChain' SYNTAX '1.3.6.1.4.1.1466.115.121.1.40' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.1924 NAME 'msDS-RevealedUsers' SYNTAX '1.2.840.113556.1.4.903' NO-USER-MODIFICATION )", + "( 1.2.840.113556.1.2.76 NAME 'objectVersion' SYNTAX '1.3.6.1.4.1.1466.115.121.1.27' SINGLE-VALUE )", + "( 1.2.840.113556.1.4.856 NAME 'netbootNewMachineOU' SYNTAX '1.3.6.1.4.1.1466.115.121.1.12' SINGLE-VALUE )" + ], + "cn": [ + "Aggregate" + ], + "dITContentRules": [ + "( 1.2.840.113556.1.6.13.4.6 NAME 'msDFSR-Content' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.14 NAME 'device' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (uid $ manager $ ipHostNumber $ macAddress $ bootParameter $ bootFile ))", + "( 1.2.840.113556.1.5.205 NAME 'msWMI-IntRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.5 NAME 'samServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.196 NAME 'msPKI-Enterprise-Oid' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.53 NAME 'crossRefContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.5 NAME 'organizationalUnit' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.152 NAME 'intellimirrorGroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.253 NAME 'msFVE-RecoveryInformation' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.262 NAME 'msImaging-PSPs' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.251 NAME 'ms-net-ieee-80211-GroupPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.138 NAME 'aCSSubnet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.43 NAME 'fTDfs' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.27 NAME 'rpcEntry')", + "( 1.2.840.113556.1.5.85 NAME 'dnsZone' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2163 NAME 'msAuthz-CentralAccessRule' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.194 NAME 'msCOM-PartitionSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.242 NAME 'msDS-QuotaContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.281 NAME 'msDS-ClaimsTransformationPolicies' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.146 NAME 'remoteStorageServicePoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.2 NAME 'samDomainBase')", + "( 1.2.840.113556.1.5.132 NAME 'dHCPClass' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.283 NAME 'msDS-CloudExtensions')", + "( 1.2.840.113556.1.5.89 NAME 'nTFRSSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.24 NAME 'remoteMailRecipient' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (cn ) MAY (telephoneNumber $ userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ showInAddressBook $ userCert $ legacyExchangeDN $ msDS-PhoneticDisplayName $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI ))", + "( 1.2.840.113556.1.5.221 NAME 'msTAPI-RtConference' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.201 NAME 'msWMI-SimplePolicyTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.212 NAME 'msSFU30NetId' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.49 NAME 'packageRegistration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.139 NAME 'lostAndFound' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.14 NAME 'connectionPoint')", + "( 1.2.840.113556.1.5.6 NAME 'securityPrincipal')", + "( 1.2.840.113556.1.5.147 NAME 'siteLink' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.255 NAME 'msDS-PasswordSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2162 NAME 'msAuthz-CentralAccessRules' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.30 NAME 'serviceInstance' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.156 NAME 'rRASAdministrationDictionary' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2164 NAME 'msAuthz-CentralAccessPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ))", + "( 1.2.840.113556.1.5.52 NAME 'fileLinkTracking' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.18 NAME 'domainPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.216 NAME 'msSFU30NetworkUser' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject')", + "( 1.2.840.113556.1.5.177 NAME 'pKICertificateTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.293 NAME 'msDS-AuthNPolicies' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.2 NAME 'msDFSR-Subscriber' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.31 NAME 'site' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.222 NAME 'msTAPI-RtPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.68 NAME 'applicationSiteSettings')", + "( 1.2.840.113556.1.3.14 NAME 'attributeSchema' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.267 NAME 'msSPP-ActivationObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.220 NAME 'msDS-App-Configuration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.23 NAME 'container' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.10 NAME 'msDFSR-Connection' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.207 NAME 'msWMI-UintRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.23 NAME 'printQueue' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.260 NAME 'msDFS-DeletedLinkv2' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.140 NAME 'interSiteTransportContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.130 NAME 'indexServerCatalog' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.98 NAME 'ipsecPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.0 NAME 'top')", + "( 1.2.840.113556.1.5.36 NAME 'volume' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.236 NAME 'msDS-AzOperation' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.9 NAME 'groupOfNames' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.12 NAME 'configuration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.78 NAME 'licensingSiteSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.69 NAME 'nTDSSiteSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.269 NAME 'msDS-ClaimTypePropertyBase')", + "( 1.2.840.113556.1.5.273 NAME 'msDS-ResourceProperty' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.239 NAME 'msDS-AzRole' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice')", + "( 1.2.840.113556.1.5.294 NAME 'msDS-AuthNPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.86 NAME 'dnsNode' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.210 NAME 'msWMI-StringSetParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.264 NAME 'msDS-ManagedServiceAccount' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipHostNumber ))", + "( 1.2.840.113556.1.5.15 NAME 'contact' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ showInAddressBook $ userCert $ legacyExchangeDN $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI ))", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount')", + "( 1.2.840.113556.1.5.266 NAME 'msSPP-ActivationObjectsContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.217 NAME 'msWMI-ObjectEncoding' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.33 NAME 'storage' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.67 NAME 'domainDNS' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (cACertificate $ builtinCreationTime $ builtinModifiedCount $ creationTime $ domainPolicyObject $ forceLogoff $ defaultLocalPolicyObject $ lockoutDuration $ lockOutObservationWindow $ lSACreationTime $ lSAModifiedCount $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nETBIOSName $ nextRid $ pwdProperties $ pwdHistoryLength $ privateKey $ replicaSource $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount $ controlAccessRights $ auditingPolicy $ eFSPolicy $ desktopProfile $ nTMixedDomain $ rIDManagerReference $ treeName $ pekList $ pekKeyChangeInterval $ gPLink $ gPOptions $ ms-DS-MachineAccountQuota $ msDS-LogonTimeSyncInterval $ msDS-PerUserTrustQuota $ msDS-AllUsersTrustQuota $ msDS-PerUserTrustTombstonesQuota ))", + "( 1.2.840.113556.1.5.92 NAME 'linkTrackVolEntry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device')", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject')", + "( 1.2.840.113556.1.5.235 NAME 'msDS-AzApplication' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.107 NAME 'sitesContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.263 NAME 'msImaging-PostScanProcess' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.240 NAME 'msieee80211-Policy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.95 NAME 'subnetContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.6 NAME 'document' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.6 NAME 'person' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.274 NAME 'msDS-ResourcePropertyList' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.270 NAME 'msDS-ClaimTypes' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount')", + "( 1.2.840.113556.1.5.179 NAME 'mSMQMigratedUser' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.185 NAME 'mS-SQL-OLAPServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject')", + "( 1.2.840.113556.1.5.155 NAME 'nTFRSSubscriber' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.129 NAME 'rIDSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.58 NAME 'addressTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.154 NAME 'nTFRSSubscriptions' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.47 NAME 'nTDSDSA' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.175 NAME 'infrastructureUpdate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.215 NAME 'msSFU30DomainInfo' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.213 NAME 'msWMI-Som' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.82 NAME 'rpcProfile' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.164 NAME 'mSMQSiteLink' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.184 NAME 'mS-SQL-SQLServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.106 NAME 'queryPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.162 NAME 'mSMQConfiguration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.257 NAME 'msDFS-NamespaceAnchor' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.7 NAME 'msDFSR-ContentSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.276 NAME 'msTPM-InformationObjectsContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.209 NAME 'msWMI-RealRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.7 NAME 'organizationalPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.176 NAME 'msExchConfigurationContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.278 NAME 'msKds-ProvRootKey' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.238 NAME 'msDS-AzTask' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.282 NAME 'msDS-GroupManagedServiceAccount' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipHostNumber ))", + "( 1.3.6.1.1.1.2.9 NAME 'nisMap' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.277 NAME 'msKds-ProvServerConfiguration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.217 NAME 'msSFU30NISMapConfig' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.48 NAME 'serversContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.90 NAME 'linkTrackVolumeTable' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.188 NAME 'mS-SQL-SQLDatabase' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.211 NAME 'msWMI-PolicyType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.183 NAME 'dSUISettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.157 NAME 'groupPolicyContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.3 NAME 'samDomain' MAY (forceLogoff $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount ))", + "( 1.2.840.113556.1.5.234 NAME 'msDS-AzAdminManager' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.214 NAME 'msWMI-Rule' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.254 NAME 'nTDSDSARO' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.286 NAME 'msDS-Device' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.34 NAME 'trustedDomain' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.7 NAME 'room' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.4 NAME 'organization' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.272 NAME 'msDS-ClaimType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.80 NAME 'rpcGroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.17 NAME 'server' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.28 NAME 'secret' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.163 NAME 'mSMQEnterpriseSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.202 NAME 'msWMI-MergeablePolicyTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.195 NAME 'msPKI-Key-Recovery-Agent' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ))", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.258 NAME 'msDFS-Namespacev2' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.96 NAME 'subnet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.216 NAME 'applicationVersion' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.10 NAME 'residentialPerson' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.19 NAME 'cRLDistributionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.137 NAME 'aCSPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.77 NAME 'controlAccessRight' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.219 NAME 'msMQ-Group' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.8 NAME 'group' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (cn $ objectSid $ sAMAccountName ) MAY (telephoneNumber $ userPassword $ userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-PhoneticDisplayName $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI $ gidNumber $ memberUid ))", + "( 1.2.840.113556.1.6.23.2 NAME 'msPrint-ConnectionPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.11 NAME 'crossRef' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.9 NAME 'msDFSR-Member' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.59 NAME 'displayTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.13 NAME 'classSchema' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.200 NAME 'msWMI-PolicyTemplate' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.165 NAME 'mSMQSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.126 NAME 'serviceConnectionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.4 NAME 'builtinDomain' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MAY (creationTime $ forceLogoff $ lockoutDuration $ lockOutObservationWindow $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nextRid $ pwdProperties $ pwdHistoryLength $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount ))", + "( 1.2.840.113556.1.5.241 NAME 'msDS-AppData' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.73 NAME 'rpcServerElement' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.150 NAME 'rRASAdministrationConnectionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.191 NAME 'aCSResourceLimits' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.3 NAME 'locality' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost')", + "( 1.2.840.113556.1.5.275 NAME 'msTPM-InformationObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.289 NAME 'msDS-DeviceContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2129 NAME 'msDNS-ServerSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.76 NAME 'foreignSecurityPrincipal' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.44 NAME 'classStore' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.5 NAME 'account' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.26 NAME 'rpcProfileElement' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.215 NAME 'msWMI-WMIGPO' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.243 NAME 'msDS-QuotaControl' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.256 NAME 'msDS-PasswordSettingsContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.187 NAME 'mS-SQL-SQLPublication' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.9 NAME 'user' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ))", + "( 1.2.840.113556.1.5.259 NAME 'msDFS-Linkv2' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.141 NAME 'interSiteTransport' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.4 NAME 'msDFSR-GlobalSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.29 NAME 'serviceClass' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.189 NAME 'mS-SQL-OLAPDatabase' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.16 NAME 'certificationAuthority' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.104 NAME 'meeting' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.287 NAME 'msDS-DeviceRegistrationServiceContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.71 NAME 'nTDSConnection' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.291 NAME 'msDS-AuthNPolicySilos' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.218 NAME 'msMQ-Custom-Recipient' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.72 NAME 'nTDSService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.9 NAME 'dMD' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.280 NAME 'msDS-ClaimsTransformationPolicyType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.14 NAME 'rFC822LocalPart' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.190 NAME 'mS-SQL-OLAPCube' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.208 NAME 'msWMI-UintSetParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup')", + "( 2.5.6.17 NAME 'groupOfUniqueNames' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.252 NAME 'ms-net-ieee-8023-GroupPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.119 NAME 'ipsecNegotiationPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.292 NAME 'msDS-AuthNPolicySilo' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.121 NAME 'ipsecNFA' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.42 NAME 'dfsConfiguration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.271 NAME 'msDS-ResourceProperties' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.91 NAME 'linkTrackObjectMoveTable' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.136 NAME 'rpcContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.83 NAME 'rIDManager' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.206 NAME 'msWMI-IntSetParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.5 NAME 'msDFSR-ReplicationGroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.125 NAME 'addressBookContainer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.49 NAME 'applicationSettings')", + "( 1.2.840.113556.1.5.265 NAME 'msDS-OptionalFeature' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.94 NAME 'serviceAdministrationPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.102 NAME 'nTFRSReplicaSet' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.203 NAME 'msWMI-RangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.7000.56 NAME 'ipsecBase')", + "( 1.2.840.113556.1.6.13.4.3 NAME 'msDFSR-Subscription' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.223 NAME 'msPKI-PrivateKeyRecoveryAgent' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.178 NAME 'pKIEnrollmentService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.18.2.211 NAME 'msSFU30MailAliases' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.53 NAME 'typeLibrary' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.8 NAME 'msDFSR-Topology' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.237 NAME 'msDS-AzScope' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.74 NAME 'categoryRegistration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.11 NAME 'comConnectionPoint' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.93 NAME 'linkTrackOMTEntry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.10 NAME 'classRegistration' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.148 NAME 'siteLinkBridge' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.81 NAME 'rpcServer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.46 NAME 'mailRecipient')", + "( 1.2.840.113556.1.5.1 NAME 'securityObject')", + "( 1.2.840.113556.1.5.20 NAME 'leaf')", + "( 1.2.840.113556.1.5.151 NAME 'intellimirrorSCP' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.6.13.4.1 NAME 'msDFSR-LocalSettings' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.186 NAME 'mS-SQL-SQLRepository' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.8 NAME 'organizationalRole' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.20.1 NAME 'subSchema' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.284 NAME 'msDS-DeviceRegistrationService' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.84 NAME 'displaySpecifier' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.212 NAME 'msWMI-ShadowObject' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.59 NAME 'fileLinkTrackingEntry' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.4.2161 NAME 'msAuthz-CentralAccessPolicies' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.161 NAME 'mSMQQueue' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.193 NAME 'msCOM-Partition' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.118 NAME 'ipsecFilter' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.2 NAME 'country' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.97 NAME 'physicalLocation' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.3.30 NAME 'computer' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ) MUST (objectSid $ sAMAccountName ) MAY (info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ showInAddressBook $ userCert $ legacyExchangeDN $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber $ unixUserPassword $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 $ textEncodedORAddress $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipHostNumber ))", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.153 NAME 'nTFRSMember' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.12 NAME 'applicationEntity' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 2.5.6.11 NAME 'applicationProcess' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.279 NAME 'msDS-ValueType' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.204 NAME 'msWMI-UnknownRangeParam' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.66 NAME 'domain')", + "( 2.5.6.13 NAME 'dSA' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))", + "( 1.2.840.113556.1.5.120 NAME 'ipsecISAKMPPolicy' AUX ( mailRecipient $ posixGroup $ ipHost $ samDomain $ dynamicObject $ shadowAccount $ domainRelatedObject $ ieee802Device $ posixAccount $ bootableDevice $ simpleSecurityObject $ securityPrincipal $ msDS-CloudExtensions $ samDomainBase ))" + ], + "dSCorePropagationData": [ + "16010101000000.0Z" + ], + "distinguishedName": [ + "CN=Aggregate,CN=Schema,CN=Configuration,DC=FOREST,DC=LAB" + ], + "instanceType": [ + "4" + ], + "modifyTimeStamp": [ + "20141006121949.0Z" + ], + "name": [ + "Aggregate" + ], + "objectCategory": [ + "CN=SubSchema,CN=Schema,CN=Configuration,DC=FOREST,DC=LAB" + ], + "objectClass": [ + "top", + "subSchema" + ], + "objectClasses": [ + "( 1.2.840.113556.1.6.13.4.6 NAME 'msDFSR-Content' SUP top STRUCTURAL MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 2.5.6.14 NAME 'device' SUP top STRUCTURAL MUST (cn ) MAY (serialNumber $ l $ o $ ou $ owner $ seeAlso $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.205 NAME 'msWMI-IntRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntMax $ msWMI-IntMin ) )", + "( 1.2.840.113556.1.5.5 NAME 'samServer' SUP securityObject STRUCTURAL MAY (samDomainUpdates ) )", + "( 1.2.840.113556.1.5.196 NAME 'msPKI-Enterprise-Oid' SUP top STRUCTURAL MAY (msPKI-Cert-Template-OID $ msPKI-OID-Attribute $ msPKI-OID-CPS $ msPKI-OID-User-Notice $ msPKI-OIDLocalizedName $ msDS-OIDToGroupLink ) )", + "( 1.2.840.113556.1.5.7000.53 NAME 'crossRefContainer' SUP top STRUCTURAL MAY (uPNSuffixes $ msDS-Behavior-Version $ msDS-SPNSuffixes $ msDS-UpdateScript $ msDS-ExecuteScriptPassword $ msDS-EnabledFeature ) )", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' SUP top STRUCTURAL MUST (cn $ ipNetworkNumber ) MAY (l $ description $ uid $ manager $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ ipNetmaskNumber $ nisMapName ) )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP top STRUCTURAL MUST (ou ) MAY (c $ l $ st $ street $ searchGuide $ businessCategory $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ seeAlso $ userPassword $ co $ countryCode $ desktopProfile $ defaultGroup $ managedBy $ uPNSuffixes $ gPLink $ gPOptions $ msCOM-UserPartitionSetLink $ thumbnailLogo ) )", + "( 1.2.840.113556.1.5.152 NAME 'intellimirrorGroup' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.253 NAME 'msFVE-RecoveryInformation' SUP top STRUCTURAL MUST (msFVE-RecoveryPassword $ msFVE-RecoveryGuid ) MAY (msFVE-VolumeGuid $ msFVE-KeyPackage ) )", + "( 1.2.840.113556.1.5.262 NAME 'msImaging-PSPs' SUP container STRUCTURAL )", + "( 1.2.840.113556.1.5.251 NAME 'ms-net-ieee-80211-GroupPolicy' SUP top STRUCTURAL MAY (ms-net-ieee-80211-GP-PolicyGUID $ ms-net-ieee-80211-GP-PolicyData $ ms-net-ieee-80211-GP-PolicyReserved ) )", + "( 1.2.840.113556.1.5.138 NAME 'aCSSubnet' SUP top STRUCTURAL MAY (aCSMaxTokenRatePerFlow $ aCSMaxPeakBandwidthPerFlow $ aCSMaxDurationPerFlow $ aCSAllocableRSVPBandwidth $ aCSMaxPeakBandwidth $ aCSEnableRSVPMessageLogging $ aCSEventLogLevel $ aCSEnableACSService $ aCSRSVPLogFilesLocation $ aCSMaxNoOfLogFiles $ aCSMaxSizeOfRSVPLogFile $ aCSDSBMPriority $ aCSDSBMRefresh $ aCSDSBMDeadTime $ aCSCacheTimeout $ aCSNonReservedTxLimit $ aCSNonReservedTxSize $ aCSEnableRSVPAccounting $ aCSRSVPAccountFilesLocation $ aCSMaxNoOfAccountFiles $ aCSMaxSizeOfRSVPAccountFile $ aCSServerList $ aCSNonReservedPeakRate $ aCSNonReservedTokenSize $ aCSNonReservedMaxSDUSize $ aCSNonReservedMinPolicedSize ) )", + "( 1.2.840.113556.1.5.43 NAME 'fTDfs' SUP top STRUCTURAL MUST (remoteServerName $ pKTGuid $ pKT ) MAY (keywords $ uNCName $ managedBy ) )", + "( 1.2.840.113556.1.5.27 NAME 'rpcEntry' SUP connectionPoint ABSTRACT )", + "( 1.2.840.113556.1.5.85 NAME 'dnsZone' SUP top STRUCTURAL MUST (dc ) MAY (dnsAllowDynamic $ dnsAllowXFR $ dnsSecureSecondaries $ dnsNotifySecondaries $ managedBy $ dNSProperty $ msDNS-IsSigned $ msDNS-SignWithNSEC3 $ msDNS-NSEC3OptOut $ msDNS-MaintainTrustAnchor $ msDNS-DSRecordAlgorithms $ msDNS-RFC5011KeyRollovers $ msDNS-NSEC3HashAlgorithm $ msDNS-NSEC3RandomSaltLength $ msDNS-NSEC3Iterations $ msDNS-DNSKEYRecordSetTTL $ msDNS-DSRecordSetTTL $ msDNS-SignatureInceptionOffset $ msDNS-SecureDelegationPollingPeriod $ msDNS-SigningKeyDescriptors $ msDNS-SigningKeys $ msDNS-DNSKEYRecords $ msDNS-ParentHasSecureDelegation $ msDNS-PropagationTime $ msDNS-NSEC3UserSalt $ msDNS-NSEC3CurrentSalt ) )", + "( 1.2.840.113556.1.4.2163 NAME 'msAuthz-CentralAccessRule' SUP top STRUCTURAL MAY (Enabled $ msAuthz-EffectiveSecurityPolicy $ msAuthz-ProposedSecurityPolicy $ msAuthz-LastEffectiveSecurityPolicy $ msAuthz-ResourceCondition $ msAuthz-MemberRulesInCentralAccessPolicyBL ) )", + "( 1.2.840.113556.1.5.194 NAME 'msCOM-PartitionSet' SUP top STRUCTURAL MAY (msCOM-PartitionLink $ msCOM-DefaultPartitionLink $ msCOM-ObjectId ) )", + "( 1.2.840.113556.1.5.242 NAME 'msDS-QuotaContainer' SUP top STRUCTURAL MUST (cn ) MAY (msDS-DefaultQuota $ msDS-TombstoneQuotaFactor $ msDS-QuotaEffective $ msDS-QuotaUsed $ msDS-TopQuotaUsage ) )", + "( 1.2.840.113556.1.5.281 NAME 'msDS-ClaimsTransformationPolicies' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.146 NAME 'remoteStorageServicePoint' SUP serviceAdministrationPoint STRUCTURAL MAY (remoteStorageGUID ) )", + "( 1.2.840.113556.1.5.2 NAME 'samDomainBase' SUP top AUXILIARY MAY (nTSecurityDescriptor $ creationTime $ forceLogoff $ lockoutDuration $ lockOutObservationWindow $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nextRid $ pwdProperties $ pwdHistoryLength $ revision $ objectSid $ oEMInformation $ serverState $ uASCompat $ serverRole $ domainReplica $ modifiedCount ) )", + "( 1.2.840.113556.1.5.132 NAME 'dHCPClass' SUP top STRUCTURAL MUST (dhcpUniqueKey $ dhcpType $ dhcpFlags $ dhcpIdentification ) MAY (networkAddress $ dhcpObjName $ dhcpObjDescription $ dhcpServers $ dhcpSubnets $ dhcpMask $ dhcpRanges $ dhcpSites $ dhcpReservations $ superScopes $ superScopeDescription $ optionDescription $ optionsLocation $ dhcpOptions $ dhcpClasses $ mscopeId $ dhcpState $ dhcpProperties $ dhcpMaxKey $ dhcpUpdateTime ) )", + "( 1.2.840.113556.1.5.283 NAME 'msDS-CloudExtensions' SUP top AUXILIARY MAY (msDS-cloudExtensionAttribute1 $ msDS-cloudExtensionAttribute2 $ msDS-cloudExtensionAttribute3 $ msDS-cloudExtensionAttribute4 $ msDS-cloudExtensionAttribute5 $ msDS-cloudExtensionAttribute6 $ msDS-cloudExtensionAttribute7 $ msDS-cloudExtensionAttribute8 $ msDS-cloudExtensionAttribute9 $ msDS-cloudExtensionAttribute10 $ msDS-cloudExtensionAttribute11 $ msDS-cloudExtensionAttribute12 $ msDS-cloudExtensionAttribute13 $ msDS-cloudExtensionAttribute14 $ msDS-cloudExtensionAttribute15 $ msDS-cloudExtensionAttribute16 $ msDS-cloudExtensionAttribute17 $ msDS-cloudExtensionAttribute18 $ msDS-cloudExtensionAttribute19 $ msDS-cloudExtensionAttribute20 ) )", + "( 1.2.840.113556.1.5.89 NAME 'nTFRSSettings' SUP applicationSettings STRUCTURAL MAY (fRSExtensions $ managedBy ) )", + "( 1.2.840.113556.1.5.24 NAME 'remoteMailRecipient' SUP top STRUCTURAL MAY (remoteSource $ remoteSourceType $ managedBy ) )", + "( 1.2.840.113556.1.5.221 NAME 'msTAPI-RtConference' SUP top STRUCTURAL MUST (msTAPI-uid ) MAY (msTAPI-ProtocolId $ msTAPI-ConferenceBlob ) )", + "( 1.2.840.113556.1.5.201 NAME 'msWMI-SimplePolicyTemplate' SUP msWMI-PolicyTemplate STRUCTURAL MUST (msWMI-TargetObject ) )", + "( 1.2.840.113556.1.6.18.2.212 NAME 'msSFU30NetId' SUP top STRUCTURAL MAY (msSFU30Name $ msSFU30KeyValues $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.49 NAME 'packageRegistration' SUP top STRUCTURAL MAY (msiScriptPath $ cOMClassID $ cOMInterfaceID $ cOMProgID $ localeID $ machineArchitecture $ iconPath $ cOMTypelibId $ vendor $ packageType $ setupCommand $ packageName $ packageFlags $ versionNumberHi $ versionNumberLo $ lastUpdateSequence $ managedBy $ msiFileList $ categories $ upgradeProductCode $ msiScript $ canUpgradeScript $ fileExtPriority $ productCode $ msiScriptName $ msiScriptSize $ installUiLevel ) )", + "( 1.2.840.113556.1.5.139 NAME 'lostAndFound' SUP top STRUCTURAL MAY (moveTreeState ) )", + "( 1.2.840.113556.1.5.14 NAME 'connectionPoint' SUP leaf ABSTRACT MUST (cn ) MAY (keywords $ managedBy $ msDS-Settings ) )", + "( 1.2.840.113556.1.5.6 NAME 'securityPrincipal' SUP top AUXILIARY MUST (objectSid $ sAMAccountName ) MAY (nTSecurityDescriptor $ securityIdentifier $ supplementalCredentials $ rid $ sAMAccountType $ sIDHistory $ altSecurityIdentities $ tokenGroups $ tokenGroupsNoGCAcceptable $ accountNameHistory $ tokenGroupsGlobalAndUniversal $ msDS-KeyVersionNumber ) )", + "( 1.2.840.113556.1.5.147 NAME 'siteLink' SUP top STRUCTURAL MUST (siteList ) MAY (cost $ schedule $ options $ replInterval ) )", + "( 1.2.840.113556.1.5.255 NAME 'msDS-PasswordSettings' SUP top STRUCTURAL MUST (msDS-MaximumPasswordAge $ msDS-MinimumPasswordAge $ msDS-MinimumPasswordLength $ msDS-PasswordHistoryLength $ msDS-PasswordComplexityEnabled $ msDS-PasswordReversibleEncryptionEnabled $ msDS-LockoutObservationWindow $ msDS-LockoutDuration $ msDS-LockoutThreshold $ msDS-PasswordSettingsPrecedence ) MAY (msDS-PSOAppliesTo ) )", + "( 1.2.840.113556.1.4.2162 NAME 'msAuthz-CentralAccessRules' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.30 NAME 'serviceInstance' SUP connectionPoint STRUCTURAL MUST (displayName $ serviceClassID ) MAY (winsockAddresses $ serviceInstanceVersion ) )", + "( 1.2.840.113556.1.5.156 NAME 'rRASAdministrationDictionary' SUP top STRUCTURAL MAY (msRRASVendorAttributeEntry ) )", + "( 1.2.840.113556.1.4.2164 NAME 'msAuthz-CentralAccessPolicy' SUP top STRUCTURAL MAY (msAuthz-CentralAccessPolicyID $ msAuthz-MemberRulesInCentralAccessPolicy ) )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP user STRUCTURAL MAY (o $ businessCategory $ userCertificate $ givenName $ initials $ x500uniqueIdentifier $ displayName $ employeeNumber $ employeeType $ homePostalAddress $ userSMIMECertificate $ uid $ mail $ roomNumber $ photo $ manager $ homePhone $ secretary $ mobile $ pager $ audio $ jpegPhoto $ carLicense $ departmentNumber $ preferredLanguage $ userPKCS12 $ labeledURI ) )", + "( 1.2.840.113556.1.5.52 NAME 'fileLinkTracking' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.18 NAME 'domainPolicy' SUP leaf STRUCTURAL MAY (authenticationOptions $ forceLogoff $ defaultLocalPolicyObject $ lockoutDuration $ lockOutObservationWindow $ lockoutThreshold $ maxPwdAge $ maxRenewAge $ maxTicketAge $ minPwdAge $ minPwdLength $ minTicketAge $ pwdProperties $ pwdHistoryLength $ proxyLifetime $ eFSPolicy $ publicKeyPolicy $ domainWidePolicy $ domainPolicyReference $ qualityOfService $ ipsecPolicyReference $ managedBy $ domainCAs ) )", + "( 1.2.840.113556.1.6.18.2.216 NAME 'msSFU30NetworkUser' SUP top STRUCTURAL MAY (msSFU30Name $ msSFU30KeyValues $ msSFU30NisDomain $ nisMapName ) )", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' SUP top AUXILIARY MAY (userPassword ) )", + "( 1.2.840.113556.1.5.177 NAME 'pKICertificateTemplate' SUP top STRUCTURAL MAY (displayName $ flags $ pKIDefaultKeySpec $ pKIKeyUsage $ pKIMaxIssuingDepth $ pKICriticalExtensions $ pKIExpirationPeriod $ pKIOverlapPeriod $ pKIExtendedKeyUsage $ pKIDefaultCSPs $ pKIEnrollmentAccess $ msPKI-RA-Signature $ msPKI-Enrollment-Flag $ msPKI-Private-Key-Flag $ msPKI-Certificate-Name-Flag $ msPKI-Minimal-Key-Size $ msPKI-Template-Schema-Version $ msPKI-Template-Minor-Revision $ msPKI-Cert-Template-OID $ msPKI-Supersede-Templates $ msPKI-RA-Policies $ msPKI-Certificate-Policy $ msPKI-Certificate-Application-Policy $ msPKI-RA-Application-Policies ) )", + "( 1.2.840.113556.1.5.293 NAME 'msDS-AuthNPolicies' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.6.13.4.2 NAME 'msDFSR-Subscriber' SUP top STRUCTURAL MUST (msDFSR-ReplicationGroupGuid $ msDFSR-MemberReference ) MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.31 NAME 'site' SUP top STRUCTURAL MAY (location $ notificationList $ managedBy $ gPLink $ gPOptions $ mSMQSiteID $ mSMQNt4Stub $ mSMQSiteForeign $ mSMQInterval1 $ mSMQInterval2 $ msDS-BridgeHeadServersUsed ) )", + "( 1.2.840.113556.1.5.222 NAME 'msTAPI-RtPerson' SUP top STRUCTURAL MAY (msTAPI-uid $ msTAPI-IpAddress ) )", + "( 1.2.840.113556.1.5.68 NAME 'applicationSiteSettings' SUP top ABSTRACT MAY (applicationName $ notificationList ) )", + "( 1.2.840.113556.1.3.14 NAME 'attributeSchema' SUP top STRUCTURAL MUST (cn $ attributeID $ attributeSyntax $ isSingleValued $ oMSyntax $ lDAPDisplayName $ schemaIDGUID ) MAY (rangeLower $ rangeUpper $ mAPIID $ linkID $ oMObjectClass $ searchFlags $ extendedCharsAllowed $ schemaFlagsEx $ attributeSecurityGUID $ systemOnly $ classDisplayName $ isMemberOfPartialAttributeSet $ isDefunct $ isEphemeral $ msDs-Schema-Extensions $ msDS-IntId ) )", + "( 1.2.840.113556.1.5.267 NAME 'msSPP-ActivationObject' SUP top STRUCTURAL MUST (msSPP-CSVLKSkuId $ msSPP-KMSIds $ msSPP-CSVLKPid $ msSPP-CSVLKPartialProductKey ) MAY (msSPP-InstallationId $ msSPP-ConfirmationId $ msSPP-OnlineLicense $ msSPP-PhoneLicense $ msSPP-ConfigLicense $ msSPP-IssuanceLicense ) )", + "( 1.2.840.113556.1.5.220 NAME 'msDS-App-Configuration' SUP applicationSettings STRUCTURAL MAY (owner $ keywords $ managedBy $ msDS-ByteArray $ msDS-DateTime $ msDS-Integer $ msDS-ObjectReference ) )", + "( 1.2.840.113556.1.3.23 NAME 'container' SUP top STRUCTURAL MUST (cn ) MAY (schemaVersion $ defaultClassStore $ msDS-ObjectReference ) )", + "( 1.2.840.113556.1.6.13.4.10 NAME 'msDFSR-Connection' SUP top STRUCTURAL MUST (fromServer ) MAY (msDFSR-Extension $ msDFSR-Enabled $ msDFSR-Schedule $ msDFSR-Keywords $ msDFSR-Flags $ msDFSR-Options $ msDFSR-RdcEnabled $ msDFSR-RdcMinFileSizeInKb $ msDFSR-Priority $ msDFSR-DisablePacketPrivacy $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.207 NAME 'msWMI-UintRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntMax $ msWMI-IntMin ) )", + "( 1.2.840.113556.1.5.23 NAME 'printQueue' SUP connectionPoint STRUCTURAL MUST (uNCName $ versionNumber $ serverName $ printerName $ shortServerName ) MAY (location $ portName $ driverName $ printSeparatorFile $ priority $ defaultPriority $ printStartTime $ printEndTime $ printFormName $ printBinNames $ printMaxResolutionSupported $ printOrientationsSupported $ printMaxCopies $ printCollate $ printColor $ printLanguage $ printAttributes $ printShareName $ printOwner $ printNotify $ printStatus $ printSpooling $ printKeepPrintedJobs $ driverVersion $ printMaxXExtent $ printMaxYExtent $ printMinXExtent $ printMinYExtent $ printStaplingSupported $ printMemory $ assetNumber $ bytesPerMinute $ printRate $ printRateUnit $ printNetworkAddress $ printMACAddress $ printMediaReady $ printNumberUp $ printMediaSupported $ operatingSystem $ operatingSystemVersion $ operatingSystemServicePack $ operatingSystemHotfix $ physicalLocationObject $ printPagesPerMinute $ printDuplexSupported ) )", + "( 1.2.840.113556.1.5.260 NAME 'msDFS-DeletedLinkv2' SUP top STRUCTURAL MUST (msDFS-NamespaceIdentityGUIDv2 $ msDFS-LastModifiedv2 $ msDFS-LinkPathv2 $ msDFS-LinkIdentityGUIDv2 ) MAY (msDFS-Commentv2 $ msDFS-ShortNameLinkPathv2 ) )", + "( 1.2.840.113556.1.5.140 NAME 'interSiteTransportContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.130 NAME 'indexServerCatalog' SUP connectionPoint STRUCTURAL MUST (creator ) MAY (uNCName $ queryPoint $ indexedScopes $ friendlyNames ) )", + "( 1.2.840.113556.1.5.98 NAME 'ipsecPolicy' SUP ipsecBase STRUCTURAL MAY (ipsecISAKMPReference $ ipsecNFAReference ) )", + "( 2.5.6.0 NAME 'top' ABSTRACT MUST (objectClass $ instanceType $ nTSecurityDescriptor $ objectCategory ) MAY (cn $ description $ distinguishedName $ whenCreated $ whenChanged $ subRefs $ displayName $ uSNCreated $ isDeleted $ dSASignature $ objectVersion $ repsTo $ repsFrom $ memberOf $ ownerBL $ uSNChanged $ uSNLastObjRem $ showInAdvancedViewOnly $ adminDisplayName $ proxyAddresses $ adminDescription $ extensionName $ uSNDSALastObjRemoved $ displayNamePrintable $ directReports $ wWWHomePage $ USNIntersite $ name $ objectGUID $ replPropertyMetaData $ replUpToDateVector $ flags $ revision $ wbemPath $ fSMORoleOwner $ systemFlags $ siteObjectBL $ serverReferenceBL $ nonSecurityMemberBL $ queryPolicyBL $ wellKnownObjects $ isPrivilegeHolder $ partialAttributeSet $ managedObjects $ partialAttributeDeletionList $ url $ lastKnownParent $ bridgeheadServerListBL $ netbootSCPBL $ isCriticalSystemObject $ frsComputerReferenceBL $ fRSMemberReferenceBL $ uSNSource $ fromEntry $ allowedChildClasses $ allowedChildClassesEffective $ allowedAttributes $ allowedAttributesEffective $ possibleInferiors $ canonicalName $ proxiedObjectName $ sDRightsEffective $ dSCorePropagationData $ otherWellKnownObjects $ mS-DS-ConsistencyGuid $ mS-DS-ConsistencyChildCount $ masteredBy $ msCOM-PartitionSetLink $ msCOM-UserLink $ msDS-Approx-Immed-Subordinates $ msDS-NCReplCursors $ msDS-NCReplInboundNeighbors $ msDS-NCReplOutboundNeighbors $ msDS-ReplAttributeMetaData $ msDS-ReplValueMetaData $ msDS-NonMembersBL $ msDS-MembersForAzRoleBL $ msDS-OperationsForAzTaskBL $ msDS-TasksForAzTaskBL $ msDS-OperationsForAzRoleBL $ msDS-TasksForAzRoleBL $ msDs-masteredBy $ msDS-ObjectReferenceBL $ msDS-PrincipalName $ msDS-RevealedDSAs $ msDS-KrbTgtLinkBl $ msDS-IsFullReplicaFor $ msDS-IsDomainFor $ msDS-IsPartialReplicaFor $ msDS-AuthenticatedToAccountlist $ msDS-NC-RO-Replica-Locations-BL $ msDS-RevealedListBL $ msDS-PSOApplied $ msDS-NcType $ msDS-OIDToGroupLinkBl $ msDS-HostServiceAccountBL $ isRecycled $ msDS-LocalEffectiveDeletionTime $ msDS-LocalEffectiveRecycleTime $ msDS-LastKnownRDN $ msDS-EnabledFeatureBL $ msDS-ClaimSharesPossibleValuesWithBL $ msDS-MembersOfResourcePropertyListBL $ msDS-IsPrimaryComputerFor $ msDS-ValueTypeReferenceBL $ msDS-TDOIngressBL $ msDS-TDOEgressBL $ msDS-parentdistname $ msDS-ReplValueMetaDataExt $ msds-memberOfTransitive $ msds-memberTransitive $ structuralObjectClass $ createTimeStamp $ modifyTimeStamp $ subSchemaSubEntry $ msSFU30PosixMemberOf $ msDFSR-MemberReferenceBL $ msDFSR-ComputerReferenceBL ) )", + "( 1.2.840.113556.1.5.36 NAME 'volume' SUP connectionPoint STRUCTURAL MUST (uNCName ) MAY (contentIndexingAllowed $ lastContentIndexed ) )", + "( 1.2.840.113556.1.5.236 NAME 'msDS-AzOperation' SUP top STRUCTURAL MUST (msDS-AzOperationID ) MAY (description $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 2.5.6.9 NAME 'groupOfNames' SUP top STRUCTURAL MUST (cn $ member ) MAY (o $ ou $ businessCategory $ owner $ seeAlso ) )", + "( 1.2.840.113556.1.5.12 NAME 'configuration' SUP top STRUCTURAL MUST (cn ) MAY (gPLink $ gPOptions $ msDS-USNLastSyncSuccess ) )", + "( 1.2.840.113556.1.5.78 NAME 'licensingSiteSettings' SUP applicationSiteSettings STRUCTURAL MAY (siteServer ) )", + "( 1.2.840.113556.1.5.69 NAME 'nTDSSiteSettings' SUP applicationSiteSettings STRUCTURAL MAY (schedule $ options $ queryPolicyObject $ managedBy $ interSiteTopologyGenerator $ interSiteTopologyRenew $ interSiteTopologyFailover $ msDS-Preferred-GC-Site ) )", + "( 1.2.840.113556.1.5.269 NAME 'msDS-ClaimTypePropertyBase' SUP top ABSTRACT MAY (Enabled $ msDS-ClaimPossibleValues $ msDS-ClaimSharesPossibleValuesWith ) )", + "( 1.2.840.113556.1.5.273 NAME 'msDS-ResourceProperty' SUP msDS-ClaimTypePropertyBase STRUCTURAL MUST (msDS-ValueTypeReference ) MAY (msDS-IsUsedAsResourceSecurityAttribute $ msDS-AppliesToResourceTypes ) )", + "( 1.2.840.113556.1.5.239 NAME 'msDS-AzRole' SUP top STRUCTURAL MAY (description $ msDS-MembersForAzRole $ msDS-OperationsForAzRole $ msDS-TasksForAzRole $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' SUP top AUXILIARY MAY (cn $ bootParameter $ bootFile ) )", + "( 1.2.840.113556.1.5.294 NAME 'msDS-AuthNPolicy' SUP top STRUCTURAL MAY (msDS-UserAllowedToAuthenticateTo $ msDS-UserAllowedToAuthenticateFrom $ msDS-UserTGTLifetime $ msDS-ComputerAllowedToAuthenticateTo $ msDS-ComputerTGTLifetime $ msDS-ServiceAllowedToAuthenticateTo $ msDS-ServiceAllowedToAuthenticateFrom $ msDS-ServiceTGTLifetime $ msDS-UserAuthNPolicyBL $ msDS-ComputerAuthNPolicyBL $ msDS-ServiceAuthNPolicyBL $ msDS-AssignedAuthNPolicyBL $ msDS-AuthNPolicyEnforced ) )", + "( 1.2.840.113556.1.5.86 NAME 'dnsNode' SUP top STRUCTURAL MUST (dc ) MAY (dnsRecord $ dNSProperty $ dNSTombstoned ) )", + "( 1.2.840.113556.1.5.210 NAME 'msWMI-StringSetParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-StringDefault ) MAY (msWMI-StringValidValues ) )", + "( 1.2.840.113556.1.5.264 NAME 'msDS-ManagedServiceAccount' SUP computer STRUCTURAL )", + "( 1.2.840.113556.1.5.15 NAME 'contact' SUP organizationalPerson STRUCTURAL MUST (cn ) MAY (notes $ msDS-SourceObjectDN ) )", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY MAY (cn $ description $ userPassword $ homeDirectory $ unixUserPassword $ uid $ uidNumber $ gidNumber $ gecos $ unixHomeDirectory $ loginShell ) )", + "( 1.2.840.113556.1.5.266 NAME 'msSPP-ActivationObjectsContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.217 NAME 'msWMI-ObjectEncoding' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-TargetObject $ msWMI-Class $ msWMI-Genus $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 $ msWMI-ScopeGuid ) )", + "( 1.2.840.113556.1.5.33 NAME 'storage' SUP connectionPoint STRUCTURAL MAY (moniker $ monikerDisplayName $ iconPath ) )", + "( 1.2.840.113556.1.5.67 NAME 'domainDNS' SUP domain STRUCTURAL MAY (managedBy $ msDS-Behavior-Version $ msDS-AllowedDNSSuffixes $ msDS-USNLastSyncSuccess $ msDS-EnabledFeature ) )", + "( 1.2.840.113556.1.5.92 NAME 'linkTrackVolEntry' SUP leaf STRUCTURAL MAY (linkTrackSecret $ volTableIdxGUID $ volTableGUID $ currMachineId $ timeVolChange $ timeRefresh $ seqNotification $ objectCount ) )", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' SUP top AUXILIARY MAY (cn $ macAddress ) )", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' SUP top AUXILIARY MAY (associatedDomain ) )", + "( 1.2.840.113556.1.5.235 NAME 'msDS-AzApplication' SUP top STRUCTURAL MAY (description $ msDS-AzApplicationName $ msDS-AzGenerateAudits $ msDS-AzClassId $ msDS-AzApplicationVersion $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.107 NAME 'sitesContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.263 NAME 'msImaging-PostScanProcess' SUP top STRUCTURAL MUST (displayName $ msImaging-PSPIdentifier ) MAY (serverName $ msImaging-PSPString ) )", + "( 1.2.840.113556.1.5.240 NAME 'msieee80211-Policy' SUP top STRUCTURAL MAY (msieee80211-Data $ msieee80211-DataType $ msieee80211-ID ) )", + "( 1.2.840.113556.1.5.95 NAME 'subnetContainer' SUP top STRUCTURAL )", + "( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MAY (cn $ l $ o $ ou $ description $ seeAlso $ documentIdentifier $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) )", + "( 2.5.6.6 NAME 'person' SUP top STRUCTURAL MUST (cn ) MAY (sn $ serialNumber $ telephoneNumber $ seeAlso $ userPassword $ attributeCertificateAttribute ) )", + "( 1.2.840.113556.1.5.274 NAME 'msDS-ResourcePropertyList' SUP top STRUCTURAL MAY (msDS-MembersOfResourcePropertyList ) )", + "( 1.2.840.113556.1.5.270 NAME 'msDS-ClaimTypes' SUP top STRUCTURAL )", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' SUP top AUXILIARY MAY (description $ userPassword $ uid $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ) )", + "( 1.2.840.113556.1.5.179 NAME 'mSMQMigratedUser' SUP top STRUCTURAL MAY (objectSid $ mSMQSignCertificates $ mSMQDigests $ mSMQDigestsMig $ mSMQSignCertificatesMig $ mSMQUserSid ) )", + "( 1.2.840.113556.1.5.185 NAME 'mS-SQL-OLAPServer' SUP serviceConnectionPoint STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-RegisteredOwner $ mS-SQL-Contact $ mS-SQL-Build $ mS-SQL-ServiceAccount $ mS-SQL-Status $ mS-SQL-InformationURL $ mS-SQL-PublicationURL $ mS-SQL-Version $ mS-SQL-Language $ mS-SQL-Keywords ) )", + "( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject' SUP top AUXILIARY MAY (msDS-Entry-Time-To-Die $ entryTTL ) )", + "( 1.2.840.113556.1.5.155 NAME 'nTFRSSubscriber' SUP top STRUCTURAL MUST (fRSRootPath $ fRSStagingPath ) MAY (schedule $ fRSUpdateTimeout $ fRSFaultCondition $ fRSServiceCommand $ fRSExtensions $ fRSFlags $ fRSMemberReference $ fRSServiceCommandStatus $ fRSTimeLastCommand $ fRSTimeLastConfigChange ) )", + "( 1.2.840.113556.1.5.129 NAME 'rIDSet' SUP top STRUCTURAL MUST (rIDAllocationPool $ rIDPreviousAllocationPool $ rIDUsedPool $ rIDNextRID ) )", + "( 1.2.840.113556.1.3.58 NAME 'addressTemplate' SUP displayTemplate STRUCTURAL MUST (displayName ) MAY (addressSyntax $ perMsgDialogDisplayTable $ perRecipDialogDisplayTable $ addressType $ proxyGenerationEnabled ) )", + "( 1.2.840.113556.1.5.154 NAME 'nTFRSSubscriptions' SUP top STRUCTURAL MAY (fRSWorkingPath $ fRSExtensions $ fRSVersion ) )", + "( 1.2.840.113556.1.5.7000.47 NAME 'nTDSDSA' SUP applicationSettings STRUCTURAL MAY (hasMasterNCs $ hasPartialReplicaNCs $ dMDLocation $ invocationId $ networkAddress $ options $ fRSRootPath $ serverReference $ lastBackupRestorationTime $ queryPolicyObject $ managedBy $ retiredReplDSASignatures $ msDS-Behavior-Version $ msDS-HasInstantiatedNCs $ msDS-ReplicationEpoch $ msDS-HasDomainNCs $ msDS-RetiredReplNCSignatures $ msDS-hasMasterNCs $ msDS-RevealedUsers $ msDS-hasFullReplicaNCs $ msDS-NeverRevealGroup $ msDS-RevealOnDemandGroup $ msDS-isGC $ msDS-isRODC $ msDS-SiteName $ msDS-IsUserCachableAtRodc $ msDS-EnabledFeature ) )", + "( 1.2.840.113556.1.5.175 NAME 'infrastructureUpdate' SUP top STRUCTURAL MAY (dNReferenceUpdate ) )", + "( 1.2.840.113556.1.6.18.2.215 NAME 'msSFU30DomainInfo' SUP top STRUCTURAL MAY (msSFU30SearchContainer $ msSFU30MasterServerName $ msSFU30OrderNumber $ msSFU30Domains $ msSFU30YpServers $ msSFU30MaxGidNumber $ msSFU30MaxUidNumber $ msSFU30IsValidContainer $ msSFU30CryptMethod ) )", + "( 1.2.840.113556.1.5.213 NAME 'msWMI-Som' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-Name ) MAY (msWMI-Author $ msWMI-ChangeDate $ msWMI-CreationDate $ msWMI-SourceOrganization $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.82 NAME 'rpcProfile' SUP rpcEntry STRUCTURAL )", + "( 1.2.840.113556.1.5.164 NAME 'mSMQSiteLink' SUP top STRUCTURAL MUST (mSMQSite1 $ mSMQSite2 $ mSMQCost ) MAY (mSMQSiteGates $ mSMQSiteGatesMig ) )", + "( 1.2.840.113556.1.5.184 NAME 'mS-SQL-SQLServer' SUP serviceConnectionPoint STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-RegisteredOwner $ mS-SQL-Contact $ mS-SQL-Location $ mS-SQL-Memory $ mS-SQL-Build $ mS-SQL-ServiceAccount $ mS-SQL-CharacterSet $ mS-SQL-SortOrder $ mS-SQL-UnicodeSortOrder $ mS-SQL-Clustered $ mS-SQL-NamedPipe $ mS-SQL-MultiProtocol $ mS-SQL-SPX $ mS-SQL-TCPIP $ mS-SQL-AppleTalk $ mS-SQL-Vines $ mS-SQL-Status $ mS-SQL-LastUpdatedDate $ mS-SQL-InformationURL $ mS-SQL-GPSLatitude $ mS-SQL-GPSLongitude $ mS-SQL-GPSHeight $ mS-SQL-Keywords ) )", + "( 1.2.840.113556.1.5.106 NAME 'queryPolicy' SUP top STRUCTURAL MAY (lDAPAdminLimits $ lDAPIPDenyList ) )", + "( 1.2.840.113556.1.5.162 NAME 'mSMQConfiguration' SUP top STRUCTURAL MAY (mSMQQuota $ mSMQJournalQuota $ mSMQOwnerID $ mSMQSites $ mSMQOutRoutingServers $ mSMQInRoutingServers $ mSMQServiceType $ mSMQComputerType $ mSMQForeign $ mSMQOSType $ mSMQEncryptKey $ mSMQSignKey $ mSMQDependentClientServices $ mSMQRoutingServices $ mSMQDsServices $ mSMQComputerTypeEx ) )", + "( 1.2.840.113556.1.5.257 NAME 'msDFS-NamespaceAnchor' SUP top STRUCTURAL MUST (msDFS-SchemaMajorVersion ) )", + "( 1.2.840.113556.1.6.13.4.7 NAME 'msDFSR-ContentSet' SUP top STRUCTURAL MAY (description $ msDFSR-Extension $ msDFSR-RootSizeInMb $ msDFSR-StagingSizeInMb $ msDFSR-ConflictSizeInMb $ msDFSR-FileFilter $ msDFSR-DirectoryFilter $ msDFSR-Flags $ msDFSR-Options $ msDFSR-DfsPath $ msDFSR-Priority $ msDFSR-DeletedSizeInMb $ msDFSR-DefaultCompressionExclusionFilter $ msDFSR-OnDemandExclusionFileFilter $ msDFSR-OnDemandExclusionDirectoryFilter $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.276 NAME 'msTPM-InformationObjectsContainer' SUP top STRUCTURAL MUST (cn ) )", + "( 1.2.840.113556.1.5.209 NAME 'msWMI-RealRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-Int8Default ) MAY (msWMI-Int8Max $ msWMI-Int8Min ) )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL MAY (c $ l $ st $ street $ o $ ou $ title $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ givenName $ initials $ generationQualifier $ houseIdentifier $ otherTelephone $ otherPager $ co $ department $ company $ streetAddress $ otherHomePhone $ msExchHouseIdentifier $ personalTitle $ homePostalAddress $ countryCode $ employeeID $ comment $ division $ otherFacsimileTelephoneNumber $ otherMobile $ primaryTelexNumber $ primaryInternationalISDNNumber $ mhsORAddress $ otherMailbox $ assistant $ ipPhone $ otherIpPhone $ msDS-AllowedToDelegateTo $ msDS-PhoneticFirstName $ msDS-PhoneticLastName $ msDS-PhoneticDepartment $ msDS-PhoneticCompanyName $ msDS-PhoneticDisplayName $ msDS-HABSeniorityIndex $ msDS-AllowedToActOnBehalfOfOtherIdentity $ mail $ manager $ homePhone $ mobile $ pager $ middleName $ thumbnailPhoto $ thumbnailLogo ) )", + "( 1.2.840.113556.1.5.176 NAME 'msExchConfigurationContainer' SUP container STRUCTURAL MAY (addressBookRoots $ globalAddressList $ templateRoots $ addressBookRoots2 $ globalAddressList2 $ templateRoots2 ) )", + "( 1.2.840.113556.1.5.278 NAME 'msKds-ProvRootKey' SUP top STRUCTURAL MUST (cn $ msKds-KDFAlgorithmID $ msKds-SecretAgreementAlgorithmID $ msKds-PublicKeyLength $ msKds-PrivateKeyLength $ msKds-RootKeyData $ msKds-Version $ msKds-DomainID $ msKds-UseStartTime $ msKds-CreateTime ) MAY (msKds-KDFParam $ msKds-SecretAgreementParam ) )", + "( 1.2.840.113556.1.5.238 NAME 'msDS-AzTask' SUP top STRUCTURAL MAY (description $ msDS-AzBizRule $ msDS-AzBizRuleLanguage $ msDS-AzLastImportedBizRulePath $ msDS-OperationsForAzTask $ msDS-TasksForAzTask $ msDS-AzTaskIsRoleDefinition $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.282 NAME 'msDS-GroupManagedServiceAccount' SUP computer STRUCTURAL MUST (msDS-ManagedPasswordInterval ) MAY (msDS-ManagedPassword $ msDS-ManagedPasswordId $ msDS-ManagedPasswordPreviousId $ msDS-GroupMSAMembership ) )", + "( 1.3.6.1.1.1.2.9 NAME 'nisMap' SUP top STRUCTURAL MUST (cn $ nisMapName ) MAY (description ) )", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' SUP top STRUCTURAL MUST (cn $ nisMapName $ nisMapEntry ) MAY (description $ msSFU30Name $ msSFU30NisDomain ) )", + "( 1.2.840.113556.1.5.277 NAME 'msKds-ProvServerConfiguration' SUP top STRUCTURAL MUST (msKds-Version ) MAY (msKds-KDFAlgorithmID $ msKds-KDFParam $ msKds-SecretAgreementAlgorithmID $ msKds-SecretAgreementParam $ msKds-PublicKeyLength $ msKds-PrivateKeyLength ) )", + "( 1.2.840.113556.1.6.18.2.217 NAME 'msSFU30NISMapConfig' SUP top STRUCTURAL MAY (msSFU30KeyAttributes $ msSFU30FieldSeparator $ msSFU30IntraFieldSeparator $ msSFU30SearchAttributes $ msSFU30ResultAttributes $ msSFU30MapFilter $ msSFU30NSMAPFieldPosition ) )", + "( 1.2.840.113556.1.5.7000.48 NAME 'serversContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.90 NAME 'linkTrackVolumeTable' SUP fileLinkTracking STRUCTURAL )", + "( 1.2.840.113556.1.5.188 NAME 'mS-SQL-SQLDatabase' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Status $ mS-SQL-InformationURL $ mS-SQL-Description $ mS-SQL-Alias $ mS-SQL-Size $ mS-SQL-CreationDate $ mS-SQL-LastBackupDate $ mS-SQL-LastDiagnosticDate $ mS-SQL-Applications $ mS-SQL-Keywords ) )", + "( 1.2.840.113556.1.5.211 NAME 'msWMI-PolicyType' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-TargetObject ) MAY (msWMI-Author $ msWMI-ChangeDate $ msWMI-CreationDate $ msWMI-SourceOrganization $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.183 NAME 'dSUISettings' SUP top STRUCTURAL MAY (dSUIAdminNotification $ dSUIAdminMaximum $ dSUIShellMaximum $ msDS-Security-Group-Extra-Classes $ msDS-Non-Security-Group-Extra-Classes $ msDS-FilterContainers ) )", + "( 1.2.840.113556.1.5.157 NAME 'groupPolicyContainer' SUP container STRUCTURAL MAY (flags $ versionNumber $ gPCFunctionalityVersion $ gPCFileSysPath $ gPCMachineExtensionNames $ gPCUserExtensionNames $ gPCWQLFilter ) )", + "( 1.2.840.113556.1.5.3 NAME 'samDomain' SUP top AUXILIARY MAY (description $ cACertificate $ builtinCreationTime $ builtinModifiedCount $ creationTime $ domainPolicyObject $ defaultLocalPolicyObject $ lockoutDuration $ lockOutObservationWindow $ lSACreationTime $ lSAModifiedCount $ lockoutThreshold $ maxPwdAge $ minPwdAge $ minPwdLength $ modifiedCountAtLastProm $ nETBIOSName $ nextRid $ pwdProperties $ pwdHistoryLength $ privateKey $ replicaSource $ controlAccessRights $ auditingPolicy $ eFSPolicy $ desktopProfile $ nTMixedDomain $ rIDManagerReference $ treeName $ pekList $ pekKeyChangeInterval $ gPLink $ gPOptions $ ms-DS-MachineAccountQuota $ msDS-LogonTimeSyncInterval $ msDS-PerUserTrustQuota $ msDS-AllUsersTrustQuota $ msDS-PerUserTrustTombstonesQuota ) )", + "( 1.2.840.113556.1.5.234 NAME 'msDS-AzAdminManager' SUP top STRUCTURAL MAY (description $ msDS-AzDomainTimeout $ msDS-AzScriptEngineCacheMax $ msDS-AzScriptTimeout $ msDS-AzGenerateAudits $ msDS-AzApplicationData $ msDS-AzMajorVersion $ msDS-AzMinorVersion $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.214 NAME 'msWMI-Rule' SUP top STRUCTURAL MUST (msWMI-Query $ msWMI-QueryLanguage $ msWMI-TargetNameSpace ) )", + "( 1.2.840.113556.1.5.254 NAME 'nTDSDSARO' SUP nTDSDSA STRUCTURAL )", + "( 1.2.840.113556.1.5.286 NAME 'msDS-Device' SUP top STRUCTURAL MUST (displayName $ altSecurityIdentities $ msDS-IsEnabled $ msDS-DeviceID ) MAY (msDS-DeviceOSType $ msDS-DeviceOSVersion $ msDS-DevicePhysicalIDs $ msDS-DeviceObjectVersion $ msDS-RegisteredOwner $ msDS-ApproximateLastLogonTimeStamp $ msDS-RegisteredUsers $ msDS-IsManaged $ msDS-CloudIsManaged $ msDS-CloudAnchor ) )", + "( 1.2.840.113556.1.5.34 NAME 'trustedDomain' SUP leaf STRUCTURAL MAY (securityIdentifier $ trustAuthIncoming $ trustDirection $ trustPartner $ trustPosixOffset $ trustAuthOutgoing $ trustType $ trustAttributes $ domainCrossRef $ flatName $ initialAuthIncoming $ initialAuthOutgoing $ domainIdentifier $ additionalTrustedServiceNames $ mS-DS-CreatorSID $ msDS-TrustForestTrustInfo $ msDS-SupportedEncryptionTypes $ msDS-IngressClaimsTransformationPolicy $ msDS-EgressClaimsTransformationPolicy ) )", + "( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST (cn ) MAY (description $ telephoneNumber $ seeAlso $ location $ roomNumber ) )", + "( 2.5.6.4 NAME 'organization' SUP top STRUCTURAL MUST (o ) MAY (l $ st $ street $ searchGuide $ businessCategory $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ seeAlso $ userPassword ) )", + "( 1.2.840.113556.1.5.272 NAME 'msDS-ClaimType' SUP msDS-ClaimTypePropertyBase STRUCTURAL MAY (msDS-ClaimValueType $ msDS-ClaimAttributeSource $ msDS-ClaimTypeAppliesToClass $ msDS-ClaimSource $ msDS-ClaimSourceType $ msDS-ClaimIsValueSpaceRestricted $ msDS-ClaimIsSingleValued ) )", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' SUP top STRUCTURAL MUST (cn $ ipServicePort $ ipServiceProtocol ) MAY (description $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' SUP top STRUCTURAL MUST (cn $ ipProtocolNumber ) MAY (description $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.80 NAME 'rpcGroup' SUP rpcEntry STRUCTURAL MAY (rpcNsGroup $ rpcNsObjectID ) )", + "( 1.2.840.113556.1.5.17 NAME 'server' SUP top STRUCTURAL MAY (serialNumber $ serverReference $ dNSHostName $ managedBy $ mailAddress $ bridgeheadTransportList $ msDS-isGC $ msDS-isRODC $ msDS-SiteName $ msDS-IsUserCachableAtRodc ) )", + "( 1.2.840.113556.1.5.28 NAME 'secret' SUP leaf STRUCTURAL MAY (currentValue $ lastSetTime $ priorSetTime $ priorValue ) )", + "( 1.2.840.113556.1.5.163 NAME 'mSMQEnterpriseSettings' SUP top STRUCTURAL MAY (mSMQNameStyle $ mSMQCSPName $ mSMQLongLived $ mSMQVersion $ mSMQInterval1 $ mSMQInterval2 ) )", + "( 1.2.840.113556.1.5.202 NAME 'msWMI-MergeablePolicyTemplate' SUP msWMI-PolicyTemplate STRUCTURAL )", + "( 1.2.840.113556.1.5.195 NAME 'msPKI-Key-Recovery-Agent' SUP user STRUCTURAL )", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST (co ) )", + "( 1.2.840.113556.1.5.258 NAME 'msDFS-Namespacev2' SUP top STRUCTURAL MUST (msDFS-SchemaMajorVersion $ msDFS-SchemaMinorVersion $ msDFS-GenerationGUIDv2 $ msDFS-NamespaceIdentityGUIDv2 $ msDFS-LastModifiedv2 $ msDFS-Ttlv2 $ msDFS-Propertiesv2 $ msDFS-TargetListv2 ) MAY (msDFS-Commentv2 ) )", + "( 1.2.840.113556.1.5.96 NAME 'subnet' SUP top STRUCTURAL MAY (location $ siteObject $ physicalLocationObject ) )", + "( 1.2.840.113556.1.5.216 NAME 'applicationVersion' SUP applicationSettings STRUCTURAL MAY (owner $ keywords $ versionNumber $ vendor $ versionNumberHi $ versionNumberLo $ managedBy $ appSchemaVersion ) )", + "( 2.5.6.10 NAME 'residentialPerson' SUP person STRUCTURAL MAY (l $ st $ street $ ou $ title $ businessCategory $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod ) )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST (cn ) MAY (authorityRevocationList $ certificateRevocationList $ deltaRevocationList $ cRLPartitionedRevocationList $ certificateAuthorityObject ) )", + "( 1.2.840.113556.1.5.137 NAME 'aCSPolicy' SUP top STRUCTURAL MAY (aCSTimeOfDay $ aCSDirection $ aCSMaxTokenRatePerFlow $ aCSMaxPeakBandwidthPerFlow $ aCSAggregateTokenRatePerUser $ aCSMaxDurationPerFlow $ aCSServiceType $ aCSTotalNoOfFlows $ aCSPriority $ aCSPermissionBits $ aCSIdentityName $ aCSMaxAggregatePeakRatePerUser $ aCSMaxTokenBucketPerFlow $ aCSMaximumSDUSize $ aCSMinimumPolicedSize $ aCSMinimumLatency $ aCSMinimumDelayVariation ) )", + "( 1.2.840.113556.1.5.77 NAME 'controlAccessRight' SUP top STRUCTURAL MAY (rightsGuid $ appliesTo $ localizationDisplayId $ validAccesses ) )", + "( 1.2.840.113556.1.5.219 NAME 'msMQ-Group' SUP top STRUCTURAL MUST (member ) )", + "( 1.2.840.113556.1.5.8 NAME 'group' SUP top STRUCTURAL MUST (groupType ) MAY (member $ nTGroupMembers $ operatorCount $ adminCount $ groupAttributes $ groupMembershipSAM $ controlAccessRights $ desktopProfile $ nonSecurityMember $ managedBy $ primaryGroupToken $ msDS-AzLDAPQuery $ msDS-NonMembers $ msDS-AzBizRule $ msDS-AzBizRuleLanguage $ msDS-AzLastImportedBizRulePath $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData $ msDS-PrimaryComputer $ mail $ msSFU30Name $ msSFU30NisDomain $ msSFU30PosixMember ) )", + "( 1.2.840.113556.1.6.23.2 NAME 'msPrint-ConnectionPolicy' SUP top STRUCTURAL MUST (cn ) MAY (uNCName $ serverName $ printAttributes $ printerName ) )", + "( 1.2.840.113556.1.3.11 NAME 'crossRef' SUP top STRUCTURAL MUST (cn $ nCName $ dnsRoot ) MAY (Enabled $ nETBIOSName $ nTMixedDomain $ trustParent $ superiorDNSRoot $ rootTrust $ msDS-Behavior-Version $ msDS-NC-Replica-Locations $ msDS-Replication-Notify-First-DSA-Delay $ msDS-Replication-Notify-Subsequent-DSA-Delay $ msDS-SDReferenceDomain $ msDS-DnsRootAlias $ msDS-NC-RO-Replica-Locations ) )", + "( 1.2.840.113556.1.6.13.4.9 NAME 'msDFSR-Member' SUP top STRUCTURAL MUST (msDFSR-ComputerReference ) MAY (serverReference $ msDFSR-Extension $ msDFSR-Keywords $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.3.59 NAME 'displayTemplate' SUP top STRUCTURAL MUST (cn ) MAY (helpData32 $ originalDisplayTableMSDOS $ addressEntryDisplayTable $ helpFileName $ addressEntryDisplayTableMSDOS $ helpData16 $ originalDisplayTable ) )", + "( 1.2.840.113556.1.3.13 NAME 'classSchema' SUP top STRUCTURAL MUST (cn $ subClassOf $ governsID $ objectClassCategory $ schemaIDGUID $ defaultObjectCategory ) MAY (possSuperiors $ mustContain $ mayContain $ rDNAttID $ auxiliaryClass $ lDAPDisplayName $ schemaFlagsEx $ systemOnly $ systemPossSuperiors $ systemMayContain $ systemMustContain $ systemAuxiliaryClass $ defaultSecurityDescriptor $ defaultHidingValue $ classDisplayName $ isDefunct $ msDs-Schema-Extensions $ msDS-IntId ) )", + "( 1.2.840.113556.1.5.200 NAME 'msWMI-PolicyTemplate' SUP top STRUCTURAL MUST (msWMI-ID $ msWMI-Name $ msWMI-NormalizedClass $ msWMI-TargetClass $ msWMI-TargetNameSpace $ msWMI-TargetPath ) MAY (msWMI-Author $ msWMI-ChangeDate $ msWMI-CreationDate $ msWMI-SourceOrganization $ msWMI-TargetType $ msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.165 NAME 'mSMQSettings' SUP top STRUCTURAL MAY (mSMQOwnerID $ mSMQServices $ mSMQQMID $ mSMQMigrated $ mSMQNt4Flags $ mSMQSiteName $ mSMQRoutingService $ mSMQDsService $ mSMQDependentClientService $ mSMQSiteNameEx ) )", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' SUP top STRUCTURAL MUST (cn $ oncRpcNumber ) MAY (description $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.126 NAME 'serviceConnectionPoint' SUP connectionPoint STRUCTURAL MAY (versionNumber $ vendor $ versionNumberHi $ versionNumberLo $ serviceClassName $ serviceBindingInformation $ serviceDNSName $ serviceDNSNameType $ appSchemaVersion ) )", + "( 1.2.840.113556.1.5.4 NAME 'builtinDomain' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.241 NAME 'msDS-AppData' SUP applicationSettings STRUCTURAL MAY (owner $ keywords $ managedBy $ msDS-ByteArray $ msDS-DateTime $ msDS-Integer $ msDS-ObjectReference ) )", + "( 1.2.840.113556.1.5.73 NAME 'rpcServerElement' SUP rpcEntry STRUCTURAL MUST (rpcNsBindings $ rpcNsInterfaceID $ rpcNsTransferSyntax ) )", + "( 1.2.840.113556.1.5.150 NAME 'rRASAdministrationConnectionPoint' SUP serviceAdministrationPoint STRUCTURAL MAY (msRRASAttribute ) )", + "( 1.2.840.113556.1.5.191 NAME 'aCSResourceLimits' SUP top STRUCTURAL MAY (aCSMaxTokenRatePerFlow $ aCSMaxPeakBandwidthPerFlow $ aCSServiceType $ aCSAllocableRSVPBandwidth $ aCSMaxPeakBandwidth ) )", + "( 2.5.6.3 NAME 'locality' SUP top STRUCTURAL MUST (l ) MAY (st $ street $ searchGuide $ seeAlso ) )", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost' SUP top AUXILIARY MAY (cn $ l $ description $ uid $ manager $ ipHostNumber ) )", + "( 1.2.840.113556.1.5.275 NAME 'msTPM-InformationObject' SUP top STRUCTURAL MUST (msTPM-OwnerInformation ) MAY (msTPM-SrkPubThumbprint $ msTPM-OwnerInformationTemp ) )", + "( 1.2.840.113556.1.5.289 NAME 'msDS-DeviceContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.4.2129 NAME 'msDNS-ServerSettings' SUP top STRUCTURAL MAY (msDNS-KeymasterZones ) )", + "( 1.2.840.113556.1.5.76 NAME 'foreignSecurityPrincipal' SUP top STRUCTURAL MUST (objectSid ) MAY (foreignIdentifier ) )", + "( 1.2.840.113556.1.5.44 NAME 'classStore' SUP top STRUCTURAL MAY (versionNumber $ nextLevelStore $ lastUpdateSequence $ appSchemaVersion ) )", + "( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MAY (l $ o $ ou $ description $ seeAlso $ uid $ host ) )", + "( 1.2.840.113556.1.5.26 NAME 'rpcProfileElement' SUP rpcEntry STRUCTURAL MUST (rpcNsInterfaceID $ rpcNsPriority ) MAY (rpcNsProfileEntry $ rpcNsAnnotation ) )", + "( 1.2.840.113556.1.5.215 NAME 'msWMI-WMIGPO' SUP top STRUCTURAL MUST (msWMI-TargetClass ) MAY (msWMI-intFlags1 $ msWMI-intFlags2 $ msWMI-intFlags3 $ msWMI-intFlags4 $ msWMI-Parm1 $ msWMI-Parm2 $ msWMI-Parm3 $ msWMI-Parm4 ) )", + "( 1.2.840.113556.1.5.243 NAME 'msDS-QuotaControl' SUP top STRUCTURAL MUST (cn $ msDS-QuotaTrustee $ msDS-QuotaAmount ) )", + "( 1.2.840.113556.1.5.256 NAME 'msDS-PasswordSettingsContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.187 NAME 'mS-SQL-SQLPublication' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Status $ mS-SQL-Description $ mS-SQL-Type $ mS-SQL-Database $ mS-SQL-AllowAnonymousSubscription $ mS-SQL-Publisher $ mS-SQL-AllowKnownPullSubscription $ mS-SQL-AllowImmediateUpdatingSubscription $ mS-SQL-AllowQueuedUpdatingSubscription $ mS-SQL-AllowSnapshotFilesFTPDownloading $ mS-SQL-ThirdParty ) )", + "( 1.2.840.113556.1.5.9 NAME 'user' SUP organizationalPerson STRUCTURAL MAY (o $ businessCategory $ userCertificate $ givenName $ initials $ x500uniqueIdentifier $ displayName $ networkAddress $ employeeNumber $ employeeType $ homePostalAddress $ userAccountControl $ badPwdCount $ codePage $ homeDirectory $ homeDrive $ badPasswordTime $ lastLogoff $ lastLogon $ dBCSPwd $ localeID $ scriptPath $ logonHours $ logonWorkstation $ maxStorage $ userWorkstations $ unicodePwd $ otherLoginWorkstations $ ntPwdHistory $ pwdLastSet $ preferredOU $ primaryGroupID $ userParameters $ profilePath $ operatorCount $ adminCount $ accountExpires $ lmPwdHistory $ groupMembershipSAM $ logonCount $ controlAccessRights $ defaultClassStore $ groupsToIgnore $ groupPriority $ desktopProfile $ dynamicLDAPServer $ userPrincipalName $ lockoutTime $ userSharedFolder $ userSharedFolderOther $ servicePrincipalName $ aCSPolicyName $ terminalServer $ mSMQSignCertificates $ mSMQDigests $ mSMQDigestsMig $ mSMQSignCertificatesMig $ msNPAllowDialin $ msNPCallingStationID $ msNPSavedCallingStationID $ msRADIUSCallbackNumber $ msRADIUSFramedIPAddress $ msRADIUSFramedRoute $ msRADIUSServiceType $ msRASSavedCallbackNumber $ msRASSavedFramedIPAddress $ msRASSavedFramedRoute $ mS-DS-CreatorSID $ msCOM-UserPartitionSetLink $ msDS-Cached-Membership $ msDS-Cached-Membership-Time-Stamp $ msDS-Site-Affinity $ msDS-User-Account-Control-Computed $ lastLogonTimestamp $ msIIS-FTPRoot $ msIIS-FTPDir $ msDRM-IdentityCertificate $ msDS-SourceObjectDN $ msPKIRoamingTimeStamp $ msPKIDPAPIMasterKeys $ msPKIAccountCredentials $ msRADIUS-FramedInterfaceId $ msRADIUS-SavedFramedInterfaceId $ msRADIUS-FramedIpv6Prefix $ msRADIUS-SavedFramedIpv6Prefix $ msRADIUS-FramedIpv6Route $ msRADIUS-SavedFramedIpv6Route $ msDS-SecondaryKrbTgtNumber $ msDS-AuthenticatedAtDC $ msDS-SupportedEncryptionTypes $ msDS-LastSuccessfulInteractiveLogonTime $ msDS-LastFailedInteractiveLogonTime $ msDS-FailedInteractiveLogonCount $ msDS-FailedInteractiveLogonCountAtLastSuccessfulLogon $ msTSProfilePath $ msTSHomeDirectory $ msTSHomeDrive $ msTSAllowLogon $ msTSRemoteControl $ msTSMaxDisconnectionTime $ msTSMaxConnectionTime $ msTSMaxIdleTime $ msTSReconnectionAction $ msTSBrokenConnectionAction $ msTSConnectClientDrives $ msTSConnectPrinterDrives $ msTSDefaultToMainPrinter $ msTSWorkDirectory $ msTSInitialProgram $ msTSProperty01 $ msTSProperty02 $ msTSExpireDate $ msTSLicenseVersion $ msTSManagingLS $ msDS-UserPasswordExpiryTimeComputed $ msTSExpireDate2 $ msTSLicenseVersion2 $ msTSManagingLS2 $ msTSExpireDate3 $ msTSLicenseVersion3 $ msTSManagingLS3 $ msTSExpireDate4 $ msTSLicenseVersion4 $ msTSManagingLS4 $ msTSLSProperty01 $ msTSLSProperty02 $ msDS-ResultantPSO $ msPKI-CredentialRoamingTokens $ msTSPrimaryDesktop $ msTSSecondaryDesktops $ msDS-PrimaryComputer $ msDS-SyncServerUrl $ msDS-AssignedAuthNPolicySilo $ msDS-AuthNPolicySiloMembersBL $ msDS-AssignedAuthNPolicy $ userSMIMECertificate $ uid $ mail $ roomNumber $ photo $ manager $ homePhone $ secretary $ mobile $ pager $ audio $ jpegPhoto $ carLicense $ departmentNumber $ preferredLanguage $ userPKCS12 $ labeledURI $ msSFU30Name $ msSFU30NisDomain ) )", + "( 1.2.840.113556.1.5.259 NAME 'msDFS-Linkv2' SUP top STRUCTURAL MUST (msDFS-GenerationGUIDv2 $ msDFS-NamespaceIdentityGUIDv2 $ msDFS-LastModifiedv2 $ msDFS-Ttlv2 $ msDFS-Propertiesv2 $ msDFS-TargetListv2 $ msDFS-LinkPathv2 $ msDFS-LinkIdentityGUIDv2 ) MAY (msDFS-Commentv2 $ msDFS-LinkSecurityDescriptorv2 $ msDFS-ShortNameLinkPathv2 ) )", + "( 1.2.840.113556.1.5.141 NAME 'interSiteTransport' SUP top STRUCTURAL MUST (transportDLLName $ transportAddressAttribute ) MAY (options $ replInterval ) )", + "( 1.2.840.113556.1.6.13.4.4 NAME 'msDFSR-GlobalSettings' SUP top STRUCTURAL MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.29 NAME 'serviceClass' SUP leaf STRUCTURAL MUST (displayName $ serviceClassID ) MAY (serviceClassInfo ) )", + "( 1.2.840.113556.1.5.189 NAME 'mS-SQL-OLAPDatabase' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Status $ mS-SQL-LastUpdatedDate $ mS-SQL-InformationURL $ mS-SQL-ConnectionURL $ mS-SQL-PublicationURL $ mS-SQL-Description $ mS-SQL-Type $ mS-SQL-Size $ mS-SQL-LastBackupDate $ mS-SQL-Applications $ mS-SQL-Keywords ) )", + "( 2.5.6.16 NAME 'certificationAuthority' SUP top STRUCTURAL MUST (cn $ cACertificate $ authorityRevocationList $ certificateRevocationList ) MAY (searchGuide $ teletexTerminalIdentifier $ supportedApplicationContext $ crossCertificatePair $ deltaRevocationList $ domainPolicyObject $ parentCA $ dNSHostName $ parentCACertificateChain $ domainID $ cAConnect $ cAWEBURL $ cRLObject $ cAUsages $ previousCACertificates $ pendingCACertificates $ previousParentCA $ pendingParentCA $ currentParentCA $ cACertificateDN $ certificateTemplates $ signatureAlgorithms $ enrollmentProviders ) )", + "( 1.2.840.113556.1.5.104 NAME 'meeting' SUP top STRUCTURAL MUST (meetingName ) MAY (meetingID $ meetingDescription $ meetingKeyword $ meetingLocation $ meetingProtocol $ meetingType $ meetingApplication $ meetingLanguage $ meetingMaxParticipants $ meetingOriginator $ meetingContactInfo $ meetingOwner $ meetingIP $ meetingScope $ meetingAdvertiseScope $ meetingURL $ meetingRating $ meetingIsEncrypted $ meetingRecurrence $ meetingStartTime $ meetingEndTime $ meetingBandwidth $ meetingBlob ) )", + "( 1.2.840.113556.1.5.287 NAME 'msDS-DeviceRegistrationServiceContainer' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.71 NAME 'nTDSConnection' SUP leaf STRUCTURAL MUST (enabledConnection $ fromServer $ options ) MAY (generatedConnection $ schedule $ transportType $ mS-DS-ReplicatesNCReason ) )", + "( 1.2.840.113556.1.5.291 NAME 'msDS-AuthNPolicySilos' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.218 NAME 'msMQ-Custom-Recipient' SUP top STRUCTURAL MAY (msMQ-Recipient-FormatName ) )", + "( 1.2.840.113556.1.5.72 NAME 'nTDSService' SUP top STRUCTURAL MAY (tombstoneLifetime $ dSHeuristics $ garbageCollPeriod $ replTopologyStayOfExecution $ sPNMappings $ msDS-Other-Settings $ msDS-DeletedObjectLifetime ) )", + "( 1.2.840.113556.1.3.9 NAME 'dMD' SUP top STRUCTURAL MUST (cn ) MAY (dmdName $ schemaUpdate $ prefixMap $ schemaInfo $ msDs-Schema-Extensions $ msDS-IntId $ msDS-USNLastSyncSuccess ) )", + "( 1.2.840.113556.1.5.280 NAME 'msDS-ClaimsTransformationPolicyType' SUP top STRUCTURAL MAY (msDS-TransformationRules $ msDS-TransformationRulesCompiled ) )", + "( 0.9.2342.19200300.100.4.14 NAME 'rFC822LocalPart' SUP domain STRUCTURAL MAY (cn $ sn $ street $ description $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ seeAlso ) )", + "( 1.2.840.113556.1.5.190 NAME 'mS-SQL-OLAPCube' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Status $ mS-SQL-LastUpdatedDate $ mS-SQL-InformationURL $ mS-SQL-PublicationURL $ mS-SQL-Description $ mS-SQL-Size $ mS-SQL-Keywords ) )", + "( 1.2.840.113556.1.5.208 NAME 'msWMI-UintSetParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntValidValues ) )", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup' SUP top AUXILIARY MAY (cn $ description $ userPassword $ unixUserPassword $ gidNumber $ memberUid ) )", + "( 2.5.6.17 NAME 'groupOfUniqueNames' SUP top STRUCTURAL MUST (cn $ uniqueMember ) MAY (o $ ou $ description $ businessCategory $ owner $ seeAlso ) )", + "( 1.2.840.113556.1.5.252 NAME 'ms-net-ieee-8023-GroupPolicy' SUP top STRUCTURAL MAY (ms-net-ieee-8023-GP-PolicyGUID $ ms-net-ieee-8023-GP-PolicyData $ ms-net-ieee-8023-GP-PolicyReserved ) )", + "( 1.2.840.113556.1.5.119 NAME 'ipsecNegotiationPolicy' SUP ipsecBase STRUCTURAL MAY (iPSECNegotiationPolicyType $ iPSECNegotiationPolicyAction ) )", + "( 1.2.840.113556.1.5.292 NAME 'msDS-AuthNPolicySilo' SUP top STRUCTURAL MAY (msDS-AssignedAuthNPolicySiloBL $ msDS-AuthNPolicySiloMembers $ msDS-UserAuthNPolicy $ msDS-ComputerAuthNPolicy $ msDS-ServiceAuthNPolicy $ msDS-AuthNPolicySiloEnforced ) )", + "( 1.2.840.113556.1.5.121 NAME 'ipsecNFA' SUP ipsecBase STRUCTURAL MAY (ipsecNegotiationPolicyReference $ ipsecFilterReference ) )", + "( 1.2.840.113556.1.5.42 NAME 'dfsConfiguration' SUP top STRUCTURAL )", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST (cn ) MAY (l $ o $ ou $ description $ telephoneNumber $ seeAlso ) )", + "( 1.2.840.113556.1.5.271 NAME 'msDS-ResourceProperties' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.91 NAME 'linkTrackObjectMoveTable' SUP fileLinkTracking STRUCTURAL )", + "( 1.2.840.113556.1.5.136 NAME 'rpcContainer' SUP container STRUCTURAL MAY (nameServiceFlags ) )", + "( 1.2.840.113556.1.5.83 NAME 'rIDManager' SUP top STRUCTURAL MUST (rIDAvailablePool ) MAY (msDS-RIDPoolAllocationEnabled ) )", + "( 1.2.840.113556.1.5.206 NAME 'msWMI-IntSetParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-IntDefault ) MAY (msWMI-IntValidValues ) )", + "( 1.2.840.113556.1.6.13.4.5 NAME 'msDFSR-ReplicationGroup' SUP top STRUCTURAL MUST (msDFSR-ReplicationGroupType ) MAY (description $ msDFSR-Version $ msDFSR-Extension $ msDFSR-RootSizeInMb $ msDFSR-StagingSizeInMb $ msDFSR-ConflictSizeInMb $ msDFSR-TombstoneExpiryInMin $ msDFSR-FileFilter $ msDFSR-DirectoryFilter $ msDFSR-Schedule $ msDFSR-Flags $ msDFSR-Options $ msDFSR-DeletedSizeInMb $ msDFSR-DefaultCompressionExclusionFilter $ msDFSR-OnDemandExclusionFileFilter $ msDFSR-OnDemandExclusionDirectoryFilter $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.125 NAME 'addressBookContainer' SUP top STRUCTURAL MUST (displayName ) MAY (purportedSearch ) )", + "( 1.2.840.113556.1.5.7000.49 NAME 'applicationSettings' SUP top ABSTRACT MAY (applicationName $ notificationList $ msDS-Settings ) )", + "( 1.2.840.113556.1.5.265 NAME 'msDS-OptionalFeature' SUP top STRUCTURAL MUST (msDS-OptionalFeatureGUID $ msDS-OptionalFeatureFlags ) MAY (msDS-RequiredDomainBehaviorVersion $ msDS-RequiredForestBehaviorVersion ) )", + "( 1.2.840.113556.1.5.94 NAME 'serviceAdministrationPoint' SUP serviceConnectionPoint STRUCTURAL )", + "( 1.2.840.113556.1.5.102 NAME 'nTFRSReplicaSet' SUP top STRUCTURAL MAY (fRSReplicaSetType $ fRSVersionGUID $ schedule $ fRSFileFilter $ fRSDirectoryFilter $ fRSDSPoll $ fRSServiceCommand $ fRSReplicaSetGUID $ fRSLevelLimit $ fRSRootSecurity $ fRSExtensions $ managedBy $ fRSFlags $ fRSPartnerAuthLevel $ fRSPrimaryMember $ msFRS-Topology-Pref $ msFRS-Hub-Member ) )", + "( 1.2.840.113556.1.5.203 NAME 'msWMI-RangeParam' SUP top STRUCTURAL MUST (msWMI-PropertyName $ msWMI-TargetClass $ msWMI-TargetType ) )", + "( 1.2.840.113556.1.5.7000.56 NAME 'ipsecBase' SUP top ABSTRACT MAY (ipsecName $ ipsecID $ ipsecDataType $ ipsecData $ ipsecOwnersReference ) )", + "( 1.2.840.113556.1.6.13.4.3 NAME 'msDFSR-Subscription' SUP top STRUCTURAL MUST (msDFSR-ContentSetGuid $ msDFSR-ReplicationGroupGuid ) MAY (msDFSR-Extension $ msDFSR-RootPath $ msDFSR-RootSizeInMb $ msDFSR-StagingPath $ msDFSR-StagingSizeInMb $ msDFSR-ConflictPath $ msDFSR-ConflictSizeInMb $ msDFSR-Enabled $ msDFSR-Flags $ msDFSR-Options $ msDFSR-RootFence $ msDFSR-DfsLinkTarget $ msDFSR-DeletedPath $ msDFSR-DeletedSizeInMb $ msDFSR-ReadOnly $ msDFSR-CachePolicy $ msDFSR-MinDurationCacheInMin $ msDFSR-MaxAgeInCacheInMin $ msDFSR-OnDemandExclusionFileFilter $ msDFSR-OnDemandExclusionDirectoryFilter $ msDFSR-Options2 $ msDFSR-StagingCleanupTriggerInPercent ) )", + "( 1.2.840.113556.1.5.223 NAME 'msPKI-PrivateKeyRecoveryAgent' SUP top STRUCTURAL MUST (userCertificate ) )", + "( 1.2.840.113556.1.5.178 NAME 'pKIEnrollmentService' SUP top STRUCTURAL MAY (cACertificate $ dNSHostName $ cACertificateDN $ certificateTemplates $ signatureAlgorithms $ enrollmentProviders $ msPKI-Enrollment-Servers $ msPKI-Site-Name ) )", + "( 1.2.840.113556.1.6.18.2.211 NAME 'msSFU30MailAliases' SUP top STRUCTURAL MAY (msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.2.840.113556.1.5.53 NAME 'typeLibrary' SUP top STRUCTURAL MAY (cOMClassID $ cOMInterfaceID $ cOMUniqueLIBID ) )", + "( 1.2.840.113556.1.6.13.4.8 NAME 'msDFSR-Topology' SUP top STRUCTURAL MAY (msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 ) )", + "( 1.2.840.113556.1.5.237 NAME 'msDS-AzScope' SUP top STRUCTURAL MUST (msDS-AzScopeName ) MAY (description $ msDS-AzApplicationData $ msDS-AzObjectGuid $ msDS-AzGenericData ) )", + "( 1.2.840.113556.1.5.74 NAME 'categoryRegistration' SUP leaf STRUCTURAL MAY (localeID $ categoryId $ managedBy $ localizedDescription ) )", + "( 1.2.840.113556.1.5.11 NAME 'comConnectionPoint' SUP connectionPoint STRUCTURAL MUST (cn ) MAY (marshalledInterface $ moniker $ monikerDisplayName ) )", + "( 1.2.840.113556.1.5.93 NAME 'linkTrackOMTEntry' SUP leaf STRUCTURAL MAY (birthLocation $ oMTIndxGuid $ currentLocation $ timeRefresh $ oMTGuid ) )", + "( 1.2.840.113556.1.5.10 NAME 'classRegistration' SUP leaf STRUCTURAL MAY (cOMInterfaceID $ cOMProgID $ cOMCLSID $ cOMTreatAsClassId $ cOMOtherProgId $ implementedCategories $ requiredCategories $ managedBy ) )", + "( 1.2.840.113556.1.5.148 NAME 'siteLinkBridge' SUP top STRUCTURAL MUST (siteLinkList ) )", + "( 1.2.840.113556.1.5.81 NAME 'rpcServer' SUP rpcEntry STRUCTURAL MAY (rpcNsObjectID $ rpcNsCodeset $ rpcNsEntryFlags ) )", + "( 1.2.840.113556.1.3.46 NAME 'mailRecipient' SUP top AUXILIARY MUST (cn ) MAY (telephoneNumber $ userCertificate $ info $ garbageCollPeriod $ msExchAssistantName $ msExchLabeledURI $ showInAddressBook $ userCert $ legacyExchangeDN $ msDS-PhoneticDisplayName $ msDS-GeoCoordinatesAltitude $ msDS-GeoCoordinatesLatitude $ msDS-GeoCoordinatesLongitude $ userSMIMECertificate $ textEncodedORAddress $ secretary $ labeledURI ) )", + "( 1.2.840.113556.1.5.1 NAME 'securityObject' SUP top ABSTRACT MUST (cn ) )", + "( 1.2.840.113556.1.5.20 NAME 'leaf' SUP top ABSTRACT )", + "( 1.2.840.113556.1.5.151 NAME 'intellimirrorSCP' SUP serviceAdministrationPoint STRUCTURAL MAY (netbootMachineFilePath $ netbootAllowNewClients $ netbootLimitClients $ netbootMaxClients $ netbootCurrentClientCount $ netbootAnswerRequests $ netbootAnswerOnlyValidClients $ netbootNewMachineNamingPolicy $ netbootNewMachineOU $ netbootIntelliMirrorOSes $ netbootTools $ netbootLocallyInstalledOSes $ netbootServer ) )", + "( 1.2.840.113556.1.6.13.4.1 NAME 'msDFSR-LocalSettings' SUP top STRUCTURAL MAY (msDFSR-Version $ msDFSR-Extension $ msDFSR-Flags $ msDFSR-Options $ msDFSR-Options2 $ msDFSR-CommonStagingPath $ msDFSR-CommonStagingSizeInMb $ msDFSR-StagingCleanupTriggerInPercent ) )", + "( 1.2.840.113556.1.5.186 NAME 'mS-SQL-SQLRepository' SUP top STRUCTURAL MAY (mS-SQL-Name $ mS-SQL-Contact $ mS-SQL-Build $ mS-SQL-Status $ mS-SQL-Version $ mS-SQL-Description $ mS-SQL-InformationDirectory ) )", + "( 2.5.6.8 NAME 'organizationalRole' SUP top STRUCTURAL MUST (cn ) MAY (l $ st $ street $ ou $ postalAddress $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ telexNumber $ teletexTerminalIdentifier $ facsimileTelephoneNumber $ x121Address $ internationalISDNNumber $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ roleOccupant $ seeAlso ) )", + "( 2.5.20.1 NAME 'subSchema' SUP top STRUCTURAL MAY (extendedClassInfo $ extendedAttributeInfo $ dITContentRules $ attributeTypes $ objectClasses $ modifyTimeStamp ) )", + "( 1.2.840.113556.1.5.284 NAME 'msDS-DeviceRegistrationService' SUP top STRUCTURAL MUST (msDS-IsEnabled $ msDS-DeviceLocation ) MAY (msDS-IssuerCertificates $ msDS-RegistrationQuota $ msDS-MaximumRegistrationInactivityPeriod $ msDS-IssuerPublicCertificates $ msDS-CloudIssuerPublicCertificates $ msDS-CloudIsEnabled ) )", + "( 1.2.840.113556.1.5.84 NAME 'displaySpecifier' SUP top STRUCTURAL MAY (iconPath $ creationWizard $ contextMenu $ adminPropertyPages $ shellPropertyPages $ classDisplayName $ adminContextMenu $ shellContextMenu $ attributeDisplayNames $ treatAsLeaf $ createDialog $ createWizardExt $ scopeFlags $ queryFilter $ extraColumns $ adminMultiselectPropertyPages ) )", + "( 1.2.840.113556.1.5.212 NAME 'msWMI-ShadowObject' SUP top STRUCTURAL MUST (msWMI-TargetObject ) )", + "( 1.2.840.113556.1.5.59 NAME 'fileLinkTrackingEntry' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.4.2161 NAME 'msAuthz-CentralAccessPolicies' SUP top STRUCTURAL )", + "( 1.2.840.113556.1.5.161 NAME 'mSMQQueue' SUP top STRUCTURAL MAY (mSMQQueueType $ mSMQJournal $ mSMQBasePriority $ mSMQLabel $ mSMQAuthenticate $ mSMQPrivacyLevel $ mSMQOwnerID $ mSMQTransactional $ mSMQQueueQuota $ mSMQQueueJournalQuota $ mSMQQueueNameExt $ mSMQLabelEx $ MSMQ-SecuredSource $ MSMQ-MulticastAddress ) )", + "( 1.2.840.113556.1.5.193 NAME 'msCOM-Partition' SUP top STRUCTURAL MAY (msCOM-ObjectId ) )", + "( 1.2.840.113556.1.5.118 NAME 'ipsecFilter' SUP ipsecBase STRUCTURAL )", + "( 2.5.6.2 NAME 'country' SUP top STRUCTURAL MUST (c ) MAY (searchGuide $ co ) )", + "( 1.2.840.113556.1.5.97 NAME 'physicalLocation' SUP locality STRUCTURAL MAY (managedBy ) )", + "( 1.2.840.113556.1.3.30 NAME 'computer' SUP user STRUCTURAL MAY (cn $ networkAddress $ localPolicyFlags $ defaultLocalPolicyObject $ machineRole $ location $ netbootInitialization $ netbootGUID $ netbootMachineFilePath $ siteGUID $ operatingSystem $ operatingSystemVersion $ operatingSystemServicePack $ operatingSystemHotfix $ volumeCount $ physicalLocationObject $ dNSHostName $ policyReplicationFlags $ managedBy $ rIDSetReferences $ catalogs $ netbootSIFFile $ netbootMirrorDataFile $ msDS-AdditionalDnsHostName $ msDS-AdditionalSamAccountName $ msDS-ExecuteScriptPassword $ msDS-KrbTgtLink $ msDS-RevealedUsers $ msDS-NeverRevealGroup $ msDS-RevealOnDemandGroup $ msDS-RevealedList $ msDS-AuthenticatedAtDC $ msDS-isGC $ msDS-isRODC $ msDS-SiteName $ msDS-PromotionSettings $ msTPM-OwnerInformation $ msTSProperty01 $ msTSProperty02 $ msDS-IsUserCachableAtRodc $ msDS-HostServiceAccount $ msTSEndpointData $ msTSEndpointType $ msTSEndpointPlugin $ msTSPrimaryDesktopBL $ msTSSecondaryDesktopBL $ msTPM-TpmInformationForComputer $ msDS-GenerationId $ msImaging-ThumbprintHash $ msImaging-HashAlgorithm $ netbootDUID $ msSFU30Name $ msSFU30Aliases $ msSFU30NisDomain $ nisMapName ) )", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' SUP top STRUCTURAL MUST (cn ) MAY (description $ msSFU30Name $ msSFU30NisDomain $ msSFU30NetgroupHostAtDomain $ msSFU30NetgroupUserAtDomain $ memberNisNetgroup $ nisNetgroupTriple $ nisMapName ) )", + "( 1.2.840.113556.1.5.153 NAME 'nTFRSMember' SUP top STRUCTURAL MAY (fRSUpdateTimeout $ fRSServiceCommand $ serverReference $ fRSRootSecurity $ fRSExtensions $ frsComputerReference $ fRSControlDataCreation $ fRSControlInboundBacklog $ fRSControlOutboundBacklog $ fRSFlags $ fRSPartnerAuthLevel ) )", + "( 2.5.6.12 NAME 'applicationEntity' SUP top STRUCTURAL MUST (cn $ presentationAddress ) MAY (l $ o $ ou $ supportedApplicationContext $ seeAlso ) )", + "( 2.5.6.11 NAME 'applicationProcess' SUP top STRUCTURAL MUST (cn ) MAY (l $ ou $ seeAlso ) )", + "( 1.2.840.113556.1.5.279 NAME 'msDS-ValueType' SUP top STRUCTURAL MUST (msDS-ClaimValueType $ msDS-ClaimIsValueSpaceRestricted $ msDS-ClaimIsSingleValued $ msDS-IsPossibleValuesPresent ) )", + "( 1.2.840.113556.1.5.204 NAME 'msWMI-UnknownRangeParam' SUP msWMI-RangeParam STRUCTURAL MUST (msWMI-NormalizedClass $ msWMI-TargetObject ) )", + "( 1.2.840.113556.1.5.66 NAME 'domain' SUP top ABSTRACT MUST (dc ) )", + "( 2.5.6.13 NAME 'dSA' SUP applicationEntity STRUCTURAL MAY (knowledgeInformation ) )", + "( 1.2.840.113556.1.5.120 NAME 'ipsecISAKMPPolicy' SUP ipsecBase STRUCTURAL )" + ], + "objectGUID": [ + { + "encoded": "sr4GScorekOq9Mmm+aY8Ow==", + "encoding": "base64" + } + ], + "systemFlags": [ + "134217728" + ], + "uSNChanged": [ + "5" + ], + "uSNCreated": [ + "5" + ], + "whenChanged": [ + "20130521164433.0Z" + ], + "whenCreated": [ + "20130521164433.0Z" + ] + }, + "schema_entry": "CN=Aggregate,CN=Schema,CN=Configuration,DC=AD2012,DC=LAB", + "type": "SchemaInfo" +} +""" +ad_2012_r2_dsa_info = """ +{ + "raw": { + "configurationNamingContext": [ + "CN=Configuration,DC=AD2012,DC=LAB" + ], + "currentTime": [ + "20141111080100.0Z" + ], + "defaultNamingContext": [ + "DC=AD2012,DC=LAB" + ], + "dnsHostName": [ + "WIN1.AD2012.LAB" + ], + "domainControllerFunctionality": [ + "6" + ], + "domainFunctionality": [ + "6" + ], + "dsServiceName": [ + "CN=NTDS Settings,CN=WIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=AD2012,DC=LAB" + ], + "forestFunctionality": [ + "6" + ], + "highestCommittedUSN": [ + "22591" + ], + "isGlobalCatalogReady": [ + "TRUE" + ], + "isSynchronized": [ + "TRUE" + ], + "ldapServiceName": [ + "AD2012.LAB:win1$@AD2012.LAB" + ], + "namingContexts": [ + "DC=AD2012,DC=LAB", + "CN=Configuration,DC=AD2012,DC=LAB", + "CN=Schema,CN=Configuration,DC=AD2012,DC=LAB", + "DC=DomainDnsZones,DC=AD2012,DC=LAB", + "DC=ForestDnsZones,DC=AD2012,DC=LAB" + ], + "rootDomainNamingContext": [ + "DC=AD2012,DC=LAB" + ], + "schemaNamingContext": [ + "CN=Schema,CN=Configuration,DC=AD2012,DC=LAB" + ], + "serverName": [ + "CN=WIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=AD2012,DC=LAB" + ], + "subschemaSubentry": [ + "CN=Aggregate,CN=Schema,CN=Configuration,DC=AD2012,DC=LAB" + ], + "supportedCapabilities": [ + "1.2.840.113556.1.4.800", + "1.2.840.113556.1.4.1670", + "1.2.840.113556.1.4.1791", + "1.2.840.113556.1.4.1935", + "1.2.840.113556.1.4.2080", + "1.2.840.113556.1.4.2237" + ], + "supportedControl": [ + "1.2.840.113556.1.4.319", + "1.2.840.113556.1.4.801", + "1.2.840.113556.1.4.473", + "1.2.840.113556.1.4.528", + "1.2.840.113556.1.4.417", + "1.2.840.113556.1.4.619", + "1.2.840.113556.1.4.841", + "1.2.840.113556.1.4.529", + "1.2.840.113556.1.4.805", + "1.2.840.113556.1.4.521", + "1.2.840.113556.1.4.970", + "1.2.840.113556.1.4.1338", + "1.2.840.113556.1.4.474", + "1.2.840.113556.1.4.1339", + "1.2.840.113556.1.4.1340", + "1.2.840.113556.1.4.1413", + "2.16.840.1.113730.3.4.9", + "2.16.840.1.113730.3.4.10", + "1.2.840.113556.1.4.1504", + "1.2.840.113556.1.4.1852", + "1.2.840.113556.1.4.802", + "1.2.840.113556.1.4.1907", + "1.2.840.113556.1.4.1948", + "1.2.840.113556.1.4.1974", + "1.2.840.113556.1.4.1341", + "1.2.840.113556.1.4.2026", + "1.2.840.113556.1.4.2064", + "1.2.840.113556.1.4.2065", + "1.2.840.113556.1.4.2066", + "1.2.840.113556.1.4.2090", + "1.2.840.113556.1.4.2205", + "1.2.840.113556.1.4.2204", + "1.2.840.113556.1.4.2206", + "1.2.840.113556.1.4.2211", + "1.2.840.113556.1.4.2239", + "1.2.840.113556.1.4.2255", + "1.2.840.113556.1.4.2256" + ], + "supportedExtension": [ + "1.3.6.1.4.1.1466.20037", + "1.3.6.1.4.1.1466.101.119.1", + "1.2.840.113556.1.4.1781", + "1.3.6.1.4.1.4203.1.11.3", + "1.2.840.113556.1.4.2212" + ], + "supportedLDAPPolicies": [ + "MaxPoolThreads", + "MaxPercentDirSyncRequests", + "MaxDatagramRecv", + "MaxReceiveBuffer", + "InitRecvTimeout", + "MaxConnections", + "MaxConnIdleTime", + "MaxPageSize", + "MaxBatchReturnMessages", + "MaxQueryDuration", + "MaxTempTableSize", + "MaxResultSetSize", + "MinResultSets", + "MaxResultSetsPerConn", + "MaxNotificationPerConn", + "MaxValRange", + "MaxValRangeTransitive", + "ThreadMemoryLimit", + "SystemMemoryLimitPercent" + ], + "supportedLDAPVersion": [ + "3", + "2" + ], + "supportedSASLMechanisms": [ + "GSSAPI", + "GSS-SPNEGO", + "EXTERNAL", + "DIGEST-MD5" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/ds389.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/ds389.py new file mode 100644 index 0000000..f0e19dc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/ds389.py @@ -0,0 +1,1715 @@ +""" +""" + +# Created on 2014.11.11 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +ds389_1_3_3_schema = """ +{ + "raw": { + "aci": [ + "(target=\\"ldap:///cn=schema\\")(targetattr !=\\"aci\\")(version 3.0;acl \\"anonymous, no acis\\"; allow (read, search, compare) userdn = \\"ldap:///anyone\\";)" + ], + "attributeTypes": [ + "( 2.16.840.1.113730.3.1.582 NAME 'nsDS5ReplicaCredentials' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2274 NAME 'nsslapd-instancedir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.532 NAME 'ntUserCountryCode' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1139 NAME 'printer-info' DESC 'Descriptive information about this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' DESC 'LDAP referrals attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'LDAPv3 referrals Internet Draft' )", + "( 1.3.6.1.4.1.13769.2.4 NAME ( 'nsAIMid' 'nscpaimscreenname' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'Mozilla Address Book' )", + "( sslVersionMin-oid NAME 'sslVersionMin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.204 NAME 'replicaNickName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2243 NAME 'nsslapd-securelistenhost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2108 NAME 'nsPagedLookThroughLimit' DESC 'Binder-based simple paged search operation look through limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 1.3.6.1.4.1.6981.11.3.7 NAME 'FTPStatus' DESC 'Account status: enabled or disabled' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2091 NAME 'nsslapd-suffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.5.4.51 NAME 'houseIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( nsUserRDNComponent-oid NAME 'nsUserRDNComponent' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.18.0.2.4.1117 NAME 'printer-media-local-supported' DESC 'Site-specific names of media supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2301 NAME 'nsslapd-plugin-logging' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822mailbox' ) EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 4524' X-DEPRECATED 'rfc822mailbox' )", + "( 2.16.840.1.113730.3.1.607 NAME 'nsDS5Flags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsTaskLabel-oid NAME 'nsTaskLabel' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2068 NAME 'pamExcludeSuffix' DESC 'Suffixes to exclude from PAM authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2157 NAME 'dnaRemoteBindCred' DESC 'Remote bind credentials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsBindDN-oid NAME 'nsBindDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.5.4.18 NAME 'postOfficeBox' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2261 NAME 'nsslapd-attribute-name-exceptions' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.250.1.2 NAME 'multiLineDescription' DESC 'Pilot attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Internet White Pages Pilot' )", + "( 2.16.840.1.113730.3.1.102 NAME ( 'passwordChange' 'pwdAllowUserChange' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.527 NAME 'ntUserLastLogoff' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.21 NAME 'mailQuota' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.482 NAME 'calOtherCalURIs' DESC 'RFC2739: multi-value URI for snapshots of other calendars' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2238 NAME 'nsslapd-security' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.6 NAME 'javaClassName' DESC 'Fully qualified name of distinguished Java class or interface' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.240 NAME 'replicatedattributelist' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2175 NAME 'nsslapd-accesslog-logrotationsync-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsRevisionNumber-oid NAME 'nsRevisionNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2207 NAME 'nsslapd-rootdn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsHelpRef-oid NAME 'nsHelpRef' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.43 NAME 'ntUserDeleteAccount' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.217 NAME 'replicaCFUpdated' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.6 NAME 'targetDn' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.5.4.25 NAME 'internationalISDNNumber' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.998 NAME ( 'passwordGraceUserTime' 'pwdGraceUserTime' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2225 NAME 'nsslapd-workingdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.65 NAME 'ntUserLogonServer' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.781 NAME 'mgrpAddHeader' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2295 NAME 'nsslapd-allowed-sasl-mechanisms' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2162 NAME 'winSyncDirectoryFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1121 NAME 'printer-resolution-supported' DESC 'List of resolutions supported for printing documents by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2139 NAME 'winSyncMoveAction' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsExpirationDate-oid NAME 'nsExpirationDate' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.5923.1.1.1.1 NAME 'eduPersonAffiliation' DESC 'Affiliation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( nsVendor-oid NAME 'nsVendor' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.87 NAME 'cirUpdateSchedule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.32 NAME 'owner' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.253 NAME 'nsValueSyntax' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( nsLdapSchemaVersion-oid NAME 'nsLdapSchemaVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2100 NAME 'autoMemberInclusiveRegex' DESC 'Auto Membership inclusive regex rule' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2089 NAME 'mepMappedAttr' DESC 'Managed Entries mapped attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2212 NAME 'nsslapd-useroc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2282 NAME 'nsslapd-rundir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.3 NAME 'mozillaHomeLocalityName' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.5.4.10 NAME ( 'o' 'organizationname' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'organizationname' )", + "( 2.16.840.1.113730.3.1.2259 NAME 'nsslapd-return-exact-case' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminAccessAddresses-oid NAME 'nsAdminAccessAddresses' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( nsAdminUsers-oid NAME 'nsAdminUsers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.19 NAME 'mailMessageStore' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.221 NAME 'passwordStorageScheme' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2126 NAME 'dnaHostname' DESC 'DNA hostname of replica to get new range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2230 NAME 'nsslapd-ldapiautobind' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2196 NAME 'nsslapd-accesslog-logexpirationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.576 NAME 'nsRoleFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.70 NAME 'serverRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 5.3.6.1.1.1.1.0 NAME 'trustModel' DESC 'Access scheme' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'nss_ldap/pam_ldap' )", + "( 2.16.840.1.113730.3.1.248 NAME 'nsValueDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.1466.101.120.41 NAME 'parentOrganization' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( nsAdminEnableDSGW-oid NAME 'nsAdminEnableDSGW' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.18.0.2.4.1132 NAME 'printer-multiple-document-jobs-supported' DESC 'Indicates whether or not this printer supports more than one document per job.' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.4.1.13769.2.1 NAME ( 'mozillaNickname' 'xmozillanickname' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Mozilla Address Book' )", + "( 2.5.18.2 NAME 'modifyTimestamp' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.92 NAME ( 'passwordExpWarned' 'pwdExpirationWarned' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2246 NAME 'nsslapd-maxdescriptors' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2113 NAME 'internalModifiersName' DESC 'plugin dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2094 NAME 'nsslapd-parent-suffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.692 NAME 'inetUserStatus' DESC '\\"active\\", \\"inactive\\", or \\"deleted\\" status of a user' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1110 NAME 'printer-job-priority-supported' DESC 'Indicates the number of job priority levels supported by this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2183 NAME 'nsslapd-audit-logrotationsyncmin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2304 NAME 'nsslapd-dynamic-plugins' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.789 NAME 'mgrpNoDuplicateChecks' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.602 NAME 'entrydn' DESC 'internal server defined attribute type' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.1098 NAME 'nsds5replicaSessionPauseTime' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2073 NAME 'pamSecure' DESC 'Require secure (TLS/SSL) connection for PAM auth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2264 NAME 'nsslapd-max-filter-nest-level' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.2 NAME 'dITContentRules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.522 NAME 'ntUserComment' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1129 NAME 'printer-color-supported' DESC 'Indicates whether this printer is capable of any type of color printing at all, including highlight color.' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.24 NAME 'mailRoutingAddress' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( nsmsgDisallowAccess-oid NAME 'nsmsgDisallowAccess' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.485 NAME 'calOtherCalAdrURIs' DESC 'RFC2739: multi-value URI to other request destinations' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2131 NAME 'pamFilter' DESC 'Filter to match entries that should use PAM authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.234 NAME 'nsSNMPLocation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.15 NAME 'supportedLDAPVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.5923.1.1.1.9 NAME 'eduPersonScopedAffiliation' DESC 'Scoped Affiliation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( nsHostLocation-oid NAME 'nsHostLocation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.590 NAME 'nsDS5ReplicaName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2178 NAME 'nsslapd-accesslog-logrotationsynchour' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2081 NAME ( 'passwordMaxRepeats' 'pwdMaxRepeats' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.687 NAME 'nsds5replicaChangesSentSinceStartup' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1107 NAME 'printer-xri-supported' DESC 'The unordered list of XRI (extended resource identifiers) supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.46 NAME 'ntGroupDeleteGroup' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.9 NAME 'newRdn' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.2147 NAME 'rootdn-allow-host' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2251 NAME 'nsslapd-accesscontrol' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.11 NAME 'newSuperior' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.229 NAME 'nsslapd-pluginVendor' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2228 NAME 'nsslapd-ldapifilepath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.68 NAME 'ntUserPasswordExpired' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2298 NAME 'nsslapd-enable-turbo-mode' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.585 NAME 'nsDS5ReplicatedAttributeList' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2165 NAME 'schemaUpdateObjectclassAccept' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2277 NAME 'nsslapd-tmpdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1002 NAME 'nsds7NewWinUserSyncEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.23 NAME 'lastModifiedTime' DESC 'old variant of modifyTimestamp' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.110 NAME 'ntGroupId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.535 NAME 'ntUserHomeDirDrive' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.33 NAME 'mgrpModerator' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.207 NAME 'vlvBase' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( nsServerMigrationClassname-oid NAME 'nsServerMigrationClassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsSSLPersonalitySSL-oid NAME 'nsSSLPersonalitySSL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.5.4.35 NAME 'userPassword' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4519' )", + "( 1.3.6.1.1.4 NAME 'vendorName' EQUALITY 1.3.6.1.4.1.1466.109.114.1 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation X-ORIGIN 'RFC 3045' )", + "( 1.3.6.1.4.1.6981.11.3.4 NAME 'FTPDownloadRatio' DESC 'Ratio (compared with FTPRatioUp) for downloaded files' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.801 NAME 'mgrpRemoveHeader' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2215 NAME 'nsslapd-allow-unauthenticated-binds' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1118 NAME 'printer-copies-supported' DESC 'The maximum number of copies of a document that may be printed as a single job on this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.55 NAME 'aci' DESC 'Netscape defined access control information attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2285 NAME 'nsslapd-hash-filters' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.5.4.7 NAME ( 'l' 'locality' 'localityname' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'locality localityname' )", + "( nsSSL3SessionTimeout-oid NAME 'nsSSL3SessionTimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2152 NAME 'nsds5ReplicaProtocolTimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.105 NAME ( 'passwordLockout' 'pwdLockOut' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2129 NAME 'dnaNextRange' DESC 'DNA range of values to get from replica' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsSSL3-oid NAME 'nsSSL3' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2199 NAME 'nsslapd-accesslog-logexpirationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.571 NAME 'nsSizeLimit' DESC 'Binder-based search operation size limit (entries)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.77 NAME 'changeTime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.243 NAME 'nsValueCIS' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.2170 NAME 'nsslapd-accesslog-level' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2202 NAME 'nsslapd-accesslog-logging-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.33 NAME 'automountInformation' DESC 'Information used by the autofs automounter' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'draft-howard-rfc2307bis' )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2798' )", + "( nsCertConfig-oid NAME 'nsCertConfig' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Certificate Management System' )", + "( 2.16.840.1.113730.3.1.99 NAME ( 'passwordMinLength' 'pwdMinLength' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2249 NAME 'nsslapd-idletimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.20 NAME 'telephoneNumber' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2116 NAME 'dnaPrefix' DESC 'DNA string prefix for dna value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2220 NAME 'nsslapd-minssf-exclude-rootdse' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2186 NAME 'nsslapd-auditlog-logrotationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.60 NAME 'ntUserAuthFlags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2290 NAME 'nsslapd-disk-monitoring-threshold' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2076 NAME ( 'passwordMinAlphas' 'pwdMinAlphas' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.406 NAME 'nsSynchUserIDFormat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.5 NAME 'attributeTypes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.18.0.2.4.1122 NAME 'printer-media-supported' DESC 'The standard names/types/sizes (and optional color suffixes) of the media supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( nsAdminEnableEnduser-oid NAME 'nsAdminEnableEnduser' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.1.1.1.26 NAME 'nisMapName' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2134 NAME 'nsds5ReplicaStripAttrs' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.544 NAME 'nsParentUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.5923.1.1.1.4 NAME 'eduPersonOrgUnitDN' DESC 'Organizational Unit DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.82 NAME 'cirBindDn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 X-ORIGIN 'RFC 2798' )", + "( 1.3.6.1.4.1.42.2.27.4.1.13 NAME 'javaClassNames' DESC 'Fully qualified Java class or interface name' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.2103 NAME 'autoMemberDisabled' DESC 'Auto Membership disabled attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.809 NAME 'nsds5replicaLastInitStatus' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2084 NAME 'nsSymmetricKey' DESC 'A symmetric key - currently used by attribute encryption' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-ORIGIN 'attribute encryption' )", + "( 2.16.840.1.113730.3.1.682 NAME 'nsds5ReplicaPurgeDelay' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 X-ORIGIN 'RFC 4524' )", + "( nsTLS1-oid NAME 'nsTLS1' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2063 NAME 'nsEncryptionAlgorithm' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.4 NAME 'mozillaHomeState' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.5.4.13 NAME 'description' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2254 NAME 'nsslapd-pwpolicy-local' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2121 NAME 'dnaScope' DESC 'DNA base DN for finding entries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.14 NAME 'mailAutoReplyMode' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.224 NAME 'nsslapd-pluginPath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.11.1.3.2.1.2 NAME 'acctPolicySubentry' DESC 'Account policy pointer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Account Policy Plugin' )", + "( 2.16.840.1.113730.3.1.2191 NAME 'nsslapd-errorlog-logmaxdiskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2233 NAME 'nsslapd-ldapiuidnumbertype' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.579 NAME 'nsDS5ReplicaPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.610 NAME 'nsAccountLock' DESC 'Operational attribute for Account Inactivation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.707 NAME 'vacationstartdate' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.580 NAME 'nsDS5ReplicaTransportInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2168 NAME 'schemaUpdateAttributeReject' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1137 NAME 'printer-generated-natural-language-supported' DESC 'Natural language(s) supported for this directory entry.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.1005 NAME 'nsds7DirsyncCookie' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.24 NAME 'lastModifiedBy' DESC 'old variant of modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.530 NAME 'ntUserLogonHours' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.36 NAME 'nsLicensedFor' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.202 NAME 'replicaCredentials' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.2.2 NAME ( 'mozillaSecondEmail' 'xmozillasecondemail' ) EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.3023 NAME 'nsViewFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsSSL2Ciphers-oid NAME 'nsSSL2Ciphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsServerAddress-oid NAME 'nsServerAddress' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.91 NAME 'passwordExpirationTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2241 NAME 'nsslapd-errorlog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsProductName-oid NAME 'nsProductName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2027 NAME 'nsruvReplicaLastModified' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.38 NAME 'authorityRevocationList' DESC 'X.509 authority revocation list' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 2.16.840.1.113730.3.1.2097 NAME 'autoMemberScope' DESC 'Auto Membership scope criteria' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.695 NAME 'inetSubscriberChallenge' DESC 'Used to confirm subscriberIdentity. This attribute holds the challenge phrase and is used in conjunction with the inetSubscriberResponse' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.1.2218 NAME 'nsslapd-localssf' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1115 NAME 'printer-stacking-order-supported' DESC 'The possible stacking order of pages as they are printed and ejected from this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.2.840.113556.1.4.479 NAME 'calFBURL' DESC 'RFC2739: URI to the users default freebusy data' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2307 NAME 'nsslapd-allow-hashed-passwords' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.58 NAME 'replicaBindDn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.605 NAME 'entryid' DESC 'internal server defined attribute type' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.2288 NAME 'nsslapd-defaultnamingcontext' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.9 NAME 'mozillaWorkUrl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2155 NAME 'nsds5ReplicaBackoffMax' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2267 NAME 'nsslapd-certmap-basedn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.100 NAME 'passwordKeepHistory' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.525 NAME 'ntUserWorkstations' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.23 NAME 'mgrpAllowedDomain' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.480 NAME 'calCAPURI' DESC 'RFC2739: URI used to communicate with the users calendar' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.237 NAME 'nsSNMPMasterHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsDefaultAcceptLanguage-oid NAME 'nsDefaultAcceptLanguage' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.593 NAME 'nsSNMPName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2205 NAME 'nsslapd-auditlog-logging-hide-unhashed-pw' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1108 NAME 'printer-aliases' DESC 'List of site-specific administrative names of this printer in addition to the value specified for printer-name.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.45 NAME 'ntGroupCreateNewGroup' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.215 NAME 'oid' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2142 NAME 'nsSaslMapPriority' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.2119 NAME 'dnaMagicRegen' DESC 'DNA value that will trigger regeneration of attribute value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.5.4.42 NAME 'givenName' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2189 NAME 'nsslapd-auditlog-logrotationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.67 NAME 'ntUserProfile' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2079 NAME ( 'passwordMinSpecials' 'pwdMinSpecials' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.588 NAME 'nsDS5ReplicaId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2160 NAME 'dnaRemoteBindMethod' DESC 'Remote bind method: SIMPLE, SSL, SASL/DIGEST-MD5, or SASL/GSSAPI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.4.1.13769.4.3 NAME 'mozillaCustom3' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2272 NAME 'nsslapd-plugin-binddn-tracking' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.8 NAME 'matchingRuleUse' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.250.1.57 NAME ( 'labeledURI' 'labeledurl' ) EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2079' X-DEPRECATED 'labeledurl' )", + "( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.89 NAME 'cirSyncInterval' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.251 NAME 'nsValueFlags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.2106 NAME 'nsIDListScanLimit' DESC 'Binder-based search operation ID list scan limit (candidate entries)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 1.3.6.1.4.1.6981.11.3.1 NAME 'FTPQuotaFiles' DESC 'Quota (in number of files) for an FTP user' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.804 NAME 'nsSchemaCSN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsServerSecurity-oid NAME 'nsServerSecurity' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2210 NAME 'nsslapd-auditlog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' X-DEPRECATED 'favouriteDrink' )", + "( 2.16.840.1.113730.3.1.50 NAME 'replicaBeginOrc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2280 NAME 'nsslapd-bakdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.4 NAME ( 'sn' 'surName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'surName' )", + "( 2.16.840.1.113730.3.1.2066 NAME 'nsSaslMapFilterTemplate' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.3.1 NAME 'mozillaHomeStreet' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.198 NAME 'memberURL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.16 NAME 'postalAddress' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.108 NAME 'passwordUnlock' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( nsSSLClientAuth-oid NAME 'nsSSLClientAuth' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2124 NAME 'dnaRemainingValues' DESC 'DNA remaining values left to assign' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2236 NAME 'nsslapd-anonlimitsdn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2194 NAME 'nsslapd-errorlog-logminfreediskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.574 NAME 'nsRole' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminGroupName-oid NAME 'nsAdminGroupName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.72 NAME 'serverVersionNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.246 NAME 'nsValueInt' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.1466.101.120.43 NAME 'preferredTimeZone' DESC 'preferred time zone for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2173 NAME 'nsslapd-errorlog-maxlogsize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1130 NAME 'printer-document-format-supported' DESC 'The possible source document formats which may be interpreted and printed by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.552 NAME 'costargettree' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.94 NAME 'retryCountResetTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 X-ORIGIN 'RFC 4519' X-DEPRECATED 'fax' )", + "( 2.16.840.1.113730.3.1.2244 NAME 'nnslapd-threadnumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.2.840.113556.1.2.102 NAME 'memberOf' DESC 'Group that the entry belongs to' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Delegated Administrator' )", + "( 2.16.840.1.113730.3.1.2111 NAME 'tombstoneNumSubordinates' DESC 'count of immediate subordinates for tombstone entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN '389 directory server' )", + "( nsDirectoryURL-oid NAME 'nsDirectoryURL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.690 NAME 'inetDomainBaseDN' DESC 'Base DN of user subtree for a DNS domain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.1.2223 NAME 'nsslapd-localhost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2181 NAME 'nsslapd-accesslog-logrotationsyncmin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.569 NAME 'cosPriority' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsOsVersion-oid NAME 'nsOsVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsJarfilename-oid NAME 'nsJarfilename' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2293 NAME 'nsslapd-ndn-cache-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2071 NAME 'pamIDAttr' DESC 'Name of attribute holding PAM ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2158 NAME 'dnaRemoteBindDN' DESC 'Remote bind DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.18.0.2.4.1127 NAME 'printer-pages-per-minute' DESC 'The nominal number of pages per minute which may be output by this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 0.9.2342.19200300.100.1.54 NAME 'ditRedirect' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.520 NAME 'nswmExtendedUserPrefs' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.26 NAME 'mgrpErrorsTo' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.3.6.1.4.1.4203.1.3.5 NAME 'supportedFeatures' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.232 NAME 'nsSNMPEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2137 NAME 'nsds5ReplicaAbortCleanRUV' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.17 NAME 'ldapSchemas' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 2927' )", + "( 1.3.6.1.4.1.5923.1.1.1.7 NAME 'eduPersonEntitlement' DESC 'Entitlement' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.81 NAME 'cirPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.6981.11.3.9 NAME 'FTPgid' DESC 'System uid (overrides gidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2087 NAME 'mepManagedEntry' DESC 'Managed Entries pointer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.685 NAME 'nsds5replicaLastUpdateStart' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminSIEDN-oid NAME 'nsAdminSIEDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2208 NAME 'nsslapd-rootdnpw' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.48 NAME 'replicaPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.210 NAME 'vlvSort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2145 NAME 'rootdn-close-time' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2257 NAME 'nsslapd-accesslog-logbuffering' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlycountryname' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' X-DEPRECATED 'friendlycountryname' )", + "( 2.16.840.1.113730.3.1.13 NAME 'mailAlternateAddress' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.227 NAME 'nsslapd-pluginId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.613 NAME 'copiedFrom' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsServerPort-oid NAME 'nsServerPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.42.2.27.4.1.8 NAME 'javaSerializedData' DESC 'Serialized form of a Java object' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.583 NAME 'nsDS5ReplicaBindMethod' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2275 NAME 'nsslapd-schemadir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsSSLActivation-oid NAME 'nsSSLActivation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.1000 NAME 'nsds7WindowsReplicaSubtree' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.533 NAME 'ntUserCodePage' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1138 NAME 'printer-make-and-model' DESC 'Make and model of this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.35 NAME 'changeLog' DESC 'the distinguished name of the entry which contains the set of entries comprising this servers changelog' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.205 NAME 'changeLogMaximumConcurrentWrites' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsDirectoryInfoRef-oid NAME 'nsDirectoryInfoRef' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.6981.11.3.6 NAME 'FTPDownloadBandwidth' DESC 'Bandwidth (in KB/s) to limit download speeds to' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2109 NAME 'nsPagedIDListScanLimit' DESC 'Binder-based simple paged search operation ID list scan limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 2.16.840.1.113730.3.1.2092 NAME 'nsslapd-ldapiautodnsuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'X.509 supported algorithms' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 1.3.18.0.2.4.1116 NAME 'printer-output-features-supported' DESC 'The possible output features supported by this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2302 NAME 'nsslapd-listen-backlog-size' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.57 NAME 'replicaRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.608 NAME 'nsDS5Task' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.9 NAME ( 'street' 'streetaddress' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'streetaddress' )", + "( 2.16.840.1.113730.3.1.2069 NAME 'pamMissingSuffix' DESC 'How to handle missing include or exclude suffixes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2150 NAME 'rootdn-deny-ip' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsGroupRDNComponent-oid NAME 'nsGroupRDNComponent' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2262 NAME 'nsslapd-maxbersize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.528 NAME 'ntUserAcctExpires' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.103 NAME ( 'passwordCheckSyntax' 'pwdCheckSyntax' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 1.2.840.113556.1.4.483 NAME 'calOtherFBURLs' DESC 'RFC2739: multi-value URI for other free/busy data' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2239 NAME 'nsslapd-SSL3ciphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.79 NAME 'cirReplicaRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'preferred name of a person to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2798' )", + "( nsProductVersion-oid NAME 'nsProductVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2176 NAME 'nsslapd-errorlog-logrotationsync-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2200 NAME 'nsslapd-errorlog-logexpirationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'signed message used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'RFC 2798' )", + "( nsSecureServerPort-oid NAME 'nsSecureServerPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.218 NAME 'replicaAbandonedChanges' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.7 NAME 'changeType' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.5.4.26 NAME 'registeredAddress' SUP postalAddress EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.999 NAME ( 'passwordGraceLimit' 'pwdGraceLoginLimit' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2114 NAME 'internalCreatorsName' DESC 'plugin dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN '389 Directory Server' )", + "( nsBindPassword-oid NAME 'nsBindPassword' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.812 NAME 'netscapeReversiblePassword' DESC 'password for HTTP Digest/MD5 authentication' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'Netscape Web Server' )", + "( 2.16.840.1.113730.3.1.2226 NAME 'nsslapd-listenhost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.6 NAME 'shadowMin' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2184 NAME 'nsslapd-accesslog-logrotationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.62 NAME 'ntUserParms' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2296 NAME 'nsslapd-ignore-virtual-attrs' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2074 NAME 'pamService' DESC 'Service name to pass to pam_start' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2163 NAME 'winSyncWindowsFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.4.4 NAME 'mozillaCustom4' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 1.3.18.0.2.4.1120 NAME 'printer-print-quality-supported' DESC 'List of print qualities supported for printing documents on this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.4.1.5923.1.1.1.2 NAME 'eduPersonNickName' DESC 'NickName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.542 NAME 'nsUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.84 NAME 'cirUseSsl' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.33 NAME 'roleOccupant' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( nsServerID-oid NAME 'nsServerID' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.254 NAME 'nsValueHelpURL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.807 NAME 'nsds5replicaLastInitStart' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2101 NAME 'autoMemberDefaultGroup' DESC 'Auto Membership default group' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2213 NAME 'nsslapd-userat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2283 NAME 'nsslapd-SSLclientAuth' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.8 NAME 'userClass' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.5.4.1 NAME 'aliasedObjectName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.13769.3.2 NAME 'mozillaHomeStreet2' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2148 NAME 'rootdn-deny-host' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'organizationalUnitName' )", + "( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.16 NAME 'mailDeliveryOption' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2127 NAME 'dnaPortNum' DESC 'DNA port number of replica to get new range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.222 NAME ( 'passwordMinAge' 'pwdMinAge' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113719.1.1.4.1.35 NAME 'lastLoginTime' DESC 'Last login time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Account Policy Plugin' )", + "( 2.16.840.1.113730.3.1.2231 NAME 'nsslapd-ldapimaprootdn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2197 NAME 'nsslapd-errorlog-logexpirationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.577 NAME 'cosIndirectSpecifier' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.71 NAME 'serverProductName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 5.3.6.1.1.1.1.1 NAME 'accessTo' DESC 'Access to which servers user is allowed' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'nss_ldap/pam_ldap' )", + "( 2.16.840.1.113730.3.1.249 NAME 'nsValueType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2278 NAME 'nsslapd-certdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1135 NAME 'printer-name' DESC 'The site-specific administrative name of this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.38 NAME 'nsLicenseEndTime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.200 NAME 'changeLogMaximumAge' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.18.3 NAME 'creatorsName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.93 NAME 'passwordRetryCount' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2247 NAME 'nsslapd-conntablesize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2095 NAME 'connection' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( nsSuiteSpotUser-oid NAME 'nsSuiteSpotUser' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.693 NAME 'inetUserHttpURL' DESC 'A users Web addresses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1113 NAME 'printer-service-person' DESC 'The identity of the current human service person responsible for servicing this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2305 NAME 'nsslapd-moddn-aci' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.603 NAME 'dncomp' DESC 'internal server defined attribute type' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.1099 NAME 'winSyncInterval' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsBaseDN-oid NAME 'nsBaseDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2265 NAME 'nsslapd-versionstring' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.523 NAME 'ntUserFlags' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1128 NAME 'printer-compression-supported' DESC 'Compression algorithms supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2132 NAME 'nsds5ReplicaEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsExecRef-oid NAME 'nsExecRef' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.25 NAME 'mgrpDeliverTo' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.235 NAME 'nsSNMPContact' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.591 NAME 'nsDS5ReplicaReferral' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2179 NAME 'nsslapd-errorlog-logrotationsynchour' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2082 NAME ( 'passwordMinCategories' 'pwdMinCategories' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.688 NAME 'nsds5replicaLastUpdateStatus' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.213 NAME 'vlvEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2140 NAME 'passwordTrackUpdateTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2252 NAME 'nsslapd-groupevalnestlevel' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2229 NAME 'nsslapd-ldapilisten' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.40 NAME 'crossCertificatePair' DESC 'X.509 cross certificate pair' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.69 NAME 'subtreeACI' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server 1.0' )", + "( 2.16.840.1.113730.3.1.2299 NAME 'nsslapd-connection-buffer' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2166 NAME 'schemaUpdateObjectclassReject' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.586 NAME 'nsDS5ReplicaUpdateSchedule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.4.1 NAME 'mozillaCustom1' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2270 NAME 'nsslapd-auditlog-list' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1003 NAME 'nsds7NewWinGroupSyncEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.111 NAME 'ntUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.536 NAME 'ntGroupAttributes' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.30 NAME 'mgrpRFC822MailMember' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.208 NAME 'vlvScope' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( nsNickName-oid NAME 'nsNickName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.5.4.36 NAME 'userCertificate' DESC 'X.509 user certificate' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 2.16.840.1.113730.3.1.2104 NAME 'nsslapd-pluginConfigArea' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.5 NAME 'vendorVersion' EQUALITY 1.3.6.1.4.1.1466.109.114.1 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation X-ORIGIN 'RFC 3045' )", + "( 1.3.6.1.4.1.6981.11.3.3 NAME 'FTPUploadRatio' DESC 'Ratio (compared with FTPRatioDown) for uploaded files' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.802 NAME 'nsds5ReplicaLegacyConsumer' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2216 NAME 'nsslapd-require-secure-binds' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsKeyfile-oid NAME 'nsKeyfile' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.52 NAME 'replicaUpdateSchedule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 X-ORIGIN 'RFC 1274' )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE X-ORIGIN 'RFC 4519' X-DEPRECATED 'countryName' )", + "( 2.16.840.1.113730.3.1.2064 NAME 'nsSaslMapRegexString' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2286 NAME 'nsslapd-outbound-ldap-io-timeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2153 NAME ( 'passwordAdminDN' 'pwdAdminDN' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.106 NAME ( 'passwordMaxFailure' 'pwdMaxFailure' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2234 NAME 'nsslapd-ldapigidnumbertype' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.572 NAME 'nsTimeLimit' DESC 'Binder-based search operation time limit (seconds)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.74 NAME 'administratorContactInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( nsClassname-oid NAME 'nsClassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.244 NAME 'nsValueCES' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.5322.17.2.1 NAME 'authorizedService' DESC 'IANA GSS-API authorized service name' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'NSS LDAP schema' )", + "( 2.16.840.1.113730.3.1.2171 NAME 'nsslapd-accesslog-maxlogsperdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2203 NAME 'nsslapd-errorlog-logging-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsDeleteclassname-oid NAME 'nsDeleteclassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( nsmsgNumMsgQuota-oid NAME 'nsmsgNumMsgQuota' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( nsAdminCgiWaitPid-oid NAME 'nsAdminCgiWaitPid' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.550 NAME 'cosAttribute' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.96 NAME ( 'passwordHistory' 'pwdHistory' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2117 NAME 'dnaNextValue' DESC 'DNA next available value for assignment' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2098 NAME 'autoMemberFilter' DESC 'Auto Membership filter criteria' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2187 NAME 'nsslapd-accesslog-logrotationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2221 NAME 'nsslapd-validate-cert' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2308 NAME 'nstombstonecsn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.61 NAME 'ntUserUsrComment' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2291 NAME 'nsslapd-disk-monitoring-grace-period' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2077 NAME ( 'passwordMinUppers' 'pwdMinUppers' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.407 NAME 'nsSynchUniqueAttribute' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2268 NAME 'nsslapd-accesslog-list' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1125 NAME 'printer-finishings-supported' DESC 'The possible finishing operations supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.5.21.6 NAME 'objectClasses' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.28 NAME 'mgrpMsgRejectAction' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.230 NAME 'nsslapd-pluginDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2135 NAME 'nsds5ReplicaCleanRUV' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminCacheLifetime-oid NAME 'nsAdminCacheLifetime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.327 NAME 'nsIndexType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.545 NAME 'nscpEntryDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.5923.1.1.1.5 NAME 'eduPersonPrimaryAffiliation' DESC 'Primary Affiliation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.83 NAME 'cirUsePersistentSearch' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.10 NAME 'javaFactory' DESC 'Fully qualified Java class name of a JNDI object factory' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2713' )", + "( 2.5.18.10 NAME 'subschemaSubentry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.2085 NAME 'isReplicated' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.683 NAME 'nsds5ReplicaTombstonePurgeInterval' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.1100 NAME 'oneWaySync' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsConfigRoot-oid NAME 'nsConfigRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.13769.3.7 NAME 'mozillaHomeUrl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2255 NAME 'passwordIsGlobalPolicy' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4524' X-DEPRECATED 'mobileTelephoneNumber' )", + "( 2.16.840.1.113730.3.1.2122 NAME 'dnaMaxValue' DESC 'DNA maximum value to assign' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsAdminDomainName-oid NAME 'nsAdminDomainName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.15 NAME 'mailAutoReplyText' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.225 NAME 'nsslapd-pluginInitfunc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminEndUserHTMLIndex-oid NAME 'nsAdminEndUserHTMLIndex' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.11.1.3.2.1.3 NAME 'accountInactivityLimit' DESC 'Account inactivity limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Account Policy Plugin' )", + "( 2.16.840.1.113730.3.1.2192 NAME 'nsslapd-auditlog-logmaxdiskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsBuildSecurity-oid NAME 'nsBuildSecurity' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.708 NAME 'vacationenddate' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.581 NAME 'nsDS5ReplicaBindDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2169 NAME 'nsslapd-pagedsizelimit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( mgrpApprovePassword-oid NAME 'mgrpApprovePassword' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.3.18.0.2.4.1136 NAME 'printer-location' DESC 'The physical location of this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.531 NAME 'ntUserBadPwCount' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.37 NAME 'nsLicenseStartTime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.203 NAME 'replicaEntryFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2242 NAME 'nsslapd-securePort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.39 NAME 'certificateRevocationList' DESC 'X.509 certificate revocation list' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( nsAdminAccountInfo-oid NAME 'nsAdminAccountInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2090 NAME 'mepRDNAttr' DESC 'Managed Entries RDN attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.696 NAME 'inetSubscriberResponse' DESC 'Used to confirm subscriberIdentity. This attribute holds the response phrase and is used in conjunction with the inetSubscriberChallenge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.5.4.50 NAME 'uniqueMember' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2219 NAME 'nsslapd-minssf' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1114 NAME 'printer-delivery-orientation-supported' DESC 'The possible delivery orientations of pages as they are printed and ejected from this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.4.1.250.1.60 NAME ( 'ttl' 'timeToLive' ) DESC 'time to live in seconds for cached objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'LDAP Caching Internet Draft' )", + "( 2.16.840.1.113730.3.1.2300 NAME 'nsslapd-connection-nocanon' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.59 NAME 'ntUserPriv' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2289 NAME 'nsslapd-disk-monitoring' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsDefaultObjectClass-oid NAME 'nsDefaultObjectClass' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.13769.3.8 NAME 'mozillaWorkStreet2' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2156 NAME 'nsslapd-sasl-max-buffer-size' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2260 NAME 'nsslapd-result-tweak' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.101 NAME ( 'passwordInHistory' 'pwdInHistory' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.526 NAME 'ntUserLastLogon' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.20 NAME 'mailProgramDeliveryInfo' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 1.2.840.113556.1.4.481 NAME 'calCalAdrURI' DESC 'RFC2739: URI for event equests destination' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.238 NAME 'nsSNMPMasterPort' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an integer to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'SUDO' )", + "( 1.3.6.1.4.1.42.2.27.4.1.7 NAME 'javaCodebase' DESC 'URL(s) specifying the location of class definition' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.594 NAME 'nsDS5ReplicatedAttributeListTotal' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2174 NAME 'nsslapd-auditlog-maxlogsize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2206 NAME 'nsslapd-unhashed-pw-switch' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.42 NAME 'ntUserCreateNewAccount' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'PKCS #12 PFX PDU for exchange of personal identity information' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.2143 NAME 'nsslapd-sasl-mapping-fallback' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.5 NAME 'changeNumber' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.5.18.9 NAME 'hasSubordinates' DESC 'if TRUE, subordinate entries may exist' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'numSubordinates Internet Draft' )", + "( 2.5.4.24 NAME 'x121Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.997 NAME 'pwdpolicysubentry' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.43 NAME 'initials' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2224 NAME 'nsslapd-port' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.64 NAME 'ntUserNumLogons' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2294 NAME 'nsslapd-ndn-cache-max-size' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2161 NAME 'nsIndexIDListScanLimit' DESC 'fine grained idlistscanlimit - per index/type/value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.589 NAME 'nsDS5ReplicaType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.4.2 NAME 'mozillaCustom2' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Start of time interval for which the entry is valid' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2273 NAME 'nsslapd-config' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.9 NAME 'structuralObjectClass' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( nsDisplayName-oid NAME 'nsDisplayName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2138 NAME 'nsslapd-readonly' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.86 NAME 'cirLastUpdateApplied' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.31 NAME 'member' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( sslVersionMax-oid NAME 'sslVersionMax' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.252 NAME 'nsValueDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.1.2107 NAME 'nsPagedSizeLimit' DESC 'Binder-based simple paged search operation size limit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389' )", + "( 2.16.840.1.113730.3.1.805 NAME 'nsds5replicaTimeout' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2088 NAME 'mepStaticAttr' DESC 'Managed Entries static attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2211 NAME 'nsslapd-dynamicconf' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.51 NAME 'replicaUpdateReplayed' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2281 NAME 'nsslapd-saslpath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'commonName' )", + "( 2.16.840.1.113730.3.1.2067 NAME 'pamIncludeSuffix' DESC 'Suffixes to include for PAM authentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.199 NAME 'memberCertificateDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.2312.4.3.3.1 NAME 'sabayonProfileURL' DESC 'The URL of a sabayon profile' SUP labeledURI EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Sabayon' )", + "( 2.5.4.17 NAME 'postalCode' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2258 NAME 'nsslapd-csnlogging' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsSSL2-oid NAME 'nsSSL2' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.109 NAME ( 'passwordLockoutDuration' 'pwdLockoutDuration' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.18 NAME 'mailHost' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.220 NAME ( 'passwordMustChange' 'pwdMustChange' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2125 NAME 'dnaThreshold' DESC 'DNA threshold for getting next range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2237 NAME 'nsslapd-counters' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2195 NAME 'nsslapd-auditlog-logminfreediskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.575 NAME 'nsRoleDN' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.73 NAME 'installationTimeStamp' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.247 NAME 'nsValueBin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 1.3.18.0.2.4.1133 NAME 'printer-ipp-versions-supported' DESC 'IPP protocol version(s) that this printer supports.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.5.18.1 NAME 'createTimestamp' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.553 NAME 'costemplatedn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.95 NAME 'accountUnlockTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2245 NAME 'nsslapd-maxthreadsperconn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2112 NAME 'ntGroupType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.691 NAME 'inetDomainStatus' DESC '\\"active\\", \\"inactive\\", or \\"deleted\\" status of a domain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1111 NAME 'printer-job-k-octets-supported' DESC 'The maximum size in kilobytes (1,024 octets actually) incoming print job that this printer will accept.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2182 NAME 'nsslapd-errorlog-logrotationsyncmin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.788 NAME 'mgrpBroadcasterPolicy' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.601 NAME 'adminRole' DESC 'Administrative role' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Delegated Administrator' )", + "( 2.16.840.1.113730.3.1.2072 NAME 'pamFallback' DESC 'Fallback to regular LDAP BIND if PAM auth fails' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.2159 NAME 'dnaRemoteConnProtocol' DESC 'Connection protocol: LDAP, TLS, or SSL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsLogSuppress-oid NAME 'nsLogSuppress' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.5.21.1 NAME 'dITStructureRules' EQUALITY integerFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.521 NAME 'ntUserHomeDir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 1.3.18.0.2.4.1126 NAME 'printer-pages-per-minute-color' DESC 'The nominal number of color pages per minute which may be output by this printer.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 1.2.840.113556.1.4.484 NAME 'calOtherCAPURIs' DESC 'RFC2739: multi-value URI to other calendars' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.2130 NAME 'dnaRangeRequestTimeout' DESC 'DNA timeout for querying replica for next range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.233 NAME 'nsSNMPOrganization' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.14 NAME 'supportedSASLMechanisms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.5923.1.1.1.8 NAME 'eduPersonPrimaryOrgUnitDN' DESC 'Primary Organizational Unit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( nsHardwarePlatform-oid NAME 'nsHardwarePlatform' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.6981.11.3.8 NAME 'FTPuid' DESC 'System uid (overrides uidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.686 NAME 'nsds5replicaLastUpdateEnd' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2080 NAME ( 'passwordMin8bit' 'pwdMin8bit' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2209 NAME 'nsslapd-rootpwstoragescheme' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.49 NAME 'replicaUpdateFailedAt' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.8 NAME 'changes' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.2146 NAME 'rootdn-days-allowed' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2250 NAME 'nsslapd-ioblocktimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.7 NAME 'supportedExtension' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4524' X-DEPRECATED 'pagerTelephoneNumber' )", + "( 2.16.840.1.113730.3.1.10 NAME 'deleteOldRdn' DESC 'Changelog attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.1.228 NAME 'nsslapd-pluginVersion' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.46 NAME 'dnQualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.614 NAME 'copyingFrom' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsSSLToken-oid NAME 'nsSSLToken' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.584 NAME 'nsDS5ReplicaRoot' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2164 NAME 'winSyncSubtreePair' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2276 NAME 'nsslapd-lockdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1001 NAME 'nsds7DirectoryReplicaSubtree' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.534 NAME 'ntUserPrimaryGroupId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'RFC 4524' X-DEPRECATED 'homeTelephoneNumber' )", + "( 2.16.840.1.113730.3.1.32 NAME 'mgrpMsgMaxSize' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.206 NAME 'filterInfo' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1140 NAME 'printer-uri' DESC 'A URI supported by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.5.4.34 NAME 'seeAlso' SUP distinguishedName EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' )", + "( nsSSL3Ciphers-oid NAME 'nsSSL3Ciphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.6981.11.3.5 NAME 'FTPUploadBandwidth' DESC 'Bandwidth (in KB/s) to limit upload speeds to' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.2093 NAME 'nsslapd-changelogsuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2214 NAME 'nsslapd-svrtab' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.53 NAME 'deltaRevocationList' DESC 'X.509 delta revocation list' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( nsUniqueAttribute-oid NAME 'nsUniqueAttribute' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.18.0.2.4.1119 NAME 'printer-natural-language-configured' DESC 'The configured natural language in which error and status messages will be generated (by default) by this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2303 NAME 'nsslapd-ignore-time-skew' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.54 NAME 'replicaUseSSL' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'userid' )", + "( 2.16.840.1.113730.3.1.609 NAME 'nsds5BeginReplicaRefresh' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2284 NAME 'nsslapd-ssl-check-hostname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' X-DEPRECATED 'stateOrProvinceName' )", + "( 2.16.840.1.113730.3.1.1097 NAME 'nsds5replicaBusyWaitTime' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2151 NAME 'nsslapd-plugin-depends-on-type' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsViewConfiguration-oid NAME 'nsViewConfiguration' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2263 NAME 'nsslapd-maxsasliosize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.529 NAME 'ntUserMaxStorage' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.104 NAME ( 'passwordWarning' 'pwdExpireWarning' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.12 NAME 'memberUid' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2307' )", + "( nsAccessLog-oid NAME 'nsAccessLog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2128 NAME 'dnaSecurePortNum' DESC 'DNA secure port number of replica to get new range of values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( nsPidLog-oid NAME 'nsPidLog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2198 NAME 'nsslapd-auditlog-logexpirationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.570 NAME 'nsLookThroughLimit' DESC 'Binder-based search operation look through limit (candidate entries)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( nsCertfile-oid NAME 'nsCertfile' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.76 NAME 'serverHostName' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.242 NAME 'nsSystemIndex' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2177 NAME 'nsslapd-auditlog-logrotationsync-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2201 NAME 'nsslapd-auditlog-logexpirationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsServerCreationClassname-oid NAME 'nsServerCreationClassname' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.41 NAME 'ntUserDomainId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.219 NAME 'vlvUses' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.973 NAME 'nsds5ReplConflict' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.18.4 NAME 'modifiersName' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.98 NAME 'passwordExp' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.27 NAME 'destinationIndicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2248 NAME 'nsslapd-reservedescriptors' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2115 NAME 'dnaType' DESC 'DNA attribute type to maintain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.2227 NAME 'nsslapd-snmp-index' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.7 NAME 'shadowMax' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2185 NAME 'nsslapd-errorlog-logrotationtime' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.63 NAME 'ntUserUnitsPerWeek' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2297 NAME 'nsslapd-search-return-original-type-switch' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2075 NAME ( 'passwordMinDigits' 'pwdMinDigits' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.4 NAME 'matchingRules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.18.0.2.4.1123 NAME 'printer-sides-supported' DESC 'The number of impression sides (one or two) and the two-sided impression rotations supported by this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.4.1.5923.1.1.1.3 NAME 'eduPersonOrgDN' DESC 'Organization DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.543 NAME 'nsState' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.85 NAME 'cirBindCredentials' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.12 NAME 'javaDoc' DESC 'The Java documentation for the class' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.2102 NAME 'autoMemberGroupingAttr' DESC 'Auto Membership grouping attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.808 NAME 'nsds5replicaLastInitEnd' DESC 'Netscape defined attribute type' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( nsUserIDFormat-oid NAME 'nsUserIDFormat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 0.9.2342.19200300.100.1.9 NAME 'host' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.5.4.0 NAME 'objectClass' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 X-ORIGIN 'RFC 4512' )", + "( nsAdminOneACLDir-oid NAME 'nsAdminOneACLDir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( nsBuildNumber-oid NAME 'nsBuildNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.13769.3.5 NAME 'mozillaHomePostalCode' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2149 NAME 'rootdn-allow-ip' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.2312.4.3.3.2 NAME 'sabayonProfileName' DESC 'The Name of a sabayon profile' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Sabayon' )", + "( 2.5.4.12 NAME 'title' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.17 NAME 'mailForwardingAddress' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.2120 NAME 'dnaFilter' DESC 'DNA filter for finding entries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.223 NAME ( 'passwordResetFailureCount' 'pwdFailureCountInterval' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.49 NAME ( 'distinguishedName' 'dn' ) EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4519' X-DEPRECATED 'dn' )", + "( 2.16.840.1.113730.3.1.578 NAME 'nsDS5ReplicaHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2190 NAME 'nsslapd-accesslog-logmaxdiskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2232 NAME 'nsslapd-ldapimaptoentries' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.21.10 NAME 'governingStructureRule' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'SUDO' )", + "( 2.16.840.1.113730.3.1.2279 NAME 'nsslapd-ldifdir' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1134 NAME 'printer-more-info' DESC 'A URI for more information about this specific printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domaincomponent' ) EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'RFC 4519' X-DEPRECATED 'domaincomponent' )", + "( 2.16.840.1.113730.3.1.1004 NAME 'nsds7WindowsDomain' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.201 NAME 'changeLogMaximumSize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.13769.2.3 NAME ( 'mozillaUseHtmlMail' 'xmozillausehtmlmail' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( nsSerialNumber-oid NAME 'nsSerialNumber' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.90 NAME 'cirBeginORC' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2240 NAME 'nsslapd-accesslog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2096 NAME 'entryusn' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.694 NAME 'inetSubscriberAccountId' DESC 'A unique attribute linking the subscriber to a billing system' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.18.0.2.4.1112 NAME 'printer-current-operator' DESC 'The identity of the current human operator responsible for operating this printer.' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.2306 NAME 'nsslapd-return-default-opattr' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 1.2.840.113556.1.4.478 NAME 'calCalURI' DESC 'RFC2739: URI of entire default calendar' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'rfc2739' )", + "( 2.16.840.1.113730.3.1.604 NAME 'parentid' DESC 'internal server defined attribute type' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113730.3.1.2154 NAME 'nsds5ReplicaBackoffMin' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2266 NAME 'nsslapd-enquote-sup-oc' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.524 NAME 'ntUserScriptPath' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2133 NAME 'pwdUpdateTime' DESC 'Last password update time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.22 NAME 'mgrpAllowedBroadcaster' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.236 NAME 'nsSNMPDescription' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.13 NAME 'supportedControl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( nsPreference-oid NAME 'nsPreference' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.592 NAME 'nsDS5ReplicaAutoReferral' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2083 NAME ( 'passwordMinTokenLength' 'pwdMinTokenLength' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.689 NAME 'nsds5replicaUpdateInProgress' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2204 NAME 'nsslapd-auditlog-logging-enabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1109 NAME 'printer-charset-configured' DESC 'The configured charset in which error and status messages will be generated (by default) by this printer.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.44 NAME 'ntGroupDomainId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.214 NAME 'passwordAllowChangeTime' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2141 NAME 'dsOnlyMemberUid' DESC 'Elements from a memberuid attribute created to reflect dynamic group membership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Red Hat Directory Server' )", + "( nsDirectoryFailoverList-oid NAME 'nsDirectoryFailoverList' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape' )", + "( nsSSLSessionTimeout-oid NAME 'nsSSLSessionTimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2253 NAME 'nsslapd-nagle' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2118 NAME 'dnaInterval' DESC 'DNA interval between values' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.5.4.41 NAME 'name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2188 NAME 'nsslapd-errorlog-logrotationtimeunit' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.66 NAME 'ntUserUniqueId' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.1.2078 NAME ( 'passwordMinLowers' 'pwdMinLowers' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.587 NAME 'nsds50ruv' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2167 NAME 'schemaUpdateAttributeAccept' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2271 NAME 'nsslapd-rewrite-rfc1274' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.31 NAME 'mailEnhancedUniqueMember' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.209 NAME 'vlvFilter' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )", + "( nsErrorLog-oid NAME 'nsErrorLog' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.88 NAME 'cirUpdateFailedat' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.250 NAME 'nsValueDefault' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape servers - value item' )", + "( 2.5.4.37 NAME 'cACertificate' DESC 'X.509 CA certificate' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 4523' )", + "( 2.16.840.1.113730.3.1.2105 NAME 'autoMemberTargetGroup' DESC 'Auto Membership target group' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.4.1.6981.11.3.2 NAME 'FTPQuotaMBytes' DESC 'Quota (in megabytes) for an FTP user' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Pure-FTPd' )", + "( 2.16.840.1.113730.3.1.803 NAME 'nsBackendSuffix' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2217 NAME 'nsslapd-allow-anonymous-access' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.53 NAME 'replicaBindMethod' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.4 NAME 'info' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.2065 NAME 'nsSaslMapBaseDNTemplate' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsSSLSupportedCiphers-oid NAME 'nsSSLSupportedCiphers' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.2287 NAME 'nsslapd-force-sasl-external' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.5 NAME 'serialNumber' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.197 NAME 'replicaHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.15 NAME 'businessCategory' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.107 NAME 'passwordResetDuration' DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 0.9.2342.19200300.100.1.48 NAME 'buildingName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2235 NAME 'nsslapd-ldapientrysearchbase' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( nsInstalledLocation-oid NAME 'nsInstalledLocation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.1.573 NAME 'nsIdleTimeout' DESC 'Binder-based connection idle timeout (seconds)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.75 NAME 'adminUrl' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.245 NAME 'nsValueTel' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 X-ORIGIN 'Netscape servers - value item' )", + "( 1.3.6.1.4.1.1466.101.120.42 NAME 'preferredLocale' DESC 'preferred locale for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape' )", + "( nsNYR-oid NAME 'nsNYR' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.1.2172 NAME 'nsslapd-accesslog-maxlogsize' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1131 NAME 'printer-charset-supported' DESC 'Set of charsets supported for the attribute values of syntax DirectoryString for this directory entry.' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'rfc3712' )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.1.551 NAME 'cosspecifier' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.97 NAME ( 'passwordMaxAge' 'pwdMaxAge' ) DESC 'Netscape defined password policy attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2099 NAME 'autoMemberExclusiveRegex' DESC 'Auto Membership exclusive regex rule' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'Standard LDAP attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.1.2180 NAME 'nsslapd-auditlog-logrotationsynchour' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2222 NAME 'nsslapd-localuser' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2309 NAME 'nsds5ReplicaPreciseTombstonePurging' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2292 NAME 'nsslapd-disk-monitoring-logging-critical' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2070 NAME 'pamIDMapMethod' DESC 'How to map BIND DN to PAM identity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.1.408 NAME 'replicaLastRelevantChange' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2269 NAME 'nsslapd-errorlog-list' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.18.0.2.4.1124 NAME 'printer-number-up-supported' DESC 'The possible numbers of print-stream pages to impose upon a single side of an instance of a selected medium.' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'rfc3712' )", + "( 2.5.21.7 NAME 'nameForms' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'RFC 1274' )", + "( 2.16.840.1.113730.3.1.29 NAME 'mgrpMsgRejectText' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.231 NAME 'nsslapd-pluginEnabled' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2136 NAME 'nsds5ReplicaCleanRUVNotified' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-ORIGIN 'Netscape Directory Server' )", + "( nsWellKnownJarfiles-oid NAME 'nsWellKnownJarfiles' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE directoryOperation X-ORIGIN 'RFC 4512' )", + "( 2.16.840.1.113730.3.1.328 NAME 'nsMatchingRule' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( nsAdminAccessHosts-oid NAME 'nsAdminAccessHosts' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Administration Services' )", + "( 1.3.6.1.4.1.5923.1.1.1.6 NAME 'eduPersonPrincipalName' DESC 'Principal Name' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 2.16.840.1.113730.3.1.80 NAME 'cirHost' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.42.2.27.4.1.11 NAME 'javaReferenceAddress' DESC 'Addresses associated with a JNDI Reference' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 2713' )", + "( 2.16.840.1.113730.3.1.2086 NAME 'mepManagedBy' DESC 'Managed Entries backpointer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.1.684 NAME 'nsds5ReplicaChangeCount' DESC 'Netscape defined attribute type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.1101 NAME 'nsRoleScopeDN' DESC 'Scope of a role' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 1.3.1.1.4.1.453.16.2.103 NAME 'numSubordinates' DESC 'count of immediate subordinates' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-ORIGIN 'numSubordinates Internet Draft' )", + "( 1.3.6.1.4.1.13769.3.6 NAME 'mozillaHomeCountryName' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Mozilla Address Book' )", + "( 2.16.840.1.113730.3.1.2144 NAME 'rootdn-open-time' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.9999999 NAME 'nsds5debugreplicatimeout' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2256 NAME 'passwordLegacyPolicy' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.1466.101.120.5 NAME 'namingContexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation X-ORIGIN 'RFC 4512' )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.1.12 NAME 'mailAccessDomain' DESC 'Netscape Messaging Server 4.x defined attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.1.226 NAME 'nsslapd-pluginType' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.2123 NAME 'dnaSharedCfgDN' DESC 'DNA shared configuration entry DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN '389 Directory Server' )", + "( 2.5.4.44 NAME 'generationQualifier' SUP name EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113730.3.1.2193 NAME 'nsslapd-accesslog-logminfreediskspace' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.1.612 NAME 'generation' DESC 'Netscape defined attribute type' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Netscape Directory Server' )" + ], + "cn": [ + "schema" + ], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5String' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'DirectoryString' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'DN' )", + "( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )", + "( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'FAX' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'GeneralizedTime' )", + "( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'INTEGER' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'OctetString' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'TelephoneNumber' )", + "( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )" + ], + "matchingRules": [ + "( 2.5.13.17 NAME 'octetStringMatch' DESC 'The octetStringMatch rule compares an assertion value of the Octet String syntax to an attribute value of a syntax (e.g., the Octet String or JPEG syntax) whose corresponding ASN.1 type is the OCTET STRING ASN.1 type. The rule evaluates to TRUE if and only if the attribute value and the assertion value are the same length and corresponding octets (by position) are the same.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.18 NAME 'octetStringOrderingMatch' DESC 'The octetStringOrderingMatch rule compares an assertion value of the Octet String syntax to an attribute value of a syntax (e.g., the Octet String or JPEG syntax) whose corresponding ASN.1 type is the OCTET STRING ASN.1 type. The rule evaluates to TRUE if and only if the attribute value appears earlier in the collation order than the assertion value. The rule compares octet strings from the first octet to the last octet, and from the most significant bit to the least significant bit within the octet. The first occurrence of a different bit determines the ordering of the strings. A zero bit precedes a one bit. If the strings contain different numbers of octets but the longer string is identical to the shorter string up to the length of the shorter string, then the shorter string precedes the longer string.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.16 NAME 'bitStringMatch' DESC 'The bitStringMatch rule compares an assertion value of the Bit String syntax to an attribute value of a syntax (e.g., the Bit String syntax) whose corresponding ASN.1 type is BIT STRING. If the corresponding ASN.1 type of the attribute syntax does not have a named bit list [ASN.1] (which is the case for the Bit String syntax), then the rule evaluates to TRUE if and only if the attribute value has the same number of bits as the assertion value and the bits match on a bitwise basis. If the corresponding ASN.1 type does have a named bit list, then bitStringMatch operates as above, except that trailing zero bits in the attribute and assertion values are treated as absent.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", + "( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' DESC 'The caseExactIA5Match rule compares an assertion value of the IA5 String syntax to an attribute value of a syntax (e.g., the IA5 String syntax) whose corresponding ASN.1 type is IA5String. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 2.5.13.5 NAME 'caseExactMatch' DESC 'The caseExactMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of the alternative string types of DirectoryString, such as PrintableString (the other alternatives do not correspond to any syntax defined in this document). The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.6 NAME 'caseExactOrderingMatch' DESC 'The caseExactOrderingMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if, in the code point collation order, the prepared attribute value character string appears earlier than the prepared assertion value character string; i.e., the attribute value is \\"less than\\" the assertion value. In preparing the attribute value and assertion value for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.7 NAME 'caseExactSubstringsMatch' DESC 'The caseExactSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.16.840.1.113730.3.3.1 NAME 'caseExactIA5SubstringsMatch' DESC 'The caseExactIA5SubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the IA5 syntax) whose corresponding ASN.1 type is IA5 String or one of its alternative string types. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are not case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.27 NAME 'generalizedTimeMatch' DESC 'The rule evaluates to TRUE if and only if the attribute value represents the same universal coordinated time as the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' DESC 'The rule evaluates to TRUE if and only if the attribute value represents a universal coordinated time that is earlier than the universal coordinated time represented by the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.13 NAME 'booleanMatch' DESC 'The booleanMatch rule compares an assertion value of the Boolean syntax to an attribute value of a syntax (e.g., the Boolean syntax) whose corresponding ASN.1 type is BOOLEAN. The rule evaluates to TRUE if and only if the attribute value and the assertion value are both TRUE or both FALSE.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' DESC 'The caseIgnoreIA5Match rule compares an assertion value of the IA5 String syntax to an attribute value of a syntax (e.g., the IA5 String syntax) whose corresponding ASN.1 type is IA5String. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' DESC 'The caseIgnoreIA5SubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the IA5 String syntax) whose corresponding ASN.1 type is IA5String. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.2 NAME 'caseIgnoreMatch' DESC 'The caseIgnoreMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' DESC 'The caseIgnoreOrderingMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if, in the code point collation order, the prepared attribute value character string appears earlier than the prepared assertion value character string; i.e., the attribute value is \\"less than\\" the assertion value. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' DESC 'The caseIgnoreSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Directory String, Printable String, Country String, or Telephone Number syntax) whose corresponding ASN.1 type is DirectoryString or one of its alternative string types. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are case folded in the Map preparation step, and only Insignificant Space Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.11 NAME 'caseIgnoreListMatch' DESC 'The caseIgnoreListMatch rule compares an assertion value that is a sequence of strings to an attribute value of a syntax (e.g., the Postal Address syntax) whose corresponding ASN.1 type is a SEQUENCE OF the DirectoryString ASN.1 type. The rule evaluates to TRUE if and only if the attribute value and the assertion value have the same number of strings and corresponding strings (by position) match according to the caseIgnoreMatch matching rule. In [X.520], the assertion syntax for this matching rule is defined to be: SEQUENCE OF DirectoryString {ub-match} That is, it is different from the corresponding type for the Postal Address syntax. The choice of the Postal Address syntax for the assertion syntax of the caseIgnoreListMatch in LDAP should not be seen as limiting the matching rule to apply only to attributes with the Postal Address syntax.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' DESC 'The caseIgnoreListSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Postal Address syntax) whose corresponding ASN.1 type is a SEQUENCE OF the DirectoryString ASN.1 type. The rule evaluates to TRUE if and only if the assertion value matches, per the caseIgnoreSubstringsMatch rule, the character string formed by concatenating the strings of the attribute value, except that none of the , , or substrings of the assertion value are considered to match a substring of the concatenated string which spans more than one of the original strings of the attribute value. Note that, in terms of the LDAP-specific encoding of the Postal Address syntax, the concatenated string omits the line separator and the escaping of \\"\\\\\\" and \\"$\\" characters.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.0 NAME 'objectIdentifierMatch' DESC 'The objectIdentifierMatch rule compares an assertion value of the OID syntax to an attribute value of a syntax (e.g., the OID syntax) whose corresponding ASN.1 type is OBJECT IDENTIFIER. The rule evaluates to TRUE if and only if the assertion value and the attribute value represent the same object identifier; that is, the same sequence of integers, whether represented explicitly in the form of or implicitly in the form (see [RFC4512]). If an LDAP client supplies an assertion value in the form and the chosen descriptor is not recognized by the server, then the objectIdentifierMatch rule evaluates to Undefined.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.13.31 NAME 'directoryStringFirstComponentMatch' DESC 'The directoryStringFirstComponentMatch rule compares an assertion value of the Directory String syntax to an attribute value of a syntax whose corresponding ASN.1 type is a SEQUENCE with a mandatory first component of the DirectoryString ASN.1 type. Note that the assertion syntax of this matching rule differs from the attribute syntax of attributes for which this is the equality matching rule. The rule evaluates to TRUE if and only if the assertion value matches the first component of the attribute value using the rules of caseIgnoreMatch.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' DESC 'The objectIdentifierFirstComponentMatch rule compares an assertion value of the OID syntax to an attribute value of a syntax (e.g., the Attribute Type Description, DIT Content Rule Description, LDAP Syntax Description, Matching Rule Description, Matching Rule Use Description, Name Form Description, or Object Class Description syntax) whose corresponding ASN.1 type is a SEQUENCE with a mandatory first component of the OBJECT IDENTIFIER ASN.1 type. Note that the assertion syntax of this matching rule differs from the attribute syntax of attributes for which this is the equality matching rule. The rule evaluates to TRUE if and only if the assertion value matches the first component of the attribute value using the rules of objectIdentifierMatch.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.13.1 NAME 'distinguishedNameMatch' DESC 'The distinguishedNameMatch rule compares an assertion value of the DN syntax to an attribute value of a syntax (e.g., the DN syntax) whose corresponding ASN.1 type is DistinguishedName. The rule evaluates to TRUE if and only if the attribute value and the assertion value have the same number of relative distinguished names and corresponding relative distinguished names (by position) are the same. A relative distinguished name (RDN) of the assertion value is the same as an RDN of the attribute value if and only if they have the same number of attribute value assertions and each attribute value assertion (AVA) of the first RDN is the same as the AVA of the second RDN with the same attribute type. The order of the AVAs is not significant. Also note that a particular attribute type may appear in at most one AVA in an RDN. Two AVAs with the same attribute type are the same if their values are equal according to the equality matching rule of the attribute type. If one or more of the AVA comparisons evaluate to Undefined and the remaining AVA comparisons return TRUE then the distinguishedNameMatch rule evaluates to Undefined.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.13.14 NAME 'integerMatch' DESC 'The rule evaluates to TRUE if and only if the attribute value and the assertion value are the same integer value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.15 NAME 'integerOrderingMatch' DESC 'The rule evaluates to TRUE if and only if the integer value of the attribute value is less than the integer value of the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.29 NAME 'integerFirstComponentMatch' DESC 'The integerFirstComponentMatch rule compares an assertion value of the Integer syntax to an attribute value of a syntax (e.g., the DIT Structure Rule Description syntax) whose corresponding ASN.1 type is a SEQUENCE with a mandatory first component of the INTEGER ASN.1 type. Note that the assertion syntax of this matching rule differs from the attribute syntax of attributes for which this is the equality matching rule. The rule evaluates to TRUE if and only if the assertion value and the first component of the attribute value are the same integer value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.16.840.1.113730.3.3.2.0.1 NAME 'caseIgnoreOrderingMatch-default' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.0.1.6 NAME 'caseIgnoreSubstringMatch-default' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.1.1 NAME 'caseIgnoreOrderingMatch-ar' DESC 'ar' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.1.1.6 NAME 'caseIgnoreSubstringMatch-ar' DESC 'ar' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.2.1 NAME 'caseIgnoreOrderingMatch-be' DESC 'be' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.2.1.6 NAME 'caseIgnoreSubstringMatch-be' DESC 'be' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.3.1 NAME 'caseIgnoreOrderingMatch-bg' DESC 'bg' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.3.1.6 NAME 'caseIgnoreSubstringMatch-bg' DESC 'bg' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.4.1 NAME 'caseIgnoreOrderingMatch-ca' DESC 'ca' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.4.1.6 NAME 'caseIgnoreSubstringMatch-ca' DESC 'ca' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.5.1 NAME 'caseIgnoreOrderingMatch-cs' DESC 'cs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.5.1.6 NAME 'caseIgnoreSubstringMatch-cs' DESC 'cs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.6.1 NAME 'caseIgnoreOrderingMatch-da' DESC 'da' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.6.1.6 NAME 'caseIgnoreSubstringMatch-da' DESC 'da' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.7.1 NAME 'caseIgnoreOrderingMatch-de' DESC 'de' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.7.1.6 NAME 'caseIgnoreSubstringMatch-de' DESC 'de' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.8.1 NAME 'caseIgnoreOrderingMatch-de-AT' DESC 'de-AT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.8.1.6 NAME 'caseIgnoreSubstringMatch-de-AT' DESC 'de-AT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.9.1 NAME 'caseIgnoreOrderingMatch-de-CH' DESC 'de-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.9.1.6 NAME 'caseIgnoreSubstringMatch-de-CH' DESC 'de-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.10.1 NAME 'caseIgnoreOrderingMatch-el' DESC 'el' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.10.1.6 NAME 'caseIgnoreSubstringMatch-el' DESC 'el' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.1 NAME 'caseIgnoreOrderingMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.1.6 NAME 'caseIgnoreSubstringMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.12.1 NAME 'caseIgnoreOrderingMatch-en-CA' DESC 'en-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.12.1.6 NAME 'caseIgnoreSubstringMatch-en-CA' DESC 'en-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.13.1 NAME 'caseIgnoreOrderingMatch-en-GB' DESC 'en-GB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.13.1.6 NAME 'caseIgnoreSubstringMatch-en-GB' DESC 'en-GB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.14.1 NAME 'caseIgnoreOrderingMatch-en-IE' DESC 'en-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.14.1.6 NAME 'caseIgnoreSubstringMatch-en-IE' DESC 'en-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.15.1 NAME 'caseIgnoreOrderingMatch-es' DESC 'es' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.15.1.6 NAME 'caseIgnoreSubstringMatch-es' DESC 'es' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.16.1 NAME 'caseIgnoreOrderingMatch-et' DESC 'et' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.16.1.6 NAME 'caseIgnoreSubstringMatch-et' DESC 'et' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.17.1 NAME 'caseIgnoreOrderingMatch-fi' DESC 'fi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.17.1.6 NAME 'caseIgnoreSubstringMatch-fi' DESC 'fi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.18.1 NAME 'caseIgnoreOrderingMatch-fr' DESC 'fr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.18.1.6 NAME 'caseIgnoreSubstringMatch-fr' DESC 'fr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.19.1 NAME 'caseIgnoreOrderingMatch-fr-BE' DESC 'fr-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.19.1.6 NAME 'caseIgnoreSubstringMatch-fr-BE' DESC 'fr-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.20.1 NAME 'caseIgnoreOrderingMatch-fr-CA' DESC 'fr-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.20.1.6 NAME 'caseIgnoreSubstringMatch-fr-CA' DESC 'fr-CA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.21.1 NAME 'caseIgnoreOrderingMatch-fr-CH' DESC 'fr-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.21.1.6 NAME 'caseIgnoreSubstringMatch-fr-CH' DESC 'fr-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.22.1 NAME 'caseIgnoreOrderingMatch-hr' DESC 'hr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.22.1.6 NAME 'caseIgnoreSubstringMatch-hr' DESC 'hr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.23.1 NAME 'caseIgnoreOrderingMatch-hu' DESC 'hu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.23.1.6 NAME 'caseIgnoreSubstringMatch-hu' DESC 'hu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.24.1 NAME 'caseIgnoreOrderingMatch-is' DESC 'is' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.24.1.6 NAME 'caseIgnoreSubstringMatch-is' DESC 'is' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.25.1 NAME 'caseIgnoreOrderingMatch-it' DESC 'it' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.25.1.6 NAME 'caseIgnoreSubstringMatch-it' DESC 'it' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.26.1 NAME 'caseIgnoreOrderingMatch-it-CH' DESC 'it-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.26.1.6 NAME 'caseIgnoreSubstringMatch-it-CH' DESC 'it-CH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.27.1 NAME 'caseIgnoreOrderingMatch-iw' DESC 'iw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.27.1.6 NAME 'caseIgnoreSubstringMatch-iw' DESC 'iw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.28.1 NAME 'caseIgnoreOrderingMatch-ja' DESC 'ja' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.28.1.6 NAME 'caseIgnoreSubstringMatch-ja' DESC 'ja' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.29.1 NAME 'caseIgnoreOrderingMatch-ko' DESC 'ko' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.29.1.6 NAME 'caseIgnoreSubstringMatch-ko' DESC 'ko' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.30.1 NAME 'caseIgnoreOrderingMatch-lt' DESC 'lt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.30.1.6 NAME 'caseIgnoreSubstringMatch-lt' DESC 'lt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.31.1 NAME 'caseIgnoreOrderingMatch-lv' DESC 'lv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.31.1.6 NAME 'caseIgnoreSubstringMatch-lv' DESC 'lv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.32.1 NAME 'caseIgnoreOrderingMatch-mk' DESC 'mk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.32.1.6 NAME 'caseIgnoreSubstringMatch-mk' DESC 'mk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.33.1 NAME 'caseIgnoreOrderingMatch-nl' DESC 'nl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.33.1.6 NAME 'caseIgnoreSubstringMatch-nl' DESC 'nl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.34.1 NAME 'caseIgnoreOrderingMatch-nl-BE' DESC 'nl-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.34.1.6 NAME 'caseIgnoreSubstringMatch-nl-BE' DESC 'nl-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.35.1 NAME 'caseIgnoreOrderingMatch-no' DESC 'no' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.35.1.6 NAME 'caseIgnoreSubstringMatch-no' DESC 'no' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.36.1 NAME 'caseIgnoreOrderingMatch-no-NO-B' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.36.1.6 NAME 'caseIgnoreSubstringMatch-no-NO-B' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.37.1 NAME 'caseIgnoreOrderingMatch-no-NO-NY' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.37.1.6 NAME 'caseIgnoreSubstringMatch-no-NO-NY' DESC 'no-NO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.38.1 NAME 'caseIgnoreOrderingMatch-pl' DESC 'pl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.38.1.6 NAME 'caseIgnoreSubstringMatch-pl' DESC 'pl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.39.1 NAME 'caseIgnoreOrderingMatch-ro' DESC 'ro' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.39.1.6 NAME 'caseIgnoreSubstringMatch-ro' DESC 'ro' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.40.1 NAME 'caseIgnoreOrderingMatch-ru' DESC 'ru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.40.1.6 NAME 'caseIgnoreSubstringMatch-ru' DESC 'ru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.41.1 NAME 'caseIgnoreOrderingMatch-sh' DESC 'sh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.41.1.6 NAME 'caseIgnoreSubstringMatch-sh' DESC 'sh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.42.1 NAME 'caseIgnoreOrderingMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.42.1.6 NAME 'caseIgnoreSubstringMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.43.1 NAME 'caseIgnoreOrderingMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.43.1.6 NAME 'caseIgnoreSubstringMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.44.1 NAME 'caseIgnoreOrderingMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.44.1.6 NAME 'caseIgnoreSubstringMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.45.1 NAME 'caseIgnoreOrderingMatch-sr' DESC 'sr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.45.1.6 NAME 'caseIgnoreSubstringMatch-sr' DESC 'sr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.46.1 NAME 'caseIgnoreOrderingMatch-sv' DESC 'sv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.46.1.6 NAME 'caseIgnoreSubstringMatch-sv' DESC 'sv' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.47.1 NAME 'caseIgnoreOrderingMatch-tr' DESC 'tr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.47.1.6 NAME 'caseIgnoreSubstringMatch-tr' DESC 'tr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.48.1 NAME 'caseIgnoreOrderingMatch-uk' DESC 'uk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.48.1.6 NAME 'caseIgnoreSubstringMatch-uk' DESC 'uk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.49.1 NAME 'caseIgnoreOrderingMatch-zh' DESC 'zh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.49.1.6 NAME 'caseIgnoreSubstringMatch-zh' DESC 'zh' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.50.1 NAME 'caseIgnoreOrderingMatch-zh-TW' DESC 'zh-TW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.50.1.6 NAME 'caseIgnoreSubstringMatch-zh-TW' DESC 'zh-TW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.51.1 NAME 'caseIgnoreOrderingMatch-af' DESC 'af' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.51.1.6 NAME 'caseIgnoreSubstringMatch-af' DESC 'af' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.52.1 NAME 'caseIgnoreOrderingMatch-af-NA' DESC 'af-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.52.1.6 NAME 'caseIgnoreSubstringMatch-af-NA' DESC 'af-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.53.1 NAME 'caseIgnoreOrderingMatch-af-ZA' DESC 'af-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.53.1.6 NAME 'caseIgnoreSubstringMatch-af-ZA' DESC 'af-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.54.1 NAME 'caseIgnoreOrderingMatch-ar-AE' DESC 'ar-AE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.54.1.6 NAME 'caseIgnoreSubstringMatch-ar-AE' DESC 'ar-AE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.55.1 NAME 'caseIgnoreOrderingMatch-ar-BH' DESC 'ar-BH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.55.1.6 NAME 'caseIgnoreSubstringMatch-ar-BH' DESC 'ar-BH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.56.1 NAME 'caseIgnoreOrderingMatch-ar-DZ' DESC 'ar-DZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.56.1.6 NAME 'caseIgnoreSubstringMatch-ar-DZ' DESC 'ar-DZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.57.1 NAME 'caseIgnoreOrderingMatch-ar-EG' DESC 'ar-EG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.57.1.6 NAME 'caseIgnoreSubstringMatch-ar-EG' DESC 'ar-EG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.58.1 NAME 'caseIgnoreOrderingMatch-ar-IQ' DESC 'ar-IQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.58.1.6 NAME 'caseIgnoreSubstringMatch-ar-IQ' DESC 'ar-IQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.59.1 NAME 'caseIgnoreOrderingMatch-ar-JO' DESC 'ar-JO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.59.1.6 NAME 'caseIgnoreSubstringMatch-ar-JO' DESC 'ar-JO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.60.1 NAME 'caseIgnoreOrderingMatch-ar-KW' DESC 'ar-KW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.60.1.6 NAME 'caseIgnoreSubstringMatch-ar-KW' DESC 'ar-KW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.61.1 NAME 'caseIgnoreOrderingMatch-ar-LB' DESC 'ar-LB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.61.1.6 NAME 'caseIgnoreSubstringMatch-ar-LB' DESC 'ar-LB' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.62.1 NAME 'caseIgnoreOrderingMatch-ar-LY' DESC 'ar-LY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.62.1.6 NAME 'caseIgnoreSubstringMatch-ar-LY' DESC 'ar-LY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.63.1 NAME 'caseIgnoreOrderingMatch-ar-MA' DESC 'ar-MA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.63.1.6 NAME 'caseIgnoreSubstringMatch-ar-MA' DESC 'ar-MA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.64.1 NAME 'caseIgnoreOrderingMatch-ar-OM' DESC 'ar-OM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.64.1.6 NAME 'caseIgnoreSubstringMatch-ar-OM' DESC 'ar-OM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.65.1 NAME 'caseIgnoreOrderingMatch-ar-QA' DESC 'ar-QA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.65.1.6 NAME 'caseIgnoreSubstringMatch-ar-QA' DESC 'ar-QA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.66.1 NAME 'caseIgnoreOrderingMatch-ar-SA' DESC 'ar-SA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.66.1.6 NAME 'caseIgnoreSubstringMatch-ar-SA' DESC 'ar-SA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.67.1 NAME 'caseIgnoreOrderingMatch-ar-SD' DESC 'ar-SD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.67.1.6 NAME 'caseIgnoreSubstringMatch-ar-SD' DESC 'ar-SD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.68.1 NAME 'caseIgnoreOrderingMatch-ar-SY' DESC 'ar-SY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.68.1.6 NAME 'caseIgnoreSubstringMatch-ar-SY' DESC 'ar-SY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.69.1 NAME 'caseIgnoreOrderingMatch-ar-TN' DESC 'ar-TN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.69.1.6 NAME 'caseIgnoreSubstringMatch-ar-TN' DESC 'ar-TN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.70.1 NAME 'caseIgnoreOrderingMatch-ar-YE' DESC 'ar-YE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.70.1.6 NAME 'caseIgnoreSubstringMatch-ar-YE' DESC 'ar-YE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.71.1 NAME 'caseIgnoreOrderingMatch-as' DESC 'as' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.71.1.6 NAME 'caseIgnoreSubstringMatch-as' DESC 'as' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.72.1 NAME 'caseIgnoreOrderingMatch-as-IN' DESC 'as-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.72.1.6 NAME 'caseIgnoreSubstringMatch-as-IN' DESC 'as-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.73.1 NAME 'caseIgnoreOrderingMatch-az' DESC 'az' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.73.1.6 NAME 'caseIgnoreSubstringMatch-az' DESC 'az' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.74.1 NAME 'caseIgnoreOrderingMatch-az-Latn' DESC 'az-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.74.1.6 NAME 'caseIgnoreSubstringMatch-az-Latn' DESC 'az-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.75.1 NAME 'caseIgnoreOrderingMatch-az-Latn-AZ' DESC 'az-Latn_AZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.75.1.6 NAME 'caseIgnoreSubstringMatch-az-Latn-AZ' DESC 'az-Latn_AZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.76.1 NAME 'caseIgnoreOrderingMatch-bn' DESC 'bn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.76.1.6 NAME 'caseIgnoreSubstringMatch-bn' DESC 'bn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.77.1 NAME 'caseIgnoreOrderingMatch-bn-BD' DESC 'bn-BD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.77.1.6 NAME 'caseIgnoreSubstringMatch-bn-BD' DESC 'bn-BD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.78.1 NAME 'caseIgnoreOrderingMatch-bn-IN' DESC 'bn-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.78.1.6 NAME 'caseIgnoreSubstringMatch-bn-IN' DESC 'bn-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.79.1 NAME 'caseIgnoreOrderingMatch-bs' DESC 'bs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.79.1.6 NAME 'caseIgnoreSubstringMatch-bs' DESC 'bs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.80.1 NAME 'caseIgnoreOrderingMatch-chr' DESC 'chr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.80.1.6 NAME 'caseIgnoreSubstringMatch-chr' DESC 'chr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.81.1 NAME 'caseIgnoreOrderingMatch-chr-US' DESC 'chr-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.81.1.6 NAME 'caseIgnoreSubstringMatch-chr-US' DESC 'chr-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.82.1 NAME 'caseIgnoreOrderingMatch-cy' DESC 'cy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.82.1.6 NAME 'caseIgnoreSubstringMatch-cy' DESC 'cy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.83.1 NAME 'caseIgnoreOrderingMatch-de-BE' DESC 'de-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.83.1.6 NAME 'caseIgnoreSubstringMatch-de-BE' DESC 'de-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.84.1 NAME 'caseIgnoreOrderingMatch-de-LI' DESC 'de-LI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.84.1.6 NAME 'caseIgnoreSubstringMatch-de-LI' DESC 'de-LI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.85.1 NAME 'caseIgnoreOrderingMatch-de-LU' DESC 'de-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.85.1.6 NAME 'caseIgnoreSubstringMatch-de-LU' DESC 'de-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.86.1 NAME 'caseIgnoreOrderingMatch-el-CY' DESC 'el-CY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.86.1.6 NAME 'caseIgnoreSubstringMatch-el-CY' DESC 'el-CY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.87.1 NAME 'caseIgnoreOrderingMatch-el-GR' DESC 'el-GR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.87.1.6 NAME 'caseIgnoreSubstringMatch-el-GR' DESC 'el-GR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.88.1 NAME 'caseIgnoreOrderingMatch-en-AS' DESC 'en-AS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.88.1.6 NAME 'caseIgnoreSubstringMatch-en-AS' DESC 'en-AS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.89.1 NAME 'caseIgnoreOrderingMatch-en-AU' DESC 'en-AU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.89.1.6 NAME 'caseIgnoreSubstringMatch-en-AU' DESC 'en-AU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.90.1 NAME 'caseIgnoreOrderingMatch-en-BE' DESC 'en-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.90.1.6 NAME 'caseIgnoreSubstringMatch-en-BE' DESC 'en-BE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.91.1 NAME 'caseIgnoreOrderingMatch-en-BW' DESC 'en-BW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.91.1.6 NAME 'caseIgnoreSubstringMatch-en-BW' DESC 'en-BW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.92.1 NAME 'caseIgnoreOrderingMatch-en-BZ' DESC 'en-BZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.92.1.6 NAME 'caseIgnoreSubstringMatch-en-BZ' DESC 'en-BZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.93.1 NAME 'caseIgnoreOrderingMatch-en-GU' DESC 'en-GU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.93.1.6 NAME 'caseIgnoreSubstringMatch-en-GU' DESC 'en-GU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.94.1 NAME 'caseIgnoreOrderingMatch-en-GY' DESC 'en-GY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.94.1.6 NAME 'caseIgnoreSubstringMatch-en-GY' DESC 'en-GY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.95.1 NAME 'caseIgnoreOrderingMatch-en-HK' DESC 'en-HK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.95.1.6 NAME 'caseIgnoreSubstringMatch-en-HK' DESC 'en-HK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.96.1 NAME 'caseIgnoreOrderingMatch-en-IN' DESC 'en-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.96.1.6 NAME 'caseIgnoreSubstringMatch-en-IN' DESC 'en-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.97.1 NAME 'caseIgnoreOrderingMatch-en-JM' DESC 'en-JM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.97.1.6 NAME 'caseIgnoreSubstringMatch-en-JM' DESC 'en-JM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.98.1 NAME 'caseIgnoreOrderingMatch-en-MH' DESC 'en-MH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.98.1.6 NAME 'caseIgnoreSubstringMatch-en-MH' DESC 'en-MH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.99.1 NAME 'caseIgnoreOrderingMatch-en-MP' DESC 'en-MP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.99.1.6 NAME 'caseIgnoreSubstringMatch-en-MP' DESC 'en-MP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.100.1 NAME 'caseIgnoreOrderingMatch-en-MT' DESC 'en-MT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.100.1.6 NAME 'caseIgnoreSubstringMatch-en-MT' DESC 'en-MT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.101.1 NAME 'caseIgnoreOrderingMatch-en-MU' DESC 'en-MU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.101.1.6 NAME 'caseIgnoreSubstringMatch-en-MU' DESC 'en-MU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.102.1 NAME 'caseIgnoreOrderingMatch-en-NA' DESC 'en-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.102.1.6 NAME 'caseIgnoreSubstringMatch-en-NA' DESC 'en-NA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.103.1 NAME 'caseIgnoreOrderingMatch-en-NZ' DESC 'en-NZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.103.1.6 NAME 'caseIgnoreSubstringMatch-en-NZ' DESC 'en-NZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.104.1 NAME 'caseIgnoreOrderingMatch-en-PH' DESC 'en-PH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.104.1.6 NAME 'caseIgnoreSubstringMatch-en-PH' DESC 'en-PH' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.105.1 NAME 'caseIgnoreOrderingMatch-en-PK' DESC 'en-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.105.1.6 NAME 'caseIgnoreSubstringMatch-en-PK' DESC 'en-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.106.1 NAME 'caseIgnoreOrderingMatch-en-SG' DESC 'en-SG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.106.1.6 NAME 'caseIgnoreSubstringMatch-en-SG' DESC 'en-SG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.107.1 NAME 'caseIgnoreOrderingMatch-en-TT' DESC 'en-TT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.107.1.6 NAME 'caseIgnoreSubstringMatch-en-TT' DESC 'en-TT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.108.1 NAME 'caseIgnoreOrderingMatch-en-UM' DESC 'en-UM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.108.1.6 NAME 'caseIgnoreSubstringMatch-en-UM' DESC 'en-UM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.109.1 NAME 'caseIgnoreOrderingMatch-en-US' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.109.1.6 NAME 'caseIgnoreSubstringMatch-en-US' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.110.1 NAME 'caseIgnoreOrderingMatch-en-US-POSIX' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.110.1.6 NAME 'caseIgnoreSubstringMatch-en-US-POSIX' DESC 'en-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.111.1 NAME 'caseIgnoreOrderingMatch-en-VI' DESC 'en-VI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.111.1.6 NAME 'caseIgnoreSubstringMatch-en-VI' DESC 'en-VI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.112.1 NAME 'caseIgnoreOrderingMatch-en-ZA' DESC 'en-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.112.1.6 NAME 'caseIgnoreSubstringMatch-en-ZA' DESC 'en-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.113.1 NAME 'caseIgnoreOrderingMatch-en-ZW' DESC 'en-ZW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.113.1.6 NAME 'caseIgnoreSubstringMatch-en-ZW' DESC 'en-ZW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.114.1 NAME 'caseIgnoreOrderingMatch-es-AR' DESC 'es-AR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.114.1.6 NAME 'caseIgnoreSubstringMatch-es-AR' DESC 'es-AR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.115.1 NAME 'caseIgnoreOrderingMatch-es-BO' DESC 'es-BO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.115.1.6 NAME 'caseIgnoreSubstringMatch-es-BO' DESC 'es-BO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.116.1 NAME 'caseIgnoreOrderingMatch-es-CL' DESC 'es-CL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.116.1.6 NAME 'caseIgnoreSubstringMatch-es-CL' DESC 'es-CL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.117.1 NAME 'caseIgnoreOrderingMatch-es-CO' DESC 'es-CO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.117.1.6 NAME 'caseIgnoreSubstringMatch-es-CO' DESC 'es-CO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.118.1 NAME 'caseIgnoreOrderingMatch-es-CR' DESC 'es-CR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.118.1.6 NAME 'caseIgnoreSubstringMatch-es-CR' DESC 'es-CR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.119.1 NAME 'caseIgnoreOrderingMatch-es-DO' DESC 'es-DO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.119.1.6 NAME 'caseIgnoreSubstringMatch-es-DO' DESC 'es-DO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.120.1 NAME 'caseIgnoreOrderingMatch-es-EC' DESC 'es-EC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.120.1.6 NAME 'caseIgnoreSubstringMatch-es-EC' DESC 'es-EC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.121.1 NAME 'caseIgnoreOrderingMatch-es-ES' DESC 'es-ES' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.121.1.6 NAME 'caseIgnoreSubstringMatch-es-ES' DESC 'es-ES' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.122.1 NAME 'caseIgnoreOrderingMatch-es-GQ' DESC 'es-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.122.1.6 NAME 'caseIgnoreSubstringMatch-es-GQ' DESC 'es-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.123.1 NAME 'caseIgnoreOrderingMatch-es-GT' DESC 'es-GT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.123.1.6 NAME 'caseIgnoreSubstringMatch-es-GT' DESC 'es-GT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.124.1 NAME 'caseIgnoreOrderingMatch-es-HN' DESC 'es-HN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.124.1.6 NAME 'caseIgnoreSubstringMatch-es-HN' DESC 'es-HN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.125.1 NAME 'caseIgnoreOrderingMatch-es-MX' DESC 'es-MX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.125.1.6 NAME 'caseIgnoreSubstringMatch-es-MX' DESC 'es-MX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.126.1 NAME 'caseIgnoreOrderingMatch-es-NI' DESC 'es-NI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.126.1.6 NAME 'caseIgnoreSubstringMatch-es-NI' DESC 'es-NI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.127.1 NAME 'caseIgnoreOrderingMatch-es-PA' DESC 'es-PA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.127.1.6 NAME 'caseIgnoreSubstringMatch-es-PA' DESC 'es-PA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.128.1 NAME 'caseIgnoreOrderingMatch-es-PE' DESC 'es-PE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.128.1.6 NAME 'caseIgnoreSubstringMatch-es-PE' DESC 'es-PE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.129.1 NAME 'caseIgnoreOrderingMatch-es-PR' DESC 'es-PR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.129.1.6 NAME 'caseIgnoreSubstringMatch-es-PR' DESC 'es-PR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.130.1 NAME 'caseIgnoreOrderingMatch-es-PY' DESC 'es-PY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.130.1.6 NAME 'caseIgnoreSubstringMatch-es-PY' DESC 'es-PY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.131.1 NAME 'caseIgnoreOrderingMatch-es-SV' DESC 'es-SV' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.131.1.6 NAME 'caseIgnoreSubstringMatch-es-SV' DESC 'es-SV' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.132.1 NAME 'caseIgnoreOrderingMatch-es-US' DESC 'es-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.132.1.6 NAME 'caseIgnoreSubstringMatch-es-US' DESC 'es-US' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.133.1 NAME 'caseIgnoreOrderingMatch-es-UY' DESC 'es-UY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.133.1.6 NAME 'caseIgnoreSubstringMatch-es-UY' DESC 'es-UY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.134.1 NAME 'caseIgnoreOrderingMatch-es-VE' DESC 'es-VE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.134.1.6 NAME 'caseIgnoreSubstringMatch-es-VE' DESC 'es-VE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.135.1 NAME 'caseIgnoreOrderingMatch-fa' DESC 'fa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.135.1.6 NAME 'caseIgnoreSubstringMatch-fa' DESC 'fa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.136.1 NAME 'caseIgnoreOrderingMatch-fil' DESC 'fil' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.136.1.6 NAME 'caseIgnoreSubstringMatch-fil' DESC 'fil' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.137.1 NAME 'caseIgnoreOrderingMatch-fo' DESC 'fo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.137.1.6 NAME 'caseIgnoreSubstringMatch-fo' DESC 'fo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.138.1 NAME 'caseIgnoreOrderingMatch-fr-BF' DESC 'fr-BF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.138.1.6 NAME 'caseIgnoreSubstringMatch-fr-BF' DESC 'fr-BF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.139.1 NAME 'caseIgnoreOrderingMatch-fr-BI' DESC 'fr-BI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.139.1.6 NAME 'caseIgnoreSubstringMatch-fr-BI' DESC 'fr-BI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.140.1 NAME 'caseIgnoreOrderingMatch-fr-BJ' DESC 'fr-BJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.140.1.6 NAME 'caseIgnoreSubstringMatch-fr-BJ' DESC 'fr-BJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.141.1 NAME 'caseIgnoreOrderingMatch-fr-BL' DESC 'fr-BL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.141.1.6 NAME 'caseIgnoreSubstringMatch-fr-BL' DESC 'fr-BL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.142.1 NAME 'caseIgnoreOrderingMatch-fr-CD' DESC 'fr-CD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.142.1.6 NAME 'caseIgnoreSubstringMatch-fr-CD' DESC 'fr-CD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.143.1 NAME 'caseIgnoreOrderingMatch-fr-CF' DESC 'fr-CF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.143.1.6 NAME 'caseIgnoreSubstringMatch-fr-CF' DESC 'fr-CF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.144.1 NAME 'caseIgnoreOrderingMatch-fr-CG' DESC 'fr-CG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.144.1.6 NAME 'caseIgnoreSubstringMatch-fr-CG' DESC 'fr-CG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.145.1 NAME 'caseIgnoreOrderingMatch-fr-CI' DESC 'fr-CI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.145.1.6 NAME 'caseIgnoreSubstringMatch-fr-CI' DESC 'fr-CI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.146.1 NAME 'caseIgnoreOrderingMatch-fr-CM' DESC 'fr-CM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.146.1.6 NAME 'caseIgnoreSubstringMatch-fr-CM' DESC 'fr-CM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.147.1 NAME 'caseIgnoreOrderingMatch-fr-DJ' DESC 'fr-DJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.147.1.6 NAME 'caseIgnoreSubstringMatch-fr-DJ' DESC 'fr-DJ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.148.1 NAME 'caseIgnoreOrderingMatch-fr-GA' DESC 'fr-GA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.148.1.6 NAME 'caseIgnoreSubstringMatch-fr-GA' DESC 'fr-GA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.149.1 NAME 'caseIgnoreOrderingMatch-fr-GN' DESC 'fr-GN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.149.1.6 NAME 'caseIgnoreSubstringMatch-fr-GN' DESC 'fr-GN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.150.1 NAME 'caseIgnoreOrderingMatch-fr-GP' DESC 'fr-GP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.150.1.6 NAME 'caseIgnoreSubstringMatch-fr-GP' DESC 'fr-GP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.151.1 NAME 'caseIgnoreOrderingMatch-fr-GQ' DESC 'fr-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.151.1.6 NAME 'caseIgnoreSubstringMatch-fr-GQ' DESC 'fr-GQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.152.1 NAME 'caseIgnoreOrderingMatch-fr-KM' DESC 'fr-KM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.152.1.6 NAME 'caseIgnoreSubstringMatch-fr-KM' DESC 'fr-KM' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.153.1 NAME 'caseIgnoreOrderingMatch-fr-LU' DESC 'fr-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.153.1.6 NAME 'caseIgnoreSubstringMatch-fr-LU' DESC 'fr-LU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.154.1 NAME 'caseIgnoreOrderingMatch-fr-MC' DESC 'fr-MC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.154.1.6 NAME 'caseIgnoreSubstringMatch-fr-MC' DESC 'fr-MC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.155.1 NAME 'caseIgnoreOrderingMatch-fr-MF' DESC 'fr-MF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.155.1.6 NAME 'caseIgnoreSubstringMatch-fr-MF' DESC 'fr-MF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.156.1 NAME 'caseIgnoreOrderingMatch-fr-MG' DESC 'fr-MG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.156.1.6 NAME 'caseIgnoreSubstringMatch-fr-MG' DESC 'fr-MG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.157.1 NAME 'caseIgnoreOrderingMatch-fr-ML' DESC 'fr-ML' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.157.1.6 NAME 'caseIgnoreSubstringMatch-fr-ML' DESC 'fr-ML' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.158.1 NAME 'caseIgnoreOrderingMatch-fr-MQ' DESC 'fr-MQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.158.1.6 NAME 'caseIgnoreSubstringMatch-fr-MQ' DESC 'fr-MQ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.159.1 NAME 'caseIgnoreOrderingMatch-fr-NE' DESC 'fr-NE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.159.1.6 NAME 'caseIgnoreSubstringMatch-fr-NE' DESC 'fr-NE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.160.1 NAME 'caseIgnoreOrderingMatch-fr-RE' DESC 'fr-RE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.160.1.6 NAME 'caseIgnoreSubstringMatch-fr-RE' DESC 'fr-RE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.161.1 NAME 'caseIgnoreOrderingMatch-fr-RW' DESC 'fr-RW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.161.1.6 NAME 'caseIgnoreSubstringMatch-fr-RW' DESC 'fr-RW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.162.1 NAME 'caseIgnoreOrderingMatch-fr-SN' DESC 'fr-SN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.162.1.6 NAME 'caseIgnoreSubstringMatch-fr-SN' DESC 'fr-SN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.163.1 NAME 'caseIgnoreOrderingMatch-fr-TD' DESC 'fr-TD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.163.1.6 NAME 'caseIgnoreSubstringMatch-fr-TD' DESC 'fr-TD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.164.1 NAME 'caseIgnoreOrderingMatch-fr-TG' DESC 'fr-TG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.164.1.6 NAME 'caseIgnoreSubstringMatch-fr-TG' DESC 'fr-TG' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.165.1 NAME 'caseIgnoreOrderingMatch-ga' DESC 'ga' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.165.1.6 NAME 'caseIgnoreSubstringMatch-ga' DESC 'ga' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.166.1 NAME 'caseIgnoreOrderingMatch-ga-IE' DESC 'ga-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.166.1.6 NAME 'caseIgnoreSubstringMatch-ga-IE' DESC 'ga-IE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.167.1 NAME 'caseIgnoreOrderingMatch-ga-IN' DESC 'ga-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.167.1.6 NAME 'caseIgnoreSubstringMatch-ga-IN' DESC 'ga-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.168.1 NAME 'caseIgnoreOrderingMatch-ha' DESC 'ha' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.168.1.6 NAME 'caseIgnoreSubstringMatch-ha' DESC 'ha' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.169.1 NAME 'caseIgnoreOrderingMatch-ha-Latn' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.169.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.170.1 NAME 'caseIgnoreOrderingMatch-ha-Latn-GH' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.170.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn-GH' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.171.1 NAME 'caseIgnoreOrderingMatch-ha-Latn-NE' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.171.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn-NE' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.172.1 NAME 'caseIgnoreOrderingMatch-ha-Latn-NG' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.172.1.6 NAME 'caseIgnoreSubstringMatch-ha-Latn-NG' DESC 'ha-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.173.1 NAME 'caseIgnoreOrderingMatch-he' DESC 'he' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.173.1.6 NAME 'caseIgnoreSubstringMatch-he' DESC 'he' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.174.1 NAME 'caseIgnoreOrderingMatch-hi' DESC 'hi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.174.1.6 NAME 'caseIgnoreSubstringMatch-hi' DESC 'hi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.175.1 NAME 'caseIgnoreOrderingMatch-hy' DESC 'hy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.175.1.6 NAME 'caseIgnoreSubstringMatch-hy' DESC 'hy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.176.1 NAME 'caseIgnoreOrderingMatch-id-ID' DESC 'id' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.176.1.6 NAME 'caseIgnoreSubstringMatch-id-ID' DESC 'id' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.177.1 NAME 'caseIgnoreOrderingMatch-ig-NG' DESC 'id-ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.177.1.6 NAME 'caseIgnoreSubstringMatch-ig-NG' DESC 'id-ID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.178.1 NAME 'caseIgnoreOrderingMatch-it-IT' DESC 'it-IT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.178.1.6 NAME 'caseIgnoreSubstringMatch-it-IT' DESC 'it-IT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.179.1 NAME 'caseIgnoreOrderingMatch-ka' DESC 'ka' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.179.1.6 NAME 'caseIgnoreSubstringMatch-ka' DESC 'ka' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.180.1 NAME 'caseIgnoreOrderingMatch-ka-GE' DESC 'ka-GE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.180.1.6 NAME 'caseIgnoreSubstringMatch-ka-GE' DESC 'ka-GE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.181.1 NAME 'caseIgnoreOrderingMatch-kk' DESC 'kk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.181.1.6 NAME 'caseIgnoreSubstringMatch-kk' DESC 'kk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.182.1 NAME 'caseIgnoreOrderingMatch-kl' DESC 'kl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.182.1.6 NAME 'caseIgnoreSubstringMatch-kl' DESC 'kl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.183.1 NAME 'caseIgnoreOrderingMatch-kn' DESC 'kn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.183.1.6 NAME 'caseIgnoreSubstringMatch-kn' DESC 'kn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.184.1 NAME 'caseIgnoreOrderingMatch-kok' DESC 'kok' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.184.1.6 NAME 'caseIgnoreSubstringMatch-kok' DESC 'kok' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.185.1 NAME 'caseIgnoreOrderingMatch-ml' DESC 'ml' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.185.1.6 NAME 'caseIgnoreSubstringMatch-ml' DESC 'ml' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.186.1 NAME 'caseIgnoreOrderingMatch-ms' DESC 'ms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.186.1.6 NAME 'caseIgnoreSubstringMatch-ms' DESC 'ms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.187.1 NAME 'caseIgnoreOrderingMatch-ms-BN' DESC 'ms-BN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.187.1.6 NAME 'caseIgnoreSubstringMatch-ms-BN' DESC 'ms-BN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.188.1 NAME 'caseIgnoreOrderingMatch-ms-MY' DESC 'ms-MY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.188.1.6 NAME 'caseIgnoreSubstringMatch-ms-MY' DESC 'ms-MY' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.189.1 NAME 'caseIgnoreOrderingMatch-mt' DESC 'mt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.189.1.6 NAME 'caseIgnoreSubstringMatch-mt' DESC 'mt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.190.1 NAME 'caseIgnoreOrderingMatch-nl-NL' DESC 'nl-NL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.190.1.6 NAME 'caseIgnoreSubstringMatch-nl-NL' DESC 'nl-NL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.191.1 NAME 'caseIgnoreOrderingMatch-nn' DESC 'nn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.191.1.6 NAME 'caseIgnoreSubstringMatch-nn' DESC 'nn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.192.1 NAME 'caseIgnoreOrderingMatch-om' DESC 'om' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.192.1.6 NAME 'caseIgnoreSubstringMatch-om' DESC 'om' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.193.1 NAME 'caseIgnoreOrderingMatch-om-ET' DESC 'om-ET' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.193.1.6 NAME 'caseIgnoreSubstringMatch-om-ET' DESC 'om-ET' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.194.1 NAME 'caseIgnoreOrderingMatch-om-KE' DESC 'om-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.194.1.6 NAME 'caseIgnoreSubstringMatch-om-KE' DESC 'om-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.195.1 NAME 'caseIgnoreOrderingMatch-or' DESC 'or' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.195.1.6 NAME 'caseIgnoreSubstringMatch-or' DESC 'or' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.196.1 NAME 'caseIgnoreOrderingMatch-pa' DESC 'pa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.196.1.6 NAME 'caseIgnoreSubstringMatch-pa' DESC 'pa' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.197.1 NAME 'caseIgnoreOrderingMatch-pa-Arab' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.197.1.6 NAME 'caseIgnoreSubstringMatch-pa-Arab' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.198.1 NAME 'caseIgnoreOrderingMatch-pa-Arab-PK' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.198.1.6 NAME 'caseIgnoreSubstringMatch-pa-Arab-PK' DESC 'pa-Arab' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.199.1 NAME 'caseIgnoreOrderingMatch-pa-Guru' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.199.1.6 NAME 'caseIgnoreSubstringMatch-pa-Guru' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.200.1 NAME 'caseIgnoreOrderingMatch-pa-Guru-IN' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.200.1.6 NAME 'caseIgnoreSubstringMatch-pa-Guru-IN' DESC 'pa-Guru' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.201.1 NAME 'caseIgnoreOrderingMatch-ps' DESC 'ps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.201.1.6 NAME 'caseIgnoreSubstringMatch-ps' DESC 'ps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.202.1 NAME 'caseIgnoreOrderingMatch-pt' DESC 'pt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.202.1.6 NAME 'caseIgnoreSubstringMatch-pt' DESC 'pt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.203.1 NAME 'caseIgnoreOrderingMatch-pt-BR' DESC 'pt-BR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.203.1.6 NAME 'caseIgnoreSubstringMatch-pt-BR' DESC 'pt-BR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.204.1 NAME 'caseIgnoreOrderingMatch-pt-PT' DESC 'pt-PT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.204.1.6 NAME 'caseIgnoreSubstringMatch-pt-PT' DESC 'pt-PT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.205.1 NAME 'caseIgnoreOrderingMatch-ro-MD' DESC 'ro-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.205.1.6 NAME 'caseIgnoreSubstringMatch-ro-MD' DESC 'ro-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.206.1 NAME 'caseIgnoreOrderingMatch-ro-RO' DESC 'ro-RO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.206.1.6 NAME 'caseIgnoreSubstringMatch-ro-RO' DESC 'ro-RO' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.207.1 NAME 'caseIgnoreOrderingMatch-ru-MD' DESC 'ru-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.207.1.6 NAME 'caseIgnoreSubstringMatch-ru-MD' DESC 'ru-MD' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.208.1 NAME 'caseIgnoreOrderingMatch-ru-RU' DESC 'ru-RU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.208.1.6 NAME 'caseIgnoreSubstringMatch-ru-RU' DESC 'ru-RU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.209.1 NAME 'caseIgnoreOrderingMatch-ru-UA' DESC 'ru-UA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.209.1.6 NAME 'caseIgnoreSubstringMatch-ru-UA' DESC 'ru-UA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.210.1 NAME 'caseIgnoreOrderingMatch-si' DESC 'si' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.210.1.6 NAME 'caseIgnoreSubstringMatch-si' DESC 'si' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.211.1 NAME 'caseIgnoreOrderingMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.211.1.6 NAME 'caseIgnoreSubstringMatch-sk' DESC 'sk' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.212.1 NAME 'caseIgnoreOrderingMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.212.1.6 NAME 'caseIgnoreSubstringMatch-sl' DESC 'sl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.213.1 NAME 'caseIgnoreOrderingMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.213.1.6 NAME 'caseIgnoreSubstringMatch-sq' DESC 'sq' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.214.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.214.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.215.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl-BA' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.215.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl-BA' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.216.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl-ME' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.216.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl-ME' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.217.1 NAME 'caseIgnoreOrderingMatch-sr-Cyrl-RS' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.217.1.6 NAME 'caseIgnoreSubstringMatch-sr-Cyrl-RS' DESC 'sr-Cyrl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.218.1 NAME 'caseIgnoreOrderingMatch-sr-Latn' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.218.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.219.1 NAME 'caseIgnoreOrderingMatch-sr-Latn-BA' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.219.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn-BA' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.220.1 NAME 'caseIgnoreOrderingMatch-sr-Latn-ME' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.220.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn-ME' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.221.1 NAME 'caseIgnoreOrderingMatch-sr-Latn-RS' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.221.1.6 NAME 'caseIgnoreSubstringMatch-sr-Latn-RS' DESC 'sr-Latn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.222.1 NAME 'caseIgnoreOrderingMatch-sv-FI' DESC 'sv-FI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.222.1.6 NAME 'caseIgnoreSubstringMatch-sv-FI' DESC 'sv-FI' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.223.1 NAME 'caseIgnoreOrderingMatch-sv-SE' DESC 'sv-SE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.223.1.6 NAME 'caseIgnoreSubstringMatch-sv-SE' DESC 'sv-SE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.224.1 NAME 'caseIgnoreOrderingMatch-sw' DESC 'sw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.224.1.6 NAME 'caseIgnoreSubstringMatch-sw' DESC 'sw' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.225.1 NAME 'caseIgnoreOrderingMatch-sw-KE' DESC 'sw-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.225.1.6 NAME 'caseIgnoreSubstringMatch-sw-KE' DESC 'sw-KE' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.226.1 NAME 'caseIgnoreOrderingMatch-sw-TZ' DESC 'sw-TZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.226.1.6 NAME 'caseIgnoreSubstringMatch-sw-TZ' DESC 'sw-TZ' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.227.1 NAME 'caseIgnoreOrderingMatch-ta' DESC 'ta' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.227.1.6 NAME 'caseIgnoreSubstringMatch-ta' DESC 'ta' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.228.1 NAME 'caseIgnoreOrderingMatch-ta-IN' DESC 'ta-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.228.1.6 NAME 'caseIgnoreSubstringMatch-ta-IN' DESC 'ta-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.229.1 NAME 'caseIgnoreOrderingMatch-ta-LK' DESC 'ta-LK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.229.1.6 NAME 'caseIgnoreSubstringMatch-ta-LK' DESC 'ta-LK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.230.1 NAME 'caseIgnoreOrderingMatch-te' DESC 'te' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.230.1.6 NAME 'caseIgnoreSubstringMatch-te' DESC 'te' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.231.1 NAME 'caseIgnoreOrderingMatch-th' DESC 'th' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.231.1.6 NAME 'caseIgnoreSubstringMatch-th' DESC 'th' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.232.1 NAME 'caseIgnoreOrderingMatch-ur' DESC 'ur' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.232.1.6 NAME 'caseIgnoreSubstringMatch-ur' DESC 'ur' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.233.1 NAME 'caseIgnoreOrderingMatch-ur-IN' DESC 'ur-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.233.1.6 NAME 'caseIgnoreSubstringMatch-ur-IN' DESC 'ur-IN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.234.1 NAME 'caseIgnoreOrderingMatch-ur-PK' DESC 'ur-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.234.1.6 NAME 'caseIgnoreSubstringMatch-ur-PK' DESC 'ur-PK' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.235.1 NAME 'caseIgnoreOrderingMatch-vi' DESC 'vi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.235.1.6 NAME 'caseIgnoreSubstringMatch-vi' DESC 'vi' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.236.1 NAME 'caseIgnoreOrderingMatch-yo' DESC 'yo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.236.1.6 NAME 'caseIgnoreSubstringMatch-yo' DESC 'yo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.237.1 NAME 'caseIgnoreOrderingMatch-zh-Hans' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.237.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hans' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.238.1 NAME 'caseIgnoreOrderingMatch-zh-Hans-CN' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.238.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hans-CN' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.239.1 NAME 'caseIgnoreOrderingMatch-zh-Hans-SG' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.239.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hans-SG' DESC 'zh-Hans' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.240.1 NAME 'caseIgnoreOrderingMatch-zh-Hant-HK' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.240.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hant-HK' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.241.1 NAME 'caseIgnoreOrderingMatch-zh-Hant-MO' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.241.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hant-MO' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.242.1 NAME 'caseIgnoreOrderingMatch-zh-Hant-TW' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.242.1.6 NAME 'caseIgnoreSubstringMatch-zh-Hant-TW' DESC 'zh-Hant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.243.1 NAME 'caseIgnoreOrderingMatch-zu' DESC 'zu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.243.1.6 NAME 'caseIgnoreSubstringMatch-zu' DESC 'zu' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.244.1 NAME 'caseIgnoreOrderingMatch-zu-ZA' DESC 'zu-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.244.1.6 NAME 'caseIgnoreSubstringMatch-zu-ZA' DESC 'zu-ZA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.0.3 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.0.3.6 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.3 NAME 'caseExactOrderingMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.3.2.11.3.6 NAME 'caseExactSubstringMatch-en' DESC 'en' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.23 NAME 'uniqueMemberMatch' DESC 'The uniqueMemberMatch rule compares an assertion value of the Name And Optional UID syntax to an attribute value of a syntax (e.g., the Name And Optional UID syntax) whose corresponding ASN.1 type is NameAndOptionalUID. The rule evaluates to TRUE if and only if the components of the assertion value and attribute value match according to the distinguishedNameMatch rule and either, (1) the component is absent from both the attribute value and assertion value, or (2) the component is present in both the attribute value and the assertion value and the component of the assertion value matches the component of the attribute value according to the bitStringMatch rule. Note that this matching rule has been altered from its description in X.520 [X.520] in order to make the matching rule commutative. Server implementors should consider using the original X.520 semantics (where the matching was less exact) for approximate matching of attributes with uniqueMemberMatch as the equality matching rule.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", + "( 2.5.13.8 NAME 'numericStringMatch' DESC 'The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.9 NAME 'numericStringOrderingMatch' DESC 'The rule evaluates to TRUE if and only if, in the code point collation order, the prepared attribute value character string appears earlier than the prepared assertion value character string; i.e., the attribute value is less than the assertion value.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.10 NAME 'numericStringSubstringsMatch' DESC 'The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value, (2) an initial substring, if present, matches the beginning of the prepared attribute value character string, and (3) a final substring, if present, matches the end of the prepared attribute value character string.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.20 NAME 'telephoneNumberMatch' DESC 'The telephoneNumberMatch rule compares an assertion value of the Telephone Number syntax to an attribute value of a syntax (e.g., the Telephone Number syntax) whose corresponding ASN.1 type is a PrintableString representing a telephone number. The rule evaluates to TRUE if and only if the prepared attribute value character string and the prepared assertion value character string have the same number of characters and corresponding characters have the same code point. In preparing the attribute value and assertion value for comparison, characters are case folded in the Map preparation step, and only telephoneNumber Insignificant Character Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' DESC 'The telephoneNumberSubstringsMatch rule compares an assertion value of the Substring Assertion syntax to an attribute value of a syntax (e.g., the Telephone Number syntax) whose corresponding ASN.1 type is a PrintableString representing a telephone number. The rule evaluates to TRUE if and only if (1) the prepared substrings of the assertion value match disjoint portions of the prepared attribute value character string in the order of the substrings in the assertion value, (2) an substring, if present, matches the beginning of the prepared attribute value character string, and (3) a substring, if present, matches the end of the prepared attribute value character string. A prepared substring matches a portion of the prepared attribute value character string if corresponding characters have the same code point. In preparing the attribute value and assertion value substrings for comparison, characters are case folded in the Map preparation step, and only telephoneNumber Insignificant Character Handling is applied in the Insignificant Character Handling step.' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )" + ], + "objectClass": [ + "top", + "ldapSubentry", + "subschema" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'top' ABSTRACT MUST objectClass X-ORIGIN 'RFC 4512' )", + "( 2.5.6.1 NAME 'alias' SUP top STRUCTURAL MUST aliasedObjectName X-ORIGIN 'RFC 4512' )", + "( 2.5.20.1 NAME 'subschema' AUXILIARY MAY ( dITStructureRules $ nameForms $ dITContentRules $ objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) X-ORIGIN 'RFC 4512' )", + "( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' SUP top AUXILIARY X-ORIGIN 'RFC 4512' )", + "( 2.5.6.11 NAME 'applicationProcess' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.2 NAME 'country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) X-ORIGIN 'RFC 4519' )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' SUP top AUXILIARY MUST dc X-ORIGIN 'RFC 4519' )", + "( 2.5.6.14 NAME 'device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.9 NAME 'groupOfNames' SUP top STRUCTURAL MUST cn MAY ( member $ businessCategory $ seeAlso $ owner $ ou $ o $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.17 NAME 'groupOfUniqueNames' SUP top STRUCTURAL MUST cn MAY ( uniqueMember $ businessCategory $ seeAlso $ owner $ ou $ o $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.3 NAME 'locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.4 NAME 'organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.6 NAME 'person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.8 NAME 'organizationalRole' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationalISDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP top STRUCTURAL MUST ou MAY ( businessCategory $ description $ destinationIndicator $ facsimileTelephoneNumber $ internationalISDNNumber $ l $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ preferredDeliveryMethod $ registeredAddress $ searchGuide $ seeAlso $ st $ street $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ userPassword $ x121Address ) X-ORIGIN 'RFC 4519' )", + "( 2.5.6.10 NAME 'residentialPerson' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) X-ORIGIN 'RFC 4519' )", + "( 1.3.6.1.1.3.1 NAME 'uidObject' SUP top AUXILIARY MUST uid X-ORIGIN 'RFC 4519' )", + "( 2.16.840.1.113719.2.142.6.1.1 NAME 'ldapSubEntry' DESC 'LDAP Subentry class, version 1' SUP top STRUCTURAL MAY cn X-ORIGIN 'LDAP Subentry Internet Draft' )", + "( 2.16.840.1.113730.3.2.40 NAME 'directoryServerFeature' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( oid $ cn $ multiLineDescription ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.41 NAME 'nsslapdPlugin' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsslapd-pluginPath $ nsslapd-pluginInitfunc $ nsslapd-pluginType $ nsslapd-pluginId $ nsslapd-pluginVersion $ nsslapd-pluginVendor $ nsslapd-pluginDescription $ nsslapd-pluginEnabled ) MAY ( nsslapd-pluginConfigArea $ nsslapd-plugin-depends-on-type ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.44 NAME 'nsIndex' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsSystemIndex ) MAY ( description $ nsIndexType $ nsMatchingRule $ nsIndexIDListScanLimit ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.109 NAME 'nsBackendInstance' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.110 NAME 'nsMappingTree' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.104 NAME 'nsContainer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.108 NAME 'nsDS5Replica' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( nsDS5ReplicaRoot $ nsDS5ReplicaId ) MAY ( cn $ nsds5ReplicaPreciseTombstonePurging $ nsds5ReplicaCleanRUV $ nsds5ReplicaAbortCleanRUV $ nsDS5ReplicaType $ nsDS5ReplicaBindDN $ nsState $ nsDS5ReplicaName $ nsDS5Flags $ nsDS5Task $ nsDS5ReplicaReferral $ nsDS5ReplicaAutoReferral $ nsds5ReplicaPurgeDelay $ nsds5ReplicaTombstonePurgeInterval $ nsds5ReplicaChangeCount $ nsds5ReplicaLegacyConsumer $ nsds5ReplicaProtocolTimeout $ nsds5ReplicaBackoffMin $ nsds5ReplicaBackoffMax ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.113 NAME 'nsTombstone' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( nstombstonecsn $ nsParentUniqueId $ nscpEntryDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.103 NAME 'nsDS5ReplicationAgreement' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsds5ReplicaCleanRUVNotified $ nsDS5ReplicaHost $ nsDS5ReplicaPort $ nsDS5ReplicaTransportInfo $ nsDS5ReplicaBindDN $ nsDS5ReplicaCredentials $ nsDS5ReplicaBindMethod $ nsDS5ReplicaRoot $ nsDS5ReplicatedAttributeList $ nsDS5ReplicatedAttributeListTotal $ nsDS5ReplicaUpdateSchedule $ nsds5BeginReplicaRefresh $ description $ nsds50ruv $ nsruvReplicaLastModified $ nsds5replicaTimeout $ nsds5replicaChangesSentSinceStartup $ nsds5replicaLastUpdateEnd $ nsds5replicaLastUpdateStart $ nsds5replicaLastUpdateStatus $ nsds5replicaUpdateInProgress $ nsds5replicaLastInitEnd $ nsds5ReplicaEnabled $ nsds5replicaLastInitStart $ nsds5replicaLastInitStatus $ nsds5debugreplicatimeout $ nsds5replicaBusyWaitTime $ nsds5ReplicaStripAttrs $ nsds5replicaSessionPauseTime $ nsds5ReplicaProtocolTimeout ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.39 NAME 'nsslapdConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.317 NAME 'nsSaslMapping' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsSaslMapRegexString $ nsSaslMapBaseDNTemplate $ nsSaslMapFilterTemplate ) MAY nsSaslMapPriority X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.43 NAME 'nsSNMP' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsSNMPEnabled ) MAY ( nsSNMPOrganization $ nsSNMPLocation $ nsSNMPContact $ nsSNMPDescription $ nsSNMPName $ nsSNMPMasterHost $ nsSNMPMasterPort ) X-ORIGIN 'Netscape Directory Server' )", + "( nsEncryptionConfig-oid NAME 'nsEncryptionConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsCertfile $ nsKeyfile $ nsSSL2 $ nsSSL3 $ nsTLS1 $ sslVersionMin $ sslVersionMax $ nsSSLSessionTimeout $ nsSSL3SessionTimeout $ nsSSLClientAuth $ nsSSL2Ciphers $ nsSSL3Ciphers $ nsSSLSupportedCiphers ) X-ORIGIN 'Netscape' )", + "( nsEncryptionModule-oid NAME 'nsEncryptionModule' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsSSLToken $ nsSSLPersonalitySSL $ nsSSLActivation ) X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.2.327 NAME 'rootDNPluginConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( rootdn-open-time $ rootdn-close-time $ rootdn-days-allowed $ rootdn-allow-host $ rootdn-deny-host $ rootdn-allow-ip $ rootdn-deny-ip ) X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.2.328 NAME 'nsSchemaPolicy' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( cn $ schemaUpdateObjectclassAccept $ schemaUpdateObjectclassReject $ schemaUpdateAttributeAccept $ schemaUpdateAttributeReject ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.31 NAME 'groupOfCertificates' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( memberCertificateDescription $ businessCategory $ description $ o $ ou $ owner $ seeAlso ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.33 NAME 'groupOfURLs' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( memberURL $ businessCategory $ description $ o $ ou $ owner $ seeAlso ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.35 NAME 'LDAPServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ l $ ou $ seeAlso $ generation $ changeLogMaximumAge $ changeLogMaximumSize ) X-ORIGIN 'Netscape Directory Server' )", + "( 1.3.6.1.4.1.250.3.18 NAME 'cacheObject' DESC 'object that contains the TTL (time to live) attribute type' SUP top STRUCTURAL MAY ttl X-ORIGIN 'LDAP Caching Internet Draft' )", + "( 2.16.840.1.113730.3.2.10 NAME 'netscapeServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ serverRoot $ serverProductName $ serverVersionNumber $ installationTimeStamp $ administratorContactInfo $ userPassword $ adminUrl $ serverHostName ) X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.2.7 NAME 'nsLicenseUser' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( nsLicensedFor $ nsLicenseStartTime $ nsLicenseEndTime ) X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.2.1 NAME 'changeLogEntry' DESC 'LDAP changelog objectclass' SUP top STRUCTURAL MUST ( targetDn $ changeTime $ changeNumber $ changeType ) MAY ( changes $ newRdn $ deleteOldRdn $ newSuperior ) X-ORIGIN 'Changelog Internet Draft' )", + "( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'LDAP referrals objectclass' SUP top STRUCTURAL MAY ref X-ORIGIN 'LDAPv3 referrals Internet Draft' )", + "( 2.16.840.1.113730.3.2.12 NAME 'passwordObject' DESC 'Netscape defined password policy objectclass' SUP top STRUCTURAL MAY ( pwdpolicysubentry $ passwordExpirationTime $ passwordExpWarned $ passwordRetryCount $ retryCountResetTime $ accountUnlockTime $ passwordHistory $ passwordAllowChangeTime $ passwordGraceUserTime ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.13 NAME 'passwordPolicy' DESC 'Netscape defined password policy objectclass' SUP top STRUCTURAL MAY ( passwordMaxAge $ passwordExp $ passwordMinLength $ passwordKeepHistory $ passwordInHistory $ passwordChange $ passwordWarning $ passwordLockout $ passwordMaxFailure $ passwordResetDuration $ passwordUnlock $ passwordLockoutDuration $ passwordCheckSyntax $ passwordMustChange $ passwordStorageScheme $ passwordMinAge $ passwordResetFailureCount $ passwordGraceLimit $ passwordMinDigits $ passwordMinAlphas $ passwordMinUppers $ passwordMinLowers $ passwordMinSpecials $ passwordMin8bit $ passwordMaxRepeats $ passwordMinCategories $ passwordMinTokenLength $ passwordTrackUpdateTime $ passwordAdminDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.30 NAME 'glue' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.32 NAME 'netscapeMachineData' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.38 NAME 'vlvSearch' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ vlvBase $ vlvScope $ vlvFilter ) MAY multiLineDescription X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.42 NAME 'vlvIndex' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ vlvSort ) MAY ( vlvEnabled $ vlvUses ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.84 NAME 'cosDefinition' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( costargettree $ costemplatedn $ cosspecifier $ cosAttribute $ aci $ cn $ uid ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.93 NAME 'nsRoleDefinition' DESC 'Netscape defined objectclass' SUP ldapSubEntry STRUCTURAL MAY ( description $ nsRoleScopeDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.94 NAME 'nsSimpleRoleDefinition' DESC 'Netscape defined objectclass' SUP nsRoleDefinition STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.95 NAME 'nsComplexRoleDefinition' DESC 'Netscape defined objectclass' SUP nsRoleDefinition STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.96 NAME 'nsManagedRoleDefinition' DESC 'Netscape defined objectclass' SUP nsSimpleRoleDefinition STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.97 NAME 'nsFilteredRoleDefinition' DESC 'Netscape defined objectclass' SUP nsComplexRoleDefinition STRUCTURAL MUST nsRoleFilter X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.98 NAME 'nsNestedRoleDefinition' DESC 'Netscape defined objectclass' SUP nsComplexRoleDefinition STRUCTURAL MUST nsRoleDN X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.99 NAME 'cosSuperDefinition' DESC 'Netscape defined objectclass' SUP ldapSubEntry STRUCTURAL MUST cosAttribute MAY description X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.100 NAME 'cosClassicDefinition' DESC 'Netscape defined objectclass' SUP cosSuperDefinition STRUCTURAL MAY ( costemplatedn $ cosspecifier ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.101 NAME 'cosPointerDefinition' DESC 'Netscape defined objectclass' SUP cosSuperDefinition STRUCTURAL MAY costemplatedn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.102 NAME 'cosIndirectDefinition' DESC 'Netscape defined objectclass' SUP cosSuperDefinition STRUCTURAL MAY cosIndirectSpecifier X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.503 NAME 'nsDSWindowsReplicationAgreement' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsDS5ReplicaHost $ nsDS5ReplicaPort $ nsDS5ReplicaTransportInfo $ nsDS5ReplicaBindDN $ nsDS5ReplicaCredentials $ nsDS5ReplicaBindMethod $ nsDS5ReplicaRoot $ nsDS5ReplicatedAttributeList $ nsDS5ReplicaUpdateSchedule $ nsds5BeginReplicaRefresh $ description $ nsds50ruv $ nsruvReplicaLastModified $ nsds5replicaTimeout $ nsds5replicaChangesSentSinceStartup $ nsds5replicaLastUpdateEnd $ nsds5replicaLastUpdateStart $ nsds5replicaLastUpdateStatus $ nsds5replicaUpdateInProgress $ nsds5replicaLastInitEnd $ nsds5replicaLastInitStart $ nsds5replicaLastInitStatus $ nsds5debugreplicatimeout $ nsds5replicaBusyWaitTime $ nsds5replicaSessionPauseTime $ nsds7WindowsReplicaSubtree $ nsds7DirectoryReplicaSubtree $ nsds7NewWinUserSyncEnabled $ nsds7NewWinGroupSyncEnabled $ nsds7WindowsDomain $ nsds7DirsyncCookie $ winSyncInterval $ oneWaySync $ winSyncMoveAction $ nsds5ReplicaEnabled $ winSyncDirectoryFilter $ winSyncWindowsFilter $ winSyncSubtreePair ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.128 NAME 'costemplate' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY ( cn $ cosPriority ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.304 NAME 'nsView' DESC 'Netscape defined objectclass' SUP top AUXILIARY MAY ( nsViewFilter $ description ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.316 NAME 'nsAttributeEncryption' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsEncryptionAlgorithm ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.5.6.21 NAME 'pkiUser' DESC 'X.509 PKI User' SUP top AUXILIARY MAY userCertificate X-ORIGIN 'RFC 4523' )", + "( 2.5.6.22 NAME 'pkiCA' DESC 'X.509 PKI Certificate Authority' SUP top AUXILIARY MAY ( cACertificate $ certificateRevocationList $ authorityRevocationList $ crossCertificatePair ) X-ORIGIN 'RFC 4523' )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' DESC 'X.509 CRL distribution point' SUP top STRUCTURAL MUST cn MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) X-ORIGIN 'RFC 4523' )", + "( 2.5.6.23 NAME 'deltaCRL' DESC 'X.509 delta CRL' SUP top AUXILIARY MAY deltaRevocationList X-ORIGIN 'RFC 4523' )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'X.521 strong authentication user' SUP top AUXILIARY MUST userCertificate X-ORIGIN 'RFC 4523' )", + "( 2.5.6.18 NAME 'userSecurityInformation' DESC 'X.521 user security information' SUP top AUXILIARY MAY supportedAlgorithms X-ORIGIN 'RFC 4523' )", + "( 2.5.6.16 NAME 'certificationAuthority' DESC 'X.509 certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair X-ORIGIN 'RFC 4523' )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' DESC 'X.509 certificate authority, version 2' SUP certificationAuthority AUXILIARY MAY deltaRevocationList X-ORIGIN 'RFC 4523' )", + "( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST uid MAY ( description $ seeAlso $ l $ o $ ou $ host ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( cn $ description $ seeAlso $ l $ o $ ou $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST cn MAY ( description $ l $ o $ ou $ seeAlso $ telephoneNumber ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST dc MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationalISDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description $ o $ associatedName ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' SUP top AUXILIARY MUST associatedDomain X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST co X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.14 NAME 'rFC822localPart' SUP domain STRUCTURAL MAY ( cn $ sn ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST cn MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) X-ORIGIN 'RFC 4524' )", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' SUP top AUXILIARY MUST userPassword X-ORIGIN 'RFC 4524' )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500UniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) X-ORIGIN 'RFC 2798' )", + "( 2.16.840.1.113730.3.2.322 NAME 'autoMemberDefinition' DESC 'Auto Membership Config Definition Entry' SUP top STRUCTURAL MUST ( cn $ autoMemberScope $ autoMemberFilter $ autoMemberGroupingAttr ) MAY ( autoMemberDefaultGroup $ autoMemberDisabled ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.323 NAME 'autoMemberRegexRule' DESC 'Auto Membership Regex Rule Entry' SUP top STRUCTURAL MUST ( cn $ autoMemberTargetGroup ) MAY ( autoMemberExclusiveRegex $ autoMemberInclusiveRegex $ description ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.324 NAME 'dnaPluginConfig' DESC 'DNA plugin configuration' SUP top AUXILIARY MAY ( dnaType $ dnaPrefix $ dnaNextValue $ dnaMaxValue $ dnaInterval $ dnaMagicRegen $ dnaFilter $ dnaScope $ dnaSharedCfgDN $ dnaThreshold $ dnaNextRange $ dnaRangeRequestTimeout $ dnaRemoteBindDN $ dnaRemoteBindCred $ cn ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.325 NAME 'dnaSharedConfig' DESC 'DNA Shared Configuration' SUP top AUXILIARY MAY ( dnaHostname $ dnaPortNum $ dnaSecurePortNum $ dnaRemoteBindMethod $ dnaRemoteConnProtocol $ dnaRemainingValues ) X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.319 NAME 'mepManagedEntry' DESC 'Managed Entries Managed Entry' SUP top AUXILIARY MAY mepManagedBy X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.320 NAME 'mepOriginEntry' DESC 'Managed Entries Origin Entry' SUP top AUXILIARY MAY mepManagedEntry X-ORIGIN '389 Directory Server' )", + "( 2.16.840.1.113730.3.2.321 NAME 'mepTemplateEntry' DESC 'Managed Entries Template Entry' SUP top AUXILIARY MAY ( cn $ mepStaticAttr $ mepMappedAttr $ mepRDNAttr ) X-ORIGIN '389 Directory Server' )", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST uid MAY ( userPassword $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST ( ipHostNumber $ cn ) MAY ( manager $ description $ l $ o $ ou $ owner $ seeAlso $ serialNumber ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( ipNetworkNumber $ cn ) MAY ( ipNetmaskNumber $ manager $ l $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY description X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST cn MAY ( macAddress $ description $ l $ o $ ou $ owner $ seeAlso $ serialNumber ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'Standard LDAP objectclass' SUP top AUXILIARY MUST cn MAY ( bootFile $ bootParameter $ description $ l $ o $ ou $ owner $ seeAlso $ serialNumber ) X-ORIGIN 'RFC 2307' )", + "( 1.3.6.1.1.1.2.13 NAME 'nisMap' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MUST nisMapName MAY description X-ORIGIN 'RFC 2307' )", + "( 2.16.840.1.113730.3.2.129 NAME 'inetDomain' DESC 'Auxiliary class for virtual domain nodes' SUP top AUXILIARY MAY ( inetDomainBaseDN $ inetDomainStatus ) X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.2.130 NAME 'inetUser' DESC 'Auxiliary class which must be present in an entry for delivery of subscriber services' SUP top AUXILIARY MAY ( uid $ inetUserStatus $ inetUserHttpURL $ userPassword $ memberOf ) X-ORIGIN 'Netscape subscriber interoperability' )", + "( 1.3.6.1.4.1.1466.101.120.141 NAME 'NetscapeLinkedOrganization' AUXILIARY MAY parentOrganization X-ORIGIN 'Netscape' )", + "( 1.3.6.1.4.1.1466.101.120.142 NAME 'NetscapePreferences' AUXILIARY MAY ( preferredLanguage $ preferredLocale $ preferredTimeZone ) X-ORIGIN 'Netscape' )", + "( 2.16.840.1.113730.3.2.134 NAME 'inetSubscriber' SUP top AUXILIARY MAY ( inetSubscriberAccountId $ inetSubscriberChallenge $ inetSubscriberResponse ) X-ORIGIN 'Netscape subscriber interoperability' )", + "( 2.16.840.1.113730.3.2.112 NAME 'inetAdmin' DESC 'Marker for an administrative group or user' SUP top AUXILIARY MAY ( aci $ memberOf $ adminRole ) X-ORIGIN 'Netscape Delegated Administrator' )", + "( 1.3.6.1.4.1.42.2.27.4.2.1 NAME 'javaContainer' DESC 'Container for a Java object' SUP top STRUCTURAL MUST cn X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.4 NAME 'javaObject' DESC 'Java object representation' SUP top ABSTRACT MUST javaClassName MAY ( javaClassNames $ javaCodebase $ javaDoc $ description ) X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.5 NAME 'javaSerializedObject' DESC 'Java serialized object' SUP javaObject AUXILIARY MUST javaSerializedData X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.7 NAME 'javaNamingReference' DESC 'JNDI reference' SUP javaObject AUXILIARY MAY ( javaReferenceAddress $ javaFactory ) X-ORIGIN 'RFC 2713' )", + "( 1.3.6.1.4.1.42.2.27.4.2.8 NAME 'javaMarshalledObject' DESC 'Java marshalled object' SUP javaObject AUXILIARY MUST javaSerializedData X-ORIGIN 'RFC 2713' )", + "( 0.9.2342.19200300.100.4.3 NAME 'pilotObject' DESC 'Standard LDAP objectclass' SUP top STRUCTURAL MAY ( audio $ ditRedirect $ info $ jpegPhoto $ lastModifiedBy $ lastModifiedTime $ manager $ photo $ uniqueIdentifier ) X-ORIGIN 'RFC 1274' )", + "( nsAdminDomain-oid NAME 'nsAdminDomain' DESC 'Netscape defined objectclass' SUP organizationalUnit STRUCTURAL MAY nsAdminDomainName X-ORIGIN 'Netscape' )", + "( nsHost-oid NAME 'nsHost' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( serverHostName $ description $ l $ nsHostLocation $ nsHardwarePlatform $ nsOsVersion ) X-ORIGIN 'Netscape' )", + "( nsAdminGroup-oid NAME 'nsAdminGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsAdminGroupName $ description $ nsConfigRoot $ nsAdminSIEDN ) X-ORIGIN 'Netscape' )", + "( nsApplication-oid NAME 'nsApplication' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsVendor $ description $ nsProductName $ nsNickName $ nsProductVersion $ nsBuildNumber $ nsRevisionNumber $ nsSerialNumber $ nsInstalledLocation $ installationTimeStamp $ nsExpirationDate $ nsBuildSecurity $ nsLdapSchemaVersion $ nsServerMigrationClassname $ nsServerCreationClassname ) X-ORIGIN 'Netscape' )", + "( nsResourceRef-oid NAME 'nsResourceRef' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY seeAlso X-ORIGIN 'Netscape' )", + "( nsTask-oid NAME 'nsTask' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsTaskLabel $ nsHelpRef $ nsExecRef $ nsLogSuppress ) X-ORIGIN 'Netscape' )", + "( nsTaskGroup-oid NAME 'nsTaskGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY nsTaskLabel X-ORIGIN 'Netscape' )", + "( nsAdminObject-oid NAME 'nsAdminObject' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsJarfilename $ nsClassname ) X-ORIGIN 'Netscape' )", + "( nsConfig-oid NAME 'nsConfig' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ nsServerPort $ nsServerAddress $ nsSuiteSpotUser $ nsErrorLog $ nsPidLog $ nsAccessLog $ nsDefaultAcceptLanguage $ nsServerSecurity ) X-ORIGIN 'Netscape' )", + "( nsDirectoryInfo-oid NAME 'nsDirectoryInfo' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsBindDN $ nsBindPassword $ nsDirectoryURL $ nsDirectoryFailoverList $ nsDirectoryInfoRef ) X-ORIGIN 'Netscape' )", + "( nsAdminServer-oid NAME 'nsAdminServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsServerID ) MAY description X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminConfig-oid NAME 'nsAdminConfig' DESC 'Netscape defined objectclass' SUP nsConfig STRUCTURAL MAY ( nsAdminCgiWaitPid $ nsAdminUsers $ nsAdminAccessHosts $ nsAdminAccessAddresses $ nsAdminOneACLDir $ nsAdminEnableDSGW $ nsAdminEnableEnduser $ nsAdminCacheLifetime ) X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminResourceEditorExtension-oid NAME 'nsAdminResourceEditorExtension' DESC 'Netscape defined objectclass' SUP nsAdminObject STRUCTURAL MAY ( nsAdminAccountInfo $ nsDeleteclassname ) X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminGlobalParameters-oid NAME 'nsAdminGlobalParameters' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsAdminEndUserHTMLIndex $ nsNickName ) X-ORIGIN 'Netscape Administration Services' )", + "( nsGlobalParameters-oid NAME 'nsGlobalParameters' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsUniqueAttribute $ nsUserIDFormat $ nsUserRDNComponent $ nsGroupRDNComponent $ nsWellKnownJarfiles $ nsNYR ) X-ORIGIN 'Netscape Administration Services' )", + "( nsDefaultObjectClasses-oid NAME 'nsDefaultObjectClasses' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY nsDefaultObjectClass X-ORIGIN 'Netscape Administration Services' )", + "( nsAdminConsoleUser-oid NAME 'nsAdminConsoleUser' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY nsPreference X-ORIGIN 'Netscape Administration Services' )", + "( nsCustomView-oid NAME 'nsCustomView' DESC 'Netscape defined objectclass' SUP nsAdminObject STRUCTURAL MAY nsDisplayName X-ORIGIN 'Netscape Administration Services' )", + "( nsTopologyCustomView-oid NAME 'nsTopologyCustomView' DESC 'Netscape defined objectclass' SUP nsCustomView STRUCTURAL MAY nsViewConfiguration X-ORIGIN 'Netscape Administration Services' )", + "( nsTopologyPlugin-oid NAME 'nsTopologyPlugin' DESC 'Netscape defined objectclass' SUP nsAdminObject STRUCTURAL X-ORIGIN 'Netscape Administration Services' )", + "( 2.16.840.1.113730.3.2.18 NAME 'netscapeCertificateServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Certificate Management System' )", + "( nsCertificateServer-oid NAME 'nsCertificateServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST nsServerID MAY ( serverHostName $ nsServerPort $ nsCertConfig ) X-ORIGIN 'Netscape Certificate Management System' )", + "( 2.16.840.1.113730.3.2.23 NAME 'netscapeDirectoryServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL X-ORIGIN 'Netscape Directory Server' )", + "( nsDirectoryServer-oid NAME 'nsDirectoryServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST nsServerID MAY ( serverHostName $ nsServerPort $ nsSecureServerPort $ nsBindPassword $ nsBindDN $ nsBaseDN ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.8 NAME 'ntUser' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ntUserDomainId MAY ( description $ l $ ou $ seeAlso $ ntUserPriv $ ntUserHomeDir $ ntUserComment $ ntUserFlags $ ntUserScriptPath $ ntUserAuthFlags $ ntUserUsrComment $ ntUserParms $ ntUserWorkstations $ ntUserLastLogon $ ntUserLastLogoff $ ntUserAcctExpires $ ntUserMaxStorage $ ntUserUnitsPerWeek $ ntUserLogonHours $ ntUserBadPwCount $ ntUserNumLogons $ ntUserLogonServer $ ntUserCountryCode $ ntUserCodePage $ ntUserUniqueId $ ntUserPrimaryGroupId $ ntUserProfile $ ntUserHomeDirDrive $ ntUserPasswordExpired $ ntUserCreateNewAccount $ ntUserDeleteAccount $ ntUniqueId ) X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.2.9 NAME 'ntGroup' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ntUserDomainId MAY ( description $ l $ ou $ seeAlso $ ntGroupId $ ntGroupAttributes $ ntGroupCreateNewGroup $ ntGroupDeleteGroup $ ntGroupType $ ntUniqueId $ mail ) X-ORIGIN 'Netscape NT Synchronization' )", + "( 2.16.840.1.113730.3.2.82 NAME 'nsChangelog4Config' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.114 NAME 'nsConsumer4Config' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MAY cn X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.36 NAME 'LDAPReplica' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( description $ l $ ou $ seeAlso $ replicaRoot $ replicaHost $ replicaPort $ replicaBindDn $ replicaCredentials $ replicaBindMethod $ replicaUseSSL $ replicaUpdateSchedule $ replicaUpdateReplayed $ replicaUpdateFailedAt $ replicaBeginOrc $ replicaNickName $ replicaEntryFilter $ replicatedattributelist $ replicaCFUpdated $ replicaAbandonedChanges $ replicaLastRelevantChange ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.11 NAME 'cirReplicaSource' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( cirReplicaRoot $ cirHost $ cirPort $ cirBindDn $ cirUsePersistentSearch $ cirUseSsl $ cirBindCredentials $ cirLastUpdateApplied $ cirUpdateSchedule $ cirSyncInterval $ cirUpdateFailedat $ cirBeginORC $ replicaNickName $ replicaEntryFilter $ replicatedattributelist ) X-ORIGIN 'Netscape Directory Server' )", + "( 2.16.840.1.113730.3.2.3 NAME 'mailRecipient' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MAY ( cn $ mail $ mailAlternateAddress $ mailHost $ mailRoutingAddress $ mailAccessDomain $ mailAutoReplyMode $ mailAutoReplyText $ mailDeliveryOption $ mailForwardingAddress $ mailMessageStore $ mailProgramDeliveryInfo $ mailQuota $ multiLineDescription $ uid $ userPassword ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.113730.3.2.37 NAME 'nsMessagingServerUser' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MAY ( cn $ mailAccessDomain $ mailAutoReplyMode $ mailAutoReplyText $ mailDeliveryOption $ mailForwardingAddress $ mailMessageStore $ mailProgramDeliveryInfo $ mailQuota $ nsmsgDisallowAccess $ nsmsgNumMsgQuota $ nswmExtendedUserPrefs $ vacationstartdate $ vacationenddate ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.4 NAME 'mailGroup' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MAY ( cn $ mail $ mailAlternateAddress $ mailHost $ mailRoutingAddress $ mgrpAddHeader $ mgrpAllowedBroadcaster $ mgrpAllowedDomain $ mgrpApprovePassword $ mgrpBroadcasterPolicy $ mgrpDeliverTo $ mgrpErrorsTo $ mgrpModerator $ mgrpMsgMaxSize $ mgrpMsgRejectAction $ mgrpMsgRejectText $ mgrpNoDuplicateChecks $ mgrpRemoveHeader $ mgrpRFC822MailMember $ owner ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.5 NAME 'groupOfMailEnhancedUniqueNames' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY MUST cn MAY ( businessCategory $ description $ mailEnhancedUniqueMember $ o $ ou $ owner $ seeAlso ) X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.24 NAME 'netscapeMailServer' DESC 'Netscape Messaging Server 4.x defined objectclass' SUP top AUXILIARY X-ORIGIN 'Netscape Messaging Server 4.x' )", + "( 2.16.840.1.113730.3.2.45 NAME 'nsValueItem' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST cn MAY ( nsValueCIS $ nsValueCES $ nsValueTel $ nsValueInt $ nsValueBin $ nsValueDN $ nsValueType $ nsValueSyntax $ nsValueDescription $ nsValueHelpURL $ nsValueFlags $ nsValueDefault ) X-ORIGIN 'Netscape servers - value item' )", + "( 2.16.840.1.113730.3.2.29 NAME 'netscapeWebServer' DESC 'Netscape defined objectclass' SUP top STRUCTURAL MUST ( cn $ nsServerID ) MAY ( description $ nsServerPort ) X-ORIGIN 'Netscape Web Server' )", + "( 2.16.840.1.113730.3.2.154 NAME 'netscapeReversiblePasswordObject' DESC 'object that contains an netscapeReversiblePassword' AUXILIARY MAY netscapeReversiblePassword X-ORIGIN 'Netscape Web Server' )", + "( 1.3.6.1.4.1.11.1.3.2.2.1 NAME 'accountPolicy' DESC 'Account policy entry' SUP top AUXILIARY MAY accountInactivityLimit X-ORIGIN 'Account Policy Plugin' )", + "( 1.3.6.1.1.1.2.17 NAME 'automount' DESC 'An entry in an automounter map' SUP top STRUCTURAL MUST ( cn $ automountInformation ) MAY description X-ORIGIN 'draft-howard-rfc2307bis' )", + "( 1.3.6.1.1.1.2.16 NAME 'automountMap' DESC 'An group of related automount objects' SUP top STRUCTURAL MUST ou X-ORIGIN 'draft-howard-rfc2307bis' )", + "( 1.3.6.1.4.1.5923.1.1.2 NAME 'eduPerson' AUXILIARY MAY ( eduPersonAffiliation $ eduPersonNickName $ eduPersonOrgDN $ eduPersonOrgUnitDN $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonPrimaryOrgUnitDN $ eduPersonScopedAffiliation ) X-ORIGIN 'http://middleware.internet2.edu/eduperson/' )", + "( 1.3.6.1.4.1.13769.9.1 NAME 'mozillaAbPersonAlpha' SUP top AUXILIARY MUST cn MAY ( c $ description $ displayName $ facsimileTelephoneNumber $ givenName $ homePhone $ l $ mail $ mobile $ mozillaCustom1 $ mozillaCustom2 $ mozillaCustom3 $ mozillaCustom4 $ mozillaHomeCountryName $ mozillaHomeLocalityName $ mozillaHomePostalCode $ mozillaHomeState $ mozillaHomeStreet $ mozillaHomeStreet2 $ mozillaHomeUrl $ mozillaNickname $ mozillaSecondEmail $ mozillaUseHtmlMail $ mozillaWorkStreet2 $ mozillaWorkUrl $ nsAIMid $ o $ ou $ pager $ postalCode $ postOfficeBox $ sn $ st $ street $ telephoneNumber $ title ) X-ORIGIN 'Mozilla Address Book' )", + "( 1.3.6.1.4.1.5322.17.1.1 NAME 'authorizedServiceObject' DESC 'Auxiliary object class for adding authorizedService attribute' SUP top AUXILIARY MAY authorizedService X-ORIGIN 'NSS LDAP schema' )", + "( 1.3.6.1.4.1.5322.17.1.2 NAME 'hostObject' DESC 'Auxiliary object class for adding host attribute' SUP top AUXILIARY MAY host X-ORIGIN 'NSS LDAP schema' )", + "( 2.16.840.1.113730.3.2.318 NAME 'pamConfig' DESC 'PAM plugin configuration' SUP top AUXILIARY MAY ( cn $ pamMissingSuffix $ pamExcludeSuffix $ pamIncludeSuffix $ pamIDAttr $ pamIDMapMethod $ pamFallback $ pamSecure $ pamService $ pamFilter ) X-ORIGIN 'Red Hat Directory Server' )", + "( 2.16.840.1.113730.3.2.326 NAME 'dynamicGroup' DESC 'Group containing internal dynamically-generated members' SUP posixGroup AUXILIARY MAY dsOnlyMemberUid X-ORIGIN 'Red Hat Directory Server' )", + "( 1.3.6.1.4.1.6981.11.2.3 NAME 'PureFTPdUser' DESC 'PureFTPd user with optional quota, throttling and ratio' STRUCTURAL MAY ( FTPStatus $ FTPQuotaFiles $ FTPQuotaMBytes $ FTPUploadRatio $ FTPDownloadRatio $ FTPUploadBandwidth $ FTPDownloadBandwidth $ FTPuid $ FTPgid ) X-ORIGIN 'Pure-FTPd' )", + "( 1.2.840.113556.1.5.87 NAME 'calEntry' DESC 'RFC2739: Calendar Entry' SUP top AUXILIARY MAY ( calCalURI $ calFBURL $ calOtherCalURIs $ calOtherFBURLs $ calCAPURI $ calOtherCAPURIs ) X-ORIGIN 'rfc2739' )", + "( 1.3.18.0.2.6.258 NAME 'printerAbstract' DESC 'Printer related information.' SUP top ABSTRACT MAY ( printer-name $ printer-natural-language-configured $ printer-location $ printer-info $ printer-more-info $ printer-make-and-model $ printer-multiple-document-jobs-supported $ printer-charset-configured $ printer-charset-supported $ printer-generated-natural-language-supported $ printer-document-format-supported $ printer-color-supported $ printer-compression-supported $ printer-pages-per-minute $ printer-pages-per-minute-color $ printer-finishings-supported $ printer-number-up-supported $ printer-sides-supported $ printer-media-supported $ printer-media-local-supported $ printer-resolution-supported $ printer-print-quality-supported $ printer-job-priority-supported $ printer-copies-supported $ printer-job-k-octets-supported $ printer-current-operator $ printer-service-person $ printer-delivery-orientation-supported $ printer-stacking-order-supported $ printer-output-features-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.255 NAME 'printerService' DESC 'Printer information.' SUP printerAbstract STRUCTURAL MAY ( printer-uri $ printer-xri-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.257 NAME 'printerServiceAuxClass' DESC 'Printer information.' SUP printerAbstract AUXILIARY MAY ( printer-uri $ printer-xri-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.256 NAME 'printerIPP' DESC 'Internet Printing Protocol (IPP) information.' SUP top AUXILIARY MAY ( printer-ipp-versions-supported $ printer-multiple-document-jobs-supported ) X-ORIGIN 'rfc3712' )", + "( 1.3.18.0.2.6.253 NAME 'printerLPR' DESC 'LPR information.' SUP top AUXILIARY MUST printer-name MAY printer-aliases X-ORIGIN 'rfc3712' )", + "( 1.3.6.1.4.1.2312.4.3.4.1 NAME 'sabayonProfile' DESC 'sabayon profile' SUP top STRUCTURAL MUST cn MAY ( sabayonProfileURL $ description ) X-ORIGIN 'Sabayon' )", + "( 1.3.6.1.4.1.2312.4.3.4.2 NAME 'sabayonProfileNameObject' DESC 'contains sabayon profile name' SUP top AUXILIARY MUST sabayonProfileName X-ORIGIN 'Sabayon' )", + "( 1.3.6.1.4.1.2312.4.3.4.3 NAME 'sabayonProfileURLObject' DESC 'contains sabayon profile' SUP top AUXILIARY MUST cn MAY sabayonProfileURL X-ORIGIN 'Sabayon' )", + "( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'Sudoer Entries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoNotBefore $ sudoNotAfter $ sudoOrder $ description ) X-ORIGIN 'SUDO' )", + "( 5.3.6.1.1.1.2.0 NAME 'trustAccount' DESC 'Sets trust accounts information' SUP top AUXILIARY MUST trustModel MAY accessTo X-ORIGIN 'nss_ldap/pam_ldap' )" + ] + }, + "schema_entry": "cn=schema", + "type": "SchemaInfo" +} +""" + +ds389_1_3_3_dsa_info = """ +{ + "raw": { + "aci": [ + "(targetattr != \\"aci\\")(version 3.0; aci \\"rootdse anon read access\\"; allow(read,search,compare) userdn=\\"ldap:///anyone\\";)" + ], + "dataversion": [ + "020141110230816" + ], + "defaultnamingcontext": [ + "dc=labldap06,dc=a3,dc=internal,dc=cloudapp,dc=net" + ], + "namingContexts": [ + "dc=labldap06,dc=a3,dc=internal,dc=cloudapp,dc=net" + ], + "netscapemdsuffix": [ + "cn=ldap://dc=DS3891,dc=labldap06,dc=a3,dc=internal,dc=cloudapp,dc=net:389" + ], + "objectClass": [ + "top" + ], + "subschemaSubentry": [ + "cn=schema" + ], + "supportedControl": [ + "2.16.840.1.113730.3.4.2", + "2.16.840.1.113730.3.4.3", + "2.16.840.1.113730.3.4.4", + "2.16.840.1.113730.3.4.5", + "1.2.840.113556.1.4.473", + "2.16.840.1.113730.3.4.9", + "2.16.840.1.113730.3.4.16", + "2.16.840.1.113730.3.4.15", + "2.16.840.1.113730.3.4.17", + "2.16.840.1.113730.3.4.19", + "1.3.6.1.1.13.1", + "1.3.6.1.1.13.2", + "1.3.6.1.4.1.42.2.27.8.5.1", + "1.3.6.1.4.1.42.2.27.9.5.2", + "1.2.840.113556.1.4.319", + "1.3.6.1.4.1.42.2.27.9.5.8", + "1.3.6.1.4.1.4203.666.5.16", + "2.16.840.1.113730.3.4.14", + "2.16.840.1.113730.3.4.20", + "1.3.6.1.4.1.1466.29539.12", + "2.16.840.1.113730.3.4.12", + "2.16.840.1.113730.3.4.18", + "2.16.840.1.113730.3.4.13" + ], + "supportedExtension": [ + "2.16.840.1.113730.3.5.7", + "2.16.840.1.113730.3.5.8", + "2.16.840.1.113730.3.5.3", + "2.16.840.1.113730.3.5.12", + "2.16.840.1.113730.3.5.5", + "2.16.840.1.113730.3.5.6", + "2.16.840.1.113730.3.5.9", + "2.16.840.1.113730.3.5.4", + "2.16.840.1.113730.3.6.5", + "2.16.840.1.113730.3.6.6", + "2.16.840.1.113730.3.6.7", + "2.16.840.1.113730.3.6.8", + "1.3.6.1.4.1.4203.1.11.3", + "1.3.6.1.4.1.4203.1.11.1" + ], + "supportedLdapVersion": [ + "2", + "3" + ], + "supportedSASLMechanisms": [ + "EXTERNAL", + "PLAIN", + "DIGEST-MD5", + "ANONYMOUS", + "GSSAPI", + "LOGIN" + ], + "vendorName": [ + "389 Project" + ], + "vendorVersion": [ + "389-Directory/1.3.3.0 B2014.289.2022" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir888.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir888.py new file mode 100644 index 0000000..8243a7e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir888.py @@ -0,0 +1,1127 @@ +""" +""" + +# Created on 2014.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +edir_8_8_8_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 2.5.4.35 NAME 'userPassword' DESC 'Internal NDS policy forces this to be single-valued' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} USAGE directoryOperation )", + "( 2.5.18.1 NAME 'createTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.2 NAME 'modifyTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.10 NAME 'subschemaSubentry' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation )", + "( 2.5.21.9 NAME 'structuralObjectClass' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.49 NAME 'subordinateCount' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.48 NAME 'entryFlags' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.51 NAME 'federationBoundary' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.21.5 NAME 'attributeTypes' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", + "( 2.5.21.6 NAME 'objectClasses' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", + "( 1.3.6.1.1.20 NAME 'entryDN' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.1.4.1.2 NAME 'ACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.1 NAME 'aliasedObjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Aliased Object Name' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.6 NAME 'backLink' SYNTAX 2.16.840.1.113719.1.1.5.1.23 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Back Link' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.8 NAME 'binderyProperty' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Property' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.7 NAME 'binderyObjectRestriction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Object Restriction' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.9 NAME 'binderyType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Type' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.11 NAME 'cAPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.12 NAME 'cAPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.10 NAME 'Cartridge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'CN' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.78 NAME 'printerConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} SINGLE-VALUE X-NDS_NAME 'Printer Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.15 NAME 'Convergence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{1} SINGLE-VALUE X-NDS_UPPER_BOUND '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2} SINGLE-VALUE X-NDS_NAME 'C' X-NDS_LOWER_BOUND '2' X-NDS_UPPER_BOUND '2' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.18 NAME 'defaultQueue' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Default Queue' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.13 NAME ( 'description' 'multiLineDescription' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} X-NDS_NAME 'Description' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '1024' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.64 NAME 'partitionCreationTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Creation Time' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.23 NAME 'facsimileTelephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22{64512} X-NDS_NAME 'Facsimile Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.117 NAME 'highConvergenceSyncInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'High Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.25 NAME 'groupMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Group Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.26 NAME 'ndsHomeDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{255} SINGLE-VALUE X-NDS_NAME 'Home Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.27 NAME 'hostDevice' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Device' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.28 NAME 'hostResourceName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Host Resource Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.29 NAME 'hostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.30 NAME 'inheritedACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Inherited ACL' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.7 NAME ( 'l' 'localityname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'L' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.39 NAME 'loginAllowedTimeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{42} SINGLE-VALUE X-NDS_NAME 'Login Allowed Time Map' X-NDS_LOWER_BOUND '42' X-NDS_UPPER_BOUND '42' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.40 NAME 'loginDisabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Login Disabled' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.41 NAME 'loginExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.42 NAME 'loginGraceLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Grace Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.43 NAME 'loginGraceRemaining' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Grace Remaining' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.44 NAME 'loginIntruderAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 SINGLE-VALUE X-NDS_NAME 'Login Intruder Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.45 NAME 'loginIntruderAttempts' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Intruder Attempts' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.46 NAME 'loginIntruderLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Intruder Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.31 NAME 'intruderAttemptResetInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Attempt Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.47 NAME 'loginIntruderResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Intruder Reset Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.48 NAME 'loginMaximumSimultaneous' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Maximum Simultaneous' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.49 NAME 'loginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Login Script' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.50 NAME 'loginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.31 NAME ( 'member' 'uniqueMember' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Member' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.52 NAME 'Memory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.22 NAME 'eMailAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.14{64512} X-NDS_NAME 'EMail Address' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.55 NAME 'networkAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.56 NAME 'networkAddressRestriction' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address Restriction' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.57 NAME 'notify' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Notify' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.114 NAME 'Obituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.0 NAME 'objectClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_NAME 'Object Class' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.59 NAME 'operator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Operator' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'OU' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.10 NAME ( 'o' 'organizationname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'O' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.32 NAME 'owner' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Owner' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.63 NAME 'pageDescriptionLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Page Description Language' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.65 NAME 'passwordsUsed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'Passwords Used' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.66 NAME 'passwordAllowChange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Allow Change' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.67 NAME 'passwordExpirationInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Password Expiration Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.68 NAME 'passwordExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Password Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.69 NAME 'passwordMinimumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Password Minimum Length' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.70 NAME 'passwordRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.71 NAME 'passwordUniqueRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Unique Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.72 NAME 'path' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Path' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'Physical Delivery Office Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.16 NAME 'postalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'Postal Address' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.17 NAME 'postalCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Code' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.18 NAME 'postOfficeBox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Office Box' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.80 NAME 'printJobConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Print Job Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.79 NAME 'printerControl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Printer Control' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.82 NAME 'privateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.83 NAME 'Profile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.84 NAME 'publicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.85 NAME 'queue' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Queue' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.86 NAME 'queueDirectory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE X-NDS_NAME 'Queue Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.115 NAME 'Reference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.88 NAME 'Replica' SYNTAX 2.16.840.1.113719.1.1.5.1.16{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.89 NAME 'Resource' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.33 NAME 'roleOccupant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Role Occupant' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.116 NAME 'higherPrivileges' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Higher Privileges' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.92 NAME 'securityEquals' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Security Equals' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.34 NAME 'seeAlso' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'See Also' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.5 NAME 'serialNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Serial Number' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.95 NAME 'server' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Server' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'S' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.98 NAME 'status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Status' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.5.4.9 NAME 'street' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'SA' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.102 NAME 'supportedTypefaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Typefaces' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.101 NAME 'supportedServices' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Services' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.4 NAME ( 'sn' 'surname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Surname' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.20 NAME 'telephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} X-NDS_NAME 'Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.12 NAME 'title' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Title' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.111 NAME 'User' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.112 NAME 'Version' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.1 NAME 'accountBalance' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.4 NAME 'allowUnlimitedCredit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Allow Unlimited Credit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.118 NAME 'lowConvergenceResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Low Convergence Reset Time' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.54 NAME 'minimumAccountBalance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Minimum Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.104 NAME 'lowConvergenceSyncInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Low Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.21 NAME 'Device' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.53 NAME 'messageServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Message Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.34 NAME 'Language' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.100 NAME 'supportedConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Supported Connections' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.107 NAME 'typeCreatorMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Type Creator Map' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.108 NAME 'ndsUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'UID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.24 NAME 'groupID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'GID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.110 NAME 'unknownBaseClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Unknown Base Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.87 NAME 'receivedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.33 NAME 'synchronizedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Synchronized Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.5 NAME 'authorityRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Authority Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.13 NAME 'certificateRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Certificate Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.17 NAME 'ndsCrossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'Cross Certificate Pair' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.37 NAME 'lockedByIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Locked By Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.77 NAME 'printer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Printer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.20 NAME 'detectIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Detect Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.38 NAME 'lockoutAfterDetection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Lockout After Detection' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.32 NAME 'intruderLockoutResetInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Lockout Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.96 NAME 'serverHolds' SYNTAX 2.16.840.1.113719.1.1.5.1.23 X-NDS_NAME 'Server Holds' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.91 NAME 'sAPName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{47} SINGLE-VALUE X-NDS_NAME 'SAP Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '47' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.113 NAME 'Volume' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.35 NAME 'lastLoginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Last Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.81 NAME 'printServer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 SINGLE-VALUE X-NDS_NAME 'Print Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.119 NAME 'nNSDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'NNS Domain' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.120 NAME 'fullName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{127} X-NDS_NAME 'Full Name' X-NDS_UPPER_BOUND '127' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.121 NAME 'partitionControl' SYNTAX 2.16.840.1.113719.1.1.5.1.25 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Control' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.122 NAME 'revision' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Revision' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.123 NAME 'certificateValidityInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'Certificate Validity Interval' X-NDS_LOWER_BOUND '60' X-NDS_UPPER_BOUND '-1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.124 NAME 'externalSynchronizer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'External Synchronizer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.125 NAME 'messagingDatabaseLocation' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Messaging Database Location' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.126 NAME 'messageRoutingGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Message Routing Group' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.127 NAME 'messagingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Messaging Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.128 NAME 'Postmaster' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.162 NAME 'mailboxLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Mailbox Location' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.163 NAME 'mailboxID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Mailbox ID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.164 NAME 'externalName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'External Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.165 NAME 'securityFlags' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Security Flags' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.166 NAME 'messagingServerType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE X-NDS_NAME 'Messaging Server Type' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.167 NAME 'lastReferencedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Last Referenced Time' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.42 NAME 'givenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_NAME 'Given Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.43 NAME 'initials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} X-NDS_NAME 'Initials' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.44 NAME 'generationQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Generational Qualifier' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.171 NAME 'profileMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Profile Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.172 NAME 'dsRevision' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'DS Revision' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.16.840.1.113719.1.1.4.1.173 NAME 'supportedGateway' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} X-NDS_NAME 'Supported Gateway' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '4096' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.174 NAME 'equivalentToMe' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Equivalent To Me' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.175 NAME 'replicaUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Replica Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.176 NAME 'partitionStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Status' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.177 NAME 'permanentConfigParms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Permanent Config Parms' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.178 NAME 'Timezone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.179 NAME 'binderyRestrictionLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Bindery Restriction Level' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.180 NAME 'transitiveVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Transitive Vector' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.181 NAME 'T' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.183 NAME 'purgeVector' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Purge Vector' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.184 NAME 'synchronizationTolerance' SYNTAX 2.16.840.1.113719.1.1.5.1.19 USAGE directoryOperation X-NDS_NAME 'Synchronization Tolerance' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.185 NAME 'passwordManagement' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Password Management' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.186 NAME 'usedBy' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Used By' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.187 NAME 'Uses' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.500 NAME 'obituaryNotify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Obituary Notify' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.501 NAME 'GUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.502 NAME 'otherGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} USAGE directoryOperation X-NDS_NAME 'Other GUID' X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.503 NAME 'auxiliaryClassFlag' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Auxiliary Class Flag' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.504 NAME 'unknownAuxiliaryClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} USAGE directoryOperation X-NDS_NAME 'Unknown Auxiliary Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userId' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'uniqueID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.1.25 NAME 'dc' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} X-NDS_NAME 'dc' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.507 NAME 'auxClassObjectClassBackup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'AuxClass Object Class Backup' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.508 NAME 'localReceivedUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Local Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.4 NAME 'federationControl' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.2 NAME 'federationSearchPath' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.3 NAME 'federationDNSName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.1 NAME 'federationBoundaryType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.14.4.1.4 NAME 'DirXML-Associations' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.18.3 NAME 'creatorsName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.18.4 NAME 'modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.300 NAME 'languageId' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.35 NAME 'ndsPredicate' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.36 NAME 'ndsPredicateState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.37 NAME 'ndsPredicateFlush' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.38 NAME 'ndsPredicateTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.40 NAME 'ndsPredicateStatsDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.39 NAME 'ndsPredicateUseValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.601 NAME 'syncPanePoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.600 NAME 'syncWindowVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.602 NAME 'objectVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'memberQueryURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'memberQuery' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.302 NAME 'excludedMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.525 NAME 'auxClassCompatibility' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.518 NAME 'ndsAgentPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.519 NAME 'ndsOperationCheckpoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.520 NAME 'localReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.521 NAME 'treeReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.522 NAME 'schemaResetLock' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.523 NAME 'modifiedACLEntry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.524 NAME 'monitoredConnection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.526 NAME 'localFederationBoundary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.527 NAME 'replicationFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.296 NAME 'loginActivationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.687 NAME 'UpdateInProgress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.400.1 NAME 'edirSchemaFlagVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.512 NAME 'indexDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.513 NAME 'ndsStatusRepair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.514 NAME 'ndsStatusExternalReference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.515 NAME 'ndsStatusObituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.516 NAME 'ndsStatusSchema' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.517 NAME 'ndsStatusLimber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.511 NAME 'authoritative' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'CachedAttrsOnExtRefs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.547 NAME 'ExtRefLastUpdatedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.688 NAME 'NCPKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.1.4.713 NAME 'UTF8LoginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.714 NAME 'loginScriptCharset' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.1.192 NAME 'lDAPLogLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Log Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.12 NAME 'lDAPUDPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP UDP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.1.4.1.204 NAME 'lDAPLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.205 NAME 'lDAPBackupLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Backup Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.206 NAME 'lDAPLogSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Log Size Limit' X-NDS_LOWER_BOUND '2048' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.1.4.1.194 NAME 'lDAPSearchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Size Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.195 NAME 'lDAPSearchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Time Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.207 NAME 'lDAPSuffix' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Suffix' )", + "( 2.16.840.1.113719.1.27.4.70 NAME 'ldapConfigVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.14 NAME 'ldapReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Referral' )", + "( 2.16.840.1.113719.1.27.4.73 NAME 'ldapDefaultReferralBehavior' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.23 NAME 'ldapSearchReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:searchReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.24 NAME 'lDAPOtherReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:otherReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.1 NAME 'ldapHostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Host Server' )", + "( 2.16.840.1.113719.1.27.4.2 NAME 'ldapGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Group' )", + "( 2.16.840.1.113719.1.27.4.3 NAME 'ldapTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Screen Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.4 NAME 'searchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.5 NAME 'searchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.6 NAME 'ldapServerBindLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Bind Limit' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.7 NAME 'ldapServerIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Idle Timeout' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.8 NAME 'ldapEnableTCP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable TCP' )", + "( 2.16.840.1.113719.1.27.4.10 NAME 'ldapEnableSSL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable SSL' )", + "( 2.16.840.1.113719.1.27.4.11 NAME 'ldapTCPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP TCP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.13 NAME 'ldapSSLPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP SSL Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.21 NAME 'filteredReplicaUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.22 NAME 'ldapKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP:keyMaterialName' )", + "( 2.16.840.1.113719.1.27.4.42 NAME 'extensionInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.27.4.45 NAME 'nonStdClientSchemaCompatMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.46 NAME 'sslEnableMutualAuthentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.62 NAME 'ldapEnablePSearch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.63 NAME 'ldapMaximumPSearchOperations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.64 NAME 'ldapIgnorePSearchLimitsForEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.65 NAME 'ldapTLSTrustedRootContainer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.27.4.66 NAME 'ldapEnableMonitorEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.67 NAME 'ldapMaximumMonitorEventsLoad' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.68 NAME 'ldapTLSRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.69 NAME 'ldapTLSVerifyClientCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.71 NAME 'ldapDerefAlias' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.72 NAME 'ldapNonStdAllUserAttrsMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.75 NAME 'ldapBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.79 NAME 'ldapInterfaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.80 NAME 'ldapChainSecureRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.82 NAME 'ldapStdCompliance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.83 NAME 'ldapDerefAliasOnAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.84 NAME 'ldapGeneralizedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.85 NAME 'ldapPermissiveModify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.15 NAME 'ldapServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server List' )", + "( 2.16.840.1.113719.1.27.4.16 NAME 'ldapAttributeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Attribute Map v11' )", + "( 2.16.840.1.113719.1.27.4.17 NAME 'ldapClassMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Class Map v11' )", + "( 2.16.840.1.113719.1.27.4.18 NAME 'ldapAllowClearTextPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Allow Clear Text Password' )", + "( 2.16.840.1.113719.1.27.4.19 NAME 'ldapAnonymousIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Anonymous Identity' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'ldapAttributeList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.53 NAME 'ldapClassList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.56 NAME 'transitionGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.74 NAME 'ldapTransitionBackLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.78 NAME 'ldapLBURPNumWriterThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.20 NAME 'ldapServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server' )", + "( 0.9.2342.19200300.100.1.3 NAME 'mail' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'Internet EMail Address' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'NSCP:employeeNumber' )", + "( 2.16.840.1.113719.1.27.4.76 NAME 'referralExcludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.77 NAME 'referralIncludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.5.4.36 NAME 'userCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'userCertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.37 NAME 'cACertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'cACertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.40 NAME 'crossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5{64512} X-NDS_NAME 'crossCertificatePair' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.58 NAME 'attributeCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.2 NAME 'knowledgeInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25{64512} X-NDS_NAME 'searchGuide' )", + "( 2.5.4.15 NAME 'businessCategory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52{64512} X-NDS_NAME 'telexNumber' )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51{64512} X-NDS_NAME 'teletexTerminalIdentifier' )", + "( 2.5.4.24 NAME 'x121Address' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '15' )", + "( 2.5.4.25 NAME 'internationaliSDNNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '16' )", + "( 2.5.4.26 NAME 'registeredAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'registeredAddress' )", + "( 2.5.4.27 NAME 'destinationIndicator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14{64512} SINGLE-VALUE X-NDS_NAME 'preferredDeliveryMethod' )", + "( 2.5.4.29 NAME 'presentationAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.43{64512} SINGLE-VALUE X-NDS_NAME 'presentationAddress' )", + "( 2.5.4.30 NAME 'supportedApplicationContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38{64512} X-NDS_NAME 'supportedApplicationContext' )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6{64512} X-NDS_NAME 'x500UniqueIdentifier' )", + "( 2.5.4.46 NAME 'dnQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64512} )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21{64512} X-NDS_NAME 'enhancedSearchGuide' )", + "( 2.5.4.48 NAME 'protocolInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.42{64512} X-NDS_NAME 'protocolInformation' )", + "( 2.5.4.51 NAME 'houseIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.52 NAME 'supportedAlgorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49{64512} X-NDS_NAME 'supportedAlgorithms' )", + "( 2.5.4.54 NAME 'dmdName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.4.49 NAME 'dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.1 NAME 'httpServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.3.4.2 NAME 'httpHostServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.3 NAME 'httpThreadsPerCPU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.4 NAME 'httpIOBufferSize' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.5 NAME 'httpRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.6 NAME 'httpKeepAliveRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.7 NAME 'httpSessionTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.8 NAME 'httpKeyMaterialObject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.9 NAME 'httpTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.10 NAME 'httpAuthRequiresTLS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.11 NAME 'httpDefaultClearPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.12 NAME 'httpDefaultTLSPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.13 NAME 'httpBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.295 NAME 'emboxConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.54.4.1.1 NAME 'trusteesOfNewObject' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'Trustees Of New Object' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.55.4.1.1 NAME 'newObjectSDSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's DS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.56.4.1.1 NAME 'newObjectSFSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'New Object's FS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.57.4.1.1 NAME 'setupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.58.4.1.1 NAME 'runSetupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Run Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.59.4.1.1 NAME 'membersOfTemplate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Members Of Template' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.60.4.1.1 NAME 'volumeSpaceRestrictions' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Volume Space Restrictions' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.61.4.1.1 NAME 'setPasswordAfterCreate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Set Password After Create' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.62.4.1.1 NAME 'homeDirectoryRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NAME 'Home Directory Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.63.4.1.1 NAME 'newObjectSSelfRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's Self Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.8.4.1 NAME 'digitalMeID' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.2 NAME 'assistant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.3 NAME 'assistantPhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.4 NAME 'city' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.5 NAME 'company' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.43 NAME 'co' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.6 NAME 'directReports' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.7 NAME 'mailstop' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.41 NAME 'mobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.42 NAME 'pager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.8 NAME 'workforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.9 NAME 'instantMessagingID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.10 NAME 'preferredName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.8.4.11 NAME 'jobCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.12 NAME 'siteLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.13 NAME 'employeeStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.14 NAME 'costCenter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.15 NAME 'costCenterDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.16 NAME 'tollFreePhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.17 NAME 'otherPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.18 NAME 'managerWorkforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.19 NAME 'jackNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.20 NAME 'vehicleInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.21 NAME 'accessCardNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.32 NAME 'isManager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.22 NAME 'homeCity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.23 NAME 'homeEmailAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 1.3.6.1.4.1.1466.101.120.31 NAME 'homeFax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.20 NAME 'homePhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.24 NAME 'homeState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} )", + "( 2.16.840.1.113719.1.8.4.25 NAME 'homeZipCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.26 NAME 'personalMobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.27 NAME 'children' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.28 NAME 'spouse' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.29 NAME 'vendorName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.30 NAME 'vendorAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.31 NAME 'vendorPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.1.4.1.303 NAME 'dgIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME_VALUE_ACCESS '1' )", + "( 2.16.840.1.113719.1.1.4.1.304 NAME 'dgTimeOut' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.305 NAME 'dgAllowUnknown' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.306 NAME 'dgAllowDuplicates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'allowAliasToAncestor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.39.4.1.1 NAME 'sASSecurityDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Security DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.2 NAME 'sASServiceDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Service DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.3 NAME 'sASSecretStore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:SecretStore' )", + "( 2.16.840.1.113719.1.39.4.1.4 NAME 'sASSecretStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Key' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.5 NAME 'sASSecretStoreData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Data' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.6 NAME 'sASPKIStoreKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:PKIStore:Keys' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.48.4.1.1 NAME 'nDSPKIPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.2 NAME 'nDSPKIPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Private Key' )", + "( 2.16.840.1.113719.1.48.4.1.3 NAME 'nDSPKIPublicKeyCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.4 NAME 'nDSPKICertificateChain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:Certificate Chain' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.5 NAME 'nDSPKIParentCA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA' )", + "( 2.16.840.1.113719.1.48.4.1.6 NAME 'nDSPKIParentCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA DN' )", + "( 2.16.840.1.113719.1.48.4.1.7 NAME 'nDSPKIKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Key File' )", + "( 2.16.840.1.113719.1.48.4.1.8 NAME 'nDSPKISubjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Subject Name' )", + "( 2.16.840.1.113719.1.48.4.1.11 NAME 'nDSPKIGivenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Given Name' )", + "( 2.16.840.1.113719.1.48.4.1.9 NAME 'nDSPKIKeyMaterialDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Key Material DN' )", + "( 2.16.840.1.113719.1.48.4.1.10 NAME 'nDSPKITreeCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Tree CA DN' )", + "( 2.16.840.1.113719.1.48.4.1.12 NAME 'nDSPKIUserCertificateInfo' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'NDSPKI:userCertificateInfo' )", + "( 2.16.840.1.113719.1.48.4.1.13 NAME 'nDSPKITrustedRootCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Trusted Root Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.14 NAME 'nDSPKINotBefore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not Before' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.15 NAME 'nDSPKINotAfter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not After' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.101 NAME 'nDSPKISDKeyServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:SD Key Server DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.102 NAME 'nDSPKISDKeyStruct' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:SD Key Struct' )", + "( 2.16.840.1.113719.1.48.4.1.103 NAME 'nDSPKISDKeyCert' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key Cert' )", + "( 2.16.840.1.113719.1.48.4.1.104 NAME 'nDSPKISDKeyID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key ID' )", + "( 2.16.840.1.113719.1.39.4.1.105 NAME 'nDSPKIKeystore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'NDSPKI:Keystore' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.106 NAME 'ndspkiAdditionalRoots' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.3 NAME 'masvLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.4 NAME 'masvProposedLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.5 NAME 'masvDefaultRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.6 NAME 'masvAuthorizedRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.7 NAME 'masvDomainPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.8 NAME 'masvClearanceNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.9 NAME 'masvLabelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.10 NAME 'masvLabelSecrecyLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.11 NAME 'masvLabelSecrecyCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.12 NAME 'masvLabelIntegrityLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.13 NAME 'masvLabelIntegrityCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.14 NAME 'masvPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.31.4.1.16 NAME 'masvNDSAttributeLabels' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.15 NAME 'masvPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.2 NAME 'sASLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'SAS:Login Sequence' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.8 NAME 'sASLoginPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy Update' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'sasNMASProductOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.74 NAME 'sasAuditConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.14 NAME 'sASNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.15 NAME 'sASPolicyCredentials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Policy Credentials' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.16 NAME 'sASPolicyMethods' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Methods' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.17 NAME 'sASPolicyObjectVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Policy Object Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.18 NAME 'sASPolicyServiceSubtypes' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Service Subtypes' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.19 NAME 'sASPolicyServices' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Services' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.20 NAME 'sASPolicyUsers' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Users' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.21 NAME 'sASAllowNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:Allow NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.9 NAME 'sASMethodIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Identifier' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.10 NAME 'sASMethodVendor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Vendor' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.11 NAME 'sASAdvisoryMethodGrade' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Advisory Method Grade' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.12 NAME 'sASVendorSupport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Vendor Support' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.13 NAME 'sasCertificateSearchContainers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.70 NAME 'sasNMASMethodConfigData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.22 NAME 'sASLoginClientMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.23 NAME 'sASLoginServerMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.24 NAME 'sASLoginClientMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.25 NAME 'sASLoginServerMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.26 NAME 'sasLoginClientMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.27 NAME 'sasLoginServerMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.28 NAME 'sasLoginClientMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.29 NAME 'sasLoginServerMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.30 NAME 'sasLoginClientMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.31 NAME 'sasLoginServerMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.32 NAME 'sasLoginClientMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.33 NAME 'sasLoginServerMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.34 NAME 'sasLoginClientMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.35 NAME 'sasLoginServerMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1000 NAME 'sasLoginClientMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1001 NAME 'sasLoginServerMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1002 NAME 'sasLoginClientMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1003 NAME 'sasLoginServerMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1004 NAME 'sasLoginClientMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1005 NAME 'sasLoginServerMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1006 NAME 'sasLoginClientMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1007 NAME 'sasLoginServerMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1008 NAME 'sasLoginClientMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1009 NAME 'sasLoginServerMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasLoginServerMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasLoginClientMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.78 NAME 'sasUnsignedMethodModules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.79 NAME 'sasServerModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.80 NAME 'sasServerModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.81 NAME 'sasSASLMechanismName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.82 NAME 'sasSASLMechanismEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.83 NAME 'sasClientModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.84 NAME 'sasClientModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.36 NAME 'sASLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Method Container DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.37 NAME 'sASLoginPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.63 NAME 'sasPostLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'rADIUSActiveConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Active Connections' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.39 NAME 'rADIUSAgedInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Aged Interval' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.40 NAME 'rADIUSAttributeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Attribute List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.41 NAME 'rADIUSAttributeLists' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Attribute Lists' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.42 NAME 'rADIUSClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Client' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.43 NAME 'rADIUSCommonNameResolution' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Common Name Resolution' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.44 NAME 'rADIUSConcurrentLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Concurrent Limit' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.45 NAME 'rADIUSConnectionHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Connection History' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.46 NAME 'rADIUSDASVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:DAS Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.47 NAME 'rADIUSDefaultProfile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Default Profile' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.48 NAME 'rADIUSDialAccessGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'RADIUS:Dial Access Group' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.49 NAME 'rADIUSEnableCommonNameLogin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Common Name Login' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.50 NAME 'rADIUSEnableDialAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Dial Access' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.51 NAME 'rADIUSInterimAcctingTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Interim Accting Timeout' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.52 NAME 'rADIUSLookupContexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'RADIUS:Lookup Contexts' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.53 NAME 'rADIUSMaxDASHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Max DAS History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.54 NAME 'rADIUSMaximumHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Maximum History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.55 NAME 'rADIUSPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Password' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.56 NAME 'rADIUSPasswordPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Password Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.57 NAME 'rADIUSPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Private Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.58 NAME 'rADIUSProxyContext' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Proxy Context' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.59 NAME 'rADIUSProxyDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Domain' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.60 NAME 'rADIUSProxyTarget' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Target' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.61 NAME 'rADIUSPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Public Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.62 NAME 'rADIUSServiceList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Service List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.3 NAME 'sASLoginSecret' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.4 NAME 'sASLoginSecretKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.5 NAME 'sASEncryptionType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Encryption Type' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.6 NAME 'sASLoginConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.7 NAME 'sASLoginConfigurationKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.73 NAME 'sasDefaultLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.64 NAME 'sasAuthorizedLoginSequences' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.69 NAME 'sasAllowableSubjectNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.71 NAME 'sasLoginFailureDelay' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.72 NAME 'sasMethodVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1010 NAME 'sasUpdateLoginInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasOTPEnabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasOTPCounter' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1013 NAME 'sasOTPLookAheadWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1014 NAME 'sasOTPDigits' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1015 NAME 'sasOTPReSync' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1016 NAME 'sasUpdateLoginTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.6.4.1 NAME 'snmpGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.2 NAME 'snmpServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.6.4.3 NAME 'snmpTrapConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.4 NAME 'snmpTrapDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.5 NAME 'snmpTrapInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.6 NAME 'snmpTrapDisable' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.528 NAME 'ndapPartitionPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.529 NAME 'ndapClassPasswordMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.530 NAME 'ndapPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.537 NAME 'ndapPartitionLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.538 NAME 'ndapClassLoginMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.539 NAME 'ndapLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.1 NAME 'nspmPasswordKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.2 NAME 'nspmPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.3 NAME 'nspmDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.4 NAME 'nspmPasswordHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.5 NAME 'nspmAdministratorChangeCount' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.6 NAME 'nspmPasswordPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.7 NAME 'nspmPreviousDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.8 NAME 'nspmDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.42.2.27.8.1.16 NAME 'pwdChangedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.17 NAME 'pwdAccountLockedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.19 NAME 'pwdFailureTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.39.43.4.100 NAME 'nspmConfigurationOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.102 NAME 'nspmChangePasswordMessage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.103 NAME 'nspmPasswordHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.104 NAME 'nspmPasswordHistoryExpiration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.105 NAME 'nspmMinPasswordLifetime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.106 NAME 'nspmAdminsDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.107 NAME 'nspmPasswordACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 )", + "( 2.16.840.1.113719.1.39.43.4.200 NAME 'nspmMaximumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.201 NAME 'nspmMinUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.202 NAME 'nspmMaxUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.203 NAME 'nspmMinLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.204 NAME 'nspmMaxLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.205 NAME 'nspmNumericCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.206 NAME 'nspmNumericAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.207 NAME 'nspmNumericAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.208 NAME 'nspmMinNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.209 NAME 'nspmMaxNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.210 NAME 'nspmSpecialCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.211 NAME 'nspmSpecialAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.212 NAME 'nspmSpecialAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.213 NAME 'nspmMinSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.214 NAME 'nspmMaxSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.215 NAME 'nspmMaxRepeatedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.216 NAME 'nspmMaxConsecutiveCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.217 NAME 'nspmMinUniqueCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.218 NAME 'nspmDisallowedAttributeValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.219 NAME 'nspmExcludeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.220 NAME 'nspmCaseSensitive' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.221 NAME 'nspmPolicyPrecedence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.222 NAME 'nspmExtendedCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.223 NAME 'nspmExtendedAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.224 NAME 'nspmExtendedAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.225 NAME 'nspmMinExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.226 NAME 'nspmMaxExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.227 NAME 'nspmUpperAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.228 NAME 'nspmUpperAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.229 NAME 'nspmLowerAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.230 NAME 'nspmLowerAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.231 NAME 'nspmComplexityRules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.233 NAME 'nspmAD2K8Syntax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.234 NAME 'nspmAD2K8maxViolation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.235 NAME 'nspmXCharLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.236 NAME 'nspmXCharHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.237 NAME 'nspmUnicodeAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.238 NAME 'nspmNonAlphaCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.239 NAME 'nspmMinNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.240 NAME 'nspmMaxNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.241 NAME 'nspmGraceLoginHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.300 NAME 'nspmPolicyAgentContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.301 NAME 'nspmPolicyAgentNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.302 NAME 'nspmPolicyAgentWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.303 NAME 'nspmPolicyAgentSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.304 NAME 'nspmPolicyAgentLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.305 NAME 'nspmPolicyAgentAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.306 NAME 'nspmPolicyAgentHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledUri' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'ldapPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.12.4.1.0 NAME 'auditAEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:A Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.2.0 NAME 'auditBEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:B Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.3.0 NAME 'auditContents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Contents' )", + "( 2.16.840.1.113719.1.12.4.4.0 NAME 'auditType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Type' )", + "( 2.16.840.1.113719.1.12.4.5.0 NAME 'auditCurrentEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Current Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.6.0 NAME 'auditFileLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Audit:File Link' )", + "( 2.16.840.1.113719.1.12.4.7.0 NAME 'auditLinkList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Audit:Link List' )", + "( 2.16.840.1.113719.1.12.4.8.0 NAME 'auditPath' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Path' )", + "( 2.16.840.1.113719.1.12.4.9.0 NAME 'auditPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Policy' )", + "( 2.16.840.1.113719.1.38.4.1.1 NAME 'wANMANWANPolicy' SYNTAX 2.16.840.1.113719.1.1.5.1.13{64512} X-NDS_NAME 'WANMAN:WAN Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.2 NAME 'wANMANLANAreaMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'WANMAN:LAN Area Membership' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.3 NAME 'wANMANCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'WANMAN:Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.4 NAME 'wANMANDefaultCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'WANMAN:Default Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.135.4.30 NAME 'rbsAssignedRoles' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.31 NAME 'rbsContent' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.32 NAME 'rbsContentMembership' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.33 NAME 'rbsEntryPoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.34 NAME 'rbsMember' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.35 NAME 'rbsOwnedCollections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.135.4.36 NAME 'rbsPath' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.37 NAME 'rbsParameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.38 NAME 'rbsTaskRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.39 NAME 'rbsTrusteeOf' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.40 NAME 'rbsType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '256' )", + "( 2.16.840.1.113719.1.135.4.41 NAME 'rbsURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.42 NAME 'rbsTaskTemplates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.43 NAME 'rbsTaskTemplatesURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.44 NAME 'rbsGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.45 NAME 'rbsPageMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.46 NAME 'rbsTargetObjectType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.135.4.47 NAME 'rbsContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.48 NAME 'rbsXMLInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.51 NAME 'rbsAssignedRoles2' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.52 NAME 'rbsOwnedCollections2' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.1.540 NAME 'prSyncPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.541 NAME 'prSyncAttributes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.542 NAME 'dsEncryptedReplicationConfig' SYNTAX 2.16.840.1.113719.1.1.5.1.19 )", + "( 2.16.840.1.113719.1.1.4.1.543 NAME 'encryptionPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.544 NAME 'attrEncryptionRequiresSecure' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.545 NAME 'attrEncryptionDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.48.4.1.16 NAME 'ndspkiCRLFileName' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.17 NAME 'ndspkiStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.18 NAME 'ndspkiIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.19 NAME 'ndspkiNextIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'ndspkiAttemptTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.21 NAME 'ndspkiTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.22 NAME 'ndspkiCRLMaxProcessingInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.23 NAME 'ndspkiCRLNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.24 NAME 'ndspkiDistributionPoints' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.25 NAME 'ndspkiCRLProcessData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.26 NAME 'ndspkiCRLConfigurationDNList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.27 NAME 'ndspkiCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.28 NAME 'ndspkiCRLContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.29 NAME 'ndspkiIssuedCertContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.30 NAME 'ndspkiDistributionPointDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.31 NAME 'ndspkiCRLConfigurationDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.32 NAME 'ndspkiDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} )", + "( 2.5.4.38 NAME 'authorityRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'ndspkiAuthorityRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.39 NAME 'certificateRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'ndspkiCertificateRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.53 NAME 'deltaRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'ndspkiDeltaRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.36 NAME 'ndspkiTrustedRootList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.37 NAME 'ndspkiSecurityRightsLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.48.4.1.38 NAME 'ndspkiKMOExport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.7.4.1 NAME 'notfSMTPEmailHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.2 NAME 'notfSMTPEmailFrom' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.3 NAME 'notfSMTPEmailUserName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.5 NAME 'notfMergeTemplateData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.6 NAME 'notfMergeTemplateSubject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.1 NAME 'nsimRequiredQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.2 NAME 'nsimRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.3 NAME 'nsimNumberRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.4 NAME 'nsimMinResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.5 NAME 'nsimMaxResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.6 NAME 'nsimForgottenLoginConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.7 NAME 'nsimForgottenAction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.8 NAME 'nsimAssignments' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.9 NAME 'nsimChallengeSetDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.10 NAME 'nsimChallengeSetGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.11 NAME 'nsimPwdRuleEnforcement' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.12 NAME 'nsimHint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.44.4.13 NAME 'nsimPasswordReminder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.4 NAME 'sssProxyStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.5 NAME 'sssProxyStoreSecrets' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.6 NAME 'sssActiveServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.7 NAME 'sssCacheRefreshInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.8 NAME 'sssAdminList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.266.4.9 NAME 'sssAdminGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.10 NAME 'sssEnableReadTimestamps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.11 NAME 'sssDisableMasterPasswords' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.12 NAME 'sssEnableAdminAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.13 NAME 'sssReadSecretPolicies' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.14 NAME 'sssServerPolicyOverrideDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.531 NAME 'eDirCloneSource' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.532 NAME 'eDirCloneKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.1.4.1.533 NAME 'eDirCloneLock' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.711 NAME 'groupMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.712 NAME 'nestedConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.717 NAME 'xdasDSConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.718 NAME 'xdasConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.719 NAME 'xdasVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.347.4.79 NAME 'NAuditInstrumentation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.347.4.2 NAME 'NAuditLoggingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.135.4.53 NAME 'rbsRoleMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.135.4.54 NAME 'rbsCategoryMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )" + ], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.1 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.2 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.3 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.4 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.5 X-NDS_SYNTAX '21' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 X-NDS_SYNTAX '7' )", + "( 2.16.840.1.113719.1.1.5.1.6 X-NDS_SYNTAX '6' )", + "( 1.3.6.1.4.1.1466.115.121.1.8 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.9 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.10 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.22 X-NDS_SYNTAX '22' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SYNTAX '1' )", + "( 1.3.6.1.4.1.1466.115.121.1.13 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.16 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.17 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.18 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.19 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.20 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.21 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 X-NDS_SYNTAX '11' )", + "( 1.3.6.1.4.1.1466.115.121.1.23 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 X-NDS_SYNTAX '24' )", + "( 1.3.6.1.4.1.1466.115.121.1.25 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 X-NDS_SYNTAX '2' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_SYNTAX '8' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 X-NDS_SYNTAX '9' )", + "( 1.2.840.113556.1.4.906 X-NDS_SYNTAX '29' )", + "( 1.3.6.1.4.1.1466.115.121.1.54 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.56 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.57 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.29 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.30 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.31 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.32 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.33 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.55 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.35 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.19 X-NDS_SYNTAX '19' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 X-NDS_SYNTAX '5' )", + "( 2.16.840.1.113719.1.1.5.1.17 X-NDS_SYNTAX '17' )", + "( 1.3.6.1.4.1.1466.115.121.1.37 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.13 X-NDS_SYNTAX '13' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.39 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 X-NDS_SYNTAX '18' )", + "( 1.3.6.1.4.1.1466.115.121.1.43 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 X-NDS_SYNTAX '4' )", + "( 1.3.6.1.4.1.1466.115.121.1.42 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.16 X-NDS_SYNTAX '16' )", + "( 1.3.6.1.4.1.1466.115.121.1.58 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.45 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.46 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.47 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.48 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.49 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.12 X-NDS_SYNTAX '12' )", + "( 2.16.840.1.113719.1.1.5.1.23 X-NDS_SYNTAX '23' )", + "( 2.16.840.1.113719.1.1.5.1.15 X-NDS_SYNTAX '15' )", + "( 2.16.840.1.113719.1.1.5.1.14 X-NDS_SYNTAX '14' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 X-NDS_SYNTAX '10' )", + "( 1.3.6.1.4.1.1466.115.121.1.51 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.25 X-NDS_SYNTAX '25' )", + "( 1.3.6.1.4.1.1466.115.121.1.53 X-NDS_SYNTAX '9' )" + ], + "modifyTimestamp": [ + "20141014222353Z" + ], + "objectClass": [ + "top", + "subschema" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'Top' STRUCTURAL MUST objectClass MAY ( cAPublicKey $ cAPrivateKey $ certificateValidityInterval $ authorityRevocation $ lastReferencedTime $ equivalentToMe $ ACL $ backLink $ binderyProperty $ Obituary $ Reference $ revision $ ndsCrossCertificatePair $ certificateRevocation $ usedBy $ GUID $ otherGUID $ DirXML-Associations $ creatorsName $ modifiersName $ objectVersion $ auxClassCompatibility $ unknownBaseClass $ unknownAuxiliaryClass $ masvProposedLabel $ masvDefaultRange $ masvAuthorizedRange $ auditFileLink $ rbsAssignedRoles $ rbsOwnedCollections $ rbsAssignedRoles2 $ rbsOwnedCollections2 ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '16#subtree#[Creator]#[Entry Rights]' )", + "( 1.3.6.1.4.1.42.2.27.1.2.1 NAME 'aliasObject' SUP Top STRUCTURAL MUST aliasedObjectName X-NDS_NAME 'Alias' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.2 NAME 'Country' SUP Top STRUCTURAL MUST c MAY ( description $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING 'c' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.3 NAME 'Locality' SUP Top STRUCTURAL MAY ( description $ l $ seeAlso $ st $ street $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING ( 'l' 'st' ) X-NDS_CONTAINMENT ( 'Country' 'organizationalUnit' 'Locality' 'Organization' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.4 NAME 'Organization' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST o MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'o' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'domain' ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST ou MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'ou' X-NDS_CONTAINMENT ( 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Unit' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.8 NAME 'organizationalRole' SUP Top STRUCTURAL MUST cn MAY ( description $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ roleOccupant $ seeAlso $ st $ street $ telephoneNumber $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Role' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.9 NAME ( 'groupOfNames' 'group' 'groupOfUniqueNames' ) SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ owner $ seeAlso $ groupID $ fullName $ eMailAddress $ mailboxLocation $ mailboxID $ Profile $ profileMembership $ loginScript $ businessCategory $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.6 NAME 'Person' SUP ndsLoginProperties STRUCTURAL MUST ( cn $ sn ) MAY ( description $ seeAlso $ telephoneNumber $ fullName $ givenName $ initials $ generationQualifier $ uid $ assistant $ assistantPhone $ city $ st $ company $ co $ directReports $ manager $ mailstop $ mobile $ personalTitle $ pager $ workforceID $ instantMessagingID $ preferredName $ photo $ jobCode $ siteLocation $ employeeStatus $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ otherPhoneNumber $ managerWorkforceID $ roomNumber $ jackNumber $ departmentNumber $ vehicleInformation $ accessCardNumber $ isManager $ userPassword ) X-NDS_NAMING ( 'cn' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP Person STRUCTURAL MAY ( facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ mailboxLocation $ mailboxID $ uid $ mail $ employeeNumber $ destinationIndicator $ internationaliSDNNumber $ preferredDeliveryMethod $ registeredAddress $ teletexTerminalIdentifier $ telexNumber $ x121Address $ businessCategory $ roomNumber $ x500UniqueIdentifier ) X-NDS_NAMING ( 'cn' 'ou' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP organizationalPerson STRUCTURAL MAY ( groupMembership $ ndsHomeDirectory $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ printJobConfiguration $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ messageServer $ Language $ ndsUID $ lockedByIntruder $ serverHolds $ lastLoginTime $ typeCreatorMap $ higherPrivileges $ printerControl $ securityFlags $ profileMembership $ Timezone $ sASServiceDN $ sASSecretStore $ sASSecretStoreKey $ sASSecretStoreData $ sASPKIStoreKeys $ userCertificate $ nDSPKIUserCertificateInfo $ nDSPKIKeystore $ rADIUSActiveConnections $ rADIUSAttributeLists $ rADIUSConcurrentLimit $ rADIUSConnectionHistory $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSPassword $ rADIUSServiceList $ audio $ businessCategory $ carLicense $ departmentNumber $ employeeNumber $ employeeType $ displayName $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledUri $ mail $ manager $ mobile $ o $ pager $ ldapPhoto $ preferredLanguage $ roomNumber $ secretary $ uid $ userSMIMECertificate $ x500UniqueIdentifier $ userPKCS12 $ sssProxyStoreKey $ sssProxyStoreSecrets $ sssServerPolicyOverrideDN ) X-NDS_NAME 'User' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#loginScript' '1#subtree#[Root Template]#[Entry Rights]' '2#entry#[Public]#messageServer' '2#entry#[Root Template]#groupMembership' '6#entry#[Self]#printJobConfiguration' '2#entry#[Root Template]#networkAddress') )", + "( 2.5.6.14 NAME 'Device' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ networkAddress $ ou $ o $ owner $ seeAlso $ serialNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.4 NAME 'Computer' SUP Device STRUCTURAL MAY ( operator $ server $ status ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.17 NAME 'Printer' SUP Device STRUCTURAL MAY ( Cartridge $ printerConfiguration $ defaultQueue $ hostDevice $ printServer $ Memory $ networkAddressRestriction $ notify $ operator $ pageDescriptionLanguage $ queue $ status $ supportedTypefaces ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.21 NAME 'Resource' SUP Top ABSTRACT MUST cn MAY ( description $ hostResourceName $ l $ ou $ o $ seeAlso $ Uses ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.20 NAME 'Queue' SUP Resource STRUCTURAL MUST queueDirectory MAY ( Device $ operator $ server $ User $ networkAddress $ Volume $ hostServer ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.3 NAME 'binderyQueue' SUP Queue STRUCTURAL MUST binderyType X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_NAME 'Bindery Queue' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.26 NAME 'Volume' SUP Resource STRUCTURAL MUST hostServer MAY status X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Root Template]#hostResourceName' '2#entry#[Root Template]#hostServer') )", + "( 2.16.840.1.113719.1.1.6.1.7 NAME 'directoryMap' SUP Resource STRUCTURAL MUST hostServer MAY path X-NDS_NAME 'Directory Map' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.19 NAME 'Profile' SUP Top STRUCTURAL MUST ( cn $ loginScript ) MAY ( description $ l $ ou $ o $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.22 NAME 'Server' SUP Top ABSTRACT MUST cn MAY ( description $ hostDevice $ l $ ou $ o $ privateKey $ publicKey $ Resource $ seeAlso $ status $ User $ Version $ networkAddress $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ fullName $ securityEquals $ securityFlags $ Timezone $ ndapClassPasswordMgmt $ ndapClassLoginMgmt ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Public]#networkAddress' '16#subtree#[Self]#[Entry Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.10 NAME 'ncpServer' SUP Server STRUCTURAL MAY ( operator $ supportedServices $ messagingServer $ dsRevision $ permanentConfigParms $ ndsPredicateStatsDN $ languageId $ indexDefinition $ CachedAttrsOnExtRefs $ NCPKeyMaterialName $ ldapServerDN $ httpServerDN $ emboxConfig $ sASServiceDN $ cACertificate $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKICertificateChain $ nDSPKIParentCADN $ nDSPKISDKeyID $ nDSPKISDKeyStruct $ snmpGroupDN $ wANMANWANPolicy $ wANMANLANAreaMembership $ wANMANCost $ wANMANDefaultCost $ encryptionPolicyDN $ eDirCloneSource $ eDirCloneLock $ xdasDSConfiguration $ xdasConfiguration $ xdasVersion $ NAuditLoggingServer $ NAuditInstrumentation ) X-NDS_NAME 'NCP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#messagingServer' )", + "( 2.16.840.1.113719.1.1.6.1.18 NAME 'printServer' SUP Server STRUCTURAL MAY ( operator $ printer $ sAPName ) X-NDS_NAME 'Print Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.31 NAME 'CommExec' SUP Server STRUCTURAL MAY networkAddressRestriction X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.2 NAME 'binderyObject' SUP Top STRUCTURAL MUST ( binderyObjectRestriction $ binderyType $ cn ) X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Bindery Object' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.15 NAME 'Partition' AUXILIARY MAY ( Convergence $ partitionCreationTime $ Replica $ inheritedACL $ lowConvergenceSyncInterval $ receivedUpTo $ synchronizedUpTo $ authorityRevocation $ certificateRevocation $ cAPrivateKey $ cAPublicKey $ ndsCrossCertificatePair $ lowConvergenceResetTime $ highConvergenceSyncInterval $ partitionControl $ replicaUpTo $ partitionStatus $ transitiveVector $ purgeVector $ synchronizationTolerance $ obituaryNotify $ localReceivedUpTo $ federationControl $ syncPanePoint $ syncWindowVector $ authoritative $ allowAliasToAncestor $ sASSecurityDN $ masvLabel $ ndapPartitionPasswordMgmt $ ndapPartitionLoginMgmt $ prSyncPolicyDN $ dsEncryptedReplicationConfig ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.0 NAME 'aFPServer' SUP Server STRUCTURAL MAY ( serialNumber $ supportedConnections ) X-NDS_NAME 'AFP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.27 NAME 'messagingServer' SUP Server STRUCTURAL MAY ( messagingDatabaseLocation $ messageRoutingGroup $ Postmaster $ supportedServices $ messagingServerType $ supportedGateway ) X-NDS_NAME 'Messaging Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#status' '2#entry#[Public]#messagingServerType' '2#entry#[Public]#messagingDatabaseLocation') )", + "( 2.16.840.1.113719.1.1.6.1.28 NAME 'messageRoutingGroup' SUP groupOfNames STRUCTURAL X-NDS_NAME 'Message Routing Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.29 NAME 'externalEntity' SUP Top STRUCTURAL MUST cn MAY ( description $ seeAlso $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ externalName $ mailboxLocation $ mailboxID ) X-NDS_NAMING ( 'cn' 'ou' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'External Entity' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#externalName' )", + "( 2.16.840.1.113719.1.1.6.1.30 NAME 'List' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ eMailAddress $ mailboxLocation $ mailboxID $ owner $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member' )", + "( 2.16.840.1.113719.1.1.6.1.32 NAME 'treeRoot' SUP Top STRUCTURAL MUST T MAY sssActiveServerList X-NDS_NAMING 'T' X-NDS_NAME 'Tree Root' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP ( Top $ ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST dc MAY ( searchGuide $ o $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ associatedName $ description $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'dc' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' AUXILIARY MUST dc X-NDS_NAMING 'dc' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.33 NAME 'ndsLoginProperties' SUP Top ABSTRACT MAY ( groupMembership $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ Language $ lockedByIntruder $ serverHolds $ lastLoginTime $ higherPrivileges $ securityFlags $ profileMembership $ Timezone $ loginActivationTime $ UTF8LoginScript $ loginScriptCharset $ sASNDSPasswordWindow $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAllowableSubjectNames $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPCounter $ sasOTPDigits $ sasOTPReSync $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordKey $ nspmPassword $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ nsimHint $ nsimPasswordReminder $ userPassword ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.141.6.1 NAME 'federationBoundary' AUXILIARY MUST federationBoundaryType MAY ( federationControl $ federationDNSName $ federationSearchPath ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.34 NAME 'ndsContainerLoginProperties' SUP Top ABSTRACT MAY ( loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPDigits $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordPolicyDN ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.6.3 NAME 'ndsPredicateStats' SUP Top STRUCTURAL MUST ( cn $ ndsPredicateState $ ndsPredicateFlush ) MAY ( ndsPredicate $ ndsPredicateTimeout $ ndsPredicateUseValues ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.400.1 NAME 'edirSchemaVersion' SUP Top ABSTRACT MAY edirSchemaFlagVersion X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.47 NAME 'immediateSuperiorReference' AUXILIARY MAY ref X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.1 NAME 'ldapServer' SUP Top STRUCTURAL MUST cn MAY ( ldapHostServer $ ldapGroupDN $ ldapTraceLevel $ ldapServerBindLimit $ ldapServerIdleTimeout $ lDAPUDPPort $ lDAPSearchSizeLimit $ lDAPSearchTimeLimit $ lDAPLogLevel $ lDAPLogFilename $ lDAPBackupLogFilename $ lDAPLogSizeLimit $ Version $ searchSizeLimit $ searchTimeLimit $ ldapEnableTCP $ ldapTCPPort $ ldapEnableSSL $ ldapSSLPort $ ldapKeyMaterialName $ filteredReplicaUsage $ extensionInfo $ nonStdClientSchemaCompatMode $ sslEnableMutualAuthentication $ ldapEnablePSearch $ ldapMaximumPSearchOperations $ ldapIgnorePSearchLimitsForEvents $ ldapTLSTrustedRootContainer $ ldapEnableMonitorEvents $ ldapMaximumMonitorEventsLoad $ ldapTLSRequired $ ldapTLSVerifyClientCertificate $ ldapConfigVersion $ ldapDerefAlias $ ldapNonStdAllUserAttrsMode $ ldapBindRestrictions $ ldapDefaultReferralBehavior $ ldapReferral $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ ldapLBURPNumWriterThreads $ ldapInterfaces $ ldapChainSecureRequired $ ldapStdCompliance $ ldapDerefAliasOnAuth $ ldapGeneralizedTime $ ldapPermissiveModify ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Server' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.2 NAME 'ldapGroup' SUP Top STRUCTURAL MUST cn MAY ( ldapReferral $ ldapServerList $ ldapAllowClearTextPassword $ ldapAnonymousIdentity $ lDAPSuffix $ ldapAttributeMap $ ldapClassMap $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ transitionGroupDN $ ldapAttributeList $ ldapClassList $ ldapConfigVersion $ Version $ ldapDefaultReferralBehavior $ ldapTransitionBackLink $ referralIncludeFilter $ referralExcludeFilter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Group' X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.22 NAME 'pkiCA' AUXILIARY MAY ( cACertificate $ certificateRevocationList $ authorityRevocationList $ crossCertificatePair $ attributeCertificate $ publicKey $ privateKey $ networkAddress $ loginTime $ lastLoginTime ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.21 NAME 'pkiUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.11 NAME 'applicationProcess' SUP Top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.12 NAME 'applicationEntity' SUP Top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.13 NAME 'dSA' SUP applicationEntity STRUCTURAL MAY knowledgeInformation X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.16 NAME 'certificationAuthority' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.18 NAME 'userSecurityInformation' AUXILIARY MAY supportedAlgorithms X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.20 NAME 'dmd' SUP ndsLoginProperties AUXILIARY MUST dmdName MAY ( searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ description $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY ( crossCertificatePair $ deltaRevocationList ) X-NDS_NAME 'certificationAuthorityVer2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.3.6.1 NAME 'httpServer' SUP Top STRUCTURAL MUST cn MAY ( httpHostServerDN $ httpThreadsPerCPU $ httpIOBufferSize $ httpRequestTimeout $ httpKeepAliveRequestTimeout $ httpSessionTimeout $ httpKeyMaterialObject $ httpTraceLevel $ httpAuthRequiresTLS $ httpDefaultClearPort $ httpDefaultTLSPort $ httpBindRestrictions ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.64.6.1.1 NAME 'Template' SUP Top STRUCTURAL MUST cn MAY ( trusteesOfNewObject $ newObjectSDSRights $ newObjectSFSRights $ setupScript $ runSetupScript $ membersOfTemplate $ volumeSpaceRestrictions $ setPasswordAfterCreate $ homeDirectoryRights $ accountBalance $ allowUnlimitedCredit $ description $ eMailAddress $ facsimileTelephoneNumber $ groupMembership $ higherPrivileges $ ndsHomeDirectory $ l $ Language $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginMaximumSimultaneous $ loginScript $ mailboxID $ mailboxLocation $ member $ messageServer $ minimumAccountBalance $ networkAddressRestriction $ newObjectSSelfRights $ ou $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ Profile $ st $ street $ securityEquals $ securityFlags $ seeAlso $ telephoneNumber $ title $ assistant $ assistantPhone $ city $ company $ co $ manager $ managerWorkforceID $ mailstop $ siteLocation $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ departmentNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.1 NAME 'homeInfo' AUXILIARY MAY ( homeCity $ homeEmailAddress $ homeFax $ homePhone $ homeState $ homePostalAddress $ homeZipCode $ personalMobile $ spouse $ children ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.2 NAME 'contingentWorker' AUXILIARY MAY ( vendorName $ vendorAddress $ vendorPhoneNumber ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.45 NAME 'dynamicGroup' SUP ( groupOfNames $ ndsLoginProperties ) STRUCTURAL MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.46 NAME 'dynamicGroupAux' SUP ( groupOfNames $ ndsLoginProperties ) AUXILIARY MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.6.1.1 NAME 'sASSecurity' SUP Top STRUCTURAL MUST cn MAY ( nDSPKITreeCADN $ masvPolicyDN $ sASLoginPolicyDN $ sASLoginMethodContainerDN $ sasPostLoginMethodContainerDN $ nspmPolicyAgentContainerDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Organization' 'domain' ) X-NDS_NAME 'SAS:Security' )", + "( 2.16.840.1.113719.1.39.6.1.2 NAME 'sASService' SUP Resource STRUCTURAL MAY ( hostServer $ privateKey $ publicKey $ allowUnlimitedCredit $ fullName $ lastLoginTime $ lockedByIntruder $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginTime $ networkAddress $ networkAddressRestriction $ notify $ operator $ owner $ path $ securityEquals $ securityFlags $ status $ Version $ nDSPKIKeyMaterialDN $ ndspkiKMOExport ) X-NDS_NAMING 'cn' X-NDS_NAME 'SAS:Service' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.1 NAME 'nDSPKICertificateAuthority' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ cACertificate $ ndspkiCRLContainerDN $ ndspkiIssuedCertContainerDN $ ndspkiCRLConfigurationDNList $ ndspkiSecurityRightsLevel ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:Certificate Authority' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.2 NAME 'nDSPKIKeyMaterial' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIKeyFile $ nDSPKIPrivateKey $ nDSPKIPublicKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKISubjectName $ nDSPKIGivenName $ ndspkiAdditionalRoots $ nDSPKINotBefore $ nDSPKINotAfter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'NDSPKI:Key Material' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.3 NAME 'nDSPKITrustedRoot' SUP Top STRUCTURAL MUST cn MAY ndspkiTrustedRootList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NAME 'NDSPKI:Trusted Root' )", + "( 2.16.840.1.113719.1.48.6.1.4 NAME 'nDSPKITrustedRootObject' SUP Top STRUCTURAL MUST ( cn $ nDSPKITrustedRootCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKITrustedRoot' X-NDS_NAME 'NDSPKI:Trusted Root Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.101 NAME 'nDSPKISDKeyAccessPartition' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:SD Key Access Partition' )", + "( 2.16.840.1.113719.1.48.6.1.102 NAME 'nDSPKISDKeyList' SUP Top STRUCTURAL MUST cn MAY ( nDSPKISDKeyServerDN $ nDSPKISDKeyStruct $ nDSPKISDKeyCert ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKISDKeyAccessPartition' X-NDS_NAME 'NDSPKI:SD Key List' )", + "( 2.16.840.1.113719.1.31.6.2.1 NAME 'mASVSecurityPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ masvDomainPolicy $ masvPolicyUpdate $ masvClearanceNames $ masvLabelNames $ masvLabelSecrecyLevelNames $ masvLabelSecrecyCategoryNames $ masvLabelIntegrityLevelNames $ masvLabelIntegrityCategoryNames $ masvNDSAttributeLabels ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'MASV:Security Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.1 NAME 'sASLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'SAS:Login Method Container' )", + "( 2.16.840.1.113719.1.39.42.2.0.4 NAME 'sASLoginPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ privateKey $ publicKey $ sASAllowNDSPasswordWindow $ sASPolicyCredentials $ sASPolicyMethods $ sASPolicyObjectVersion $ sASPolicyServiceSubtypes $ sASPolicyServices $ sASPolicyUsers $ sASLoginSequence $ sASLoginPolicyUpdate $ sasNMASProductOptions $ sasPolicyMethods $ sasPolicyServices $ sasPolicyUsers $ sasAllowNDSPasswordWindow $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAuditConfiguration $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPLookAheadWindow $ sasOTPDigits $ sasUpdateLoginTimeInterval $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'SAS:Login Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.7 NAME 'sASNMASBaseLoginMethod' SUP Top ABSTRACT MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasCertificateSearchContainers $ sasNMASMethodConfigData $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASLoginMethodContainer' X-NDS_NAME 'SAS:NMAS Base Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.8 NAME 'sASNMASLoginMethod' SUP sASNMASBaseLoginMethod STRUCTURAL X-NDS_NAME 'SAS:NMAS Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.9 NAME 'rADIUSDialAccessSystem' SUP Top STRUCTURAL MUST cn MAY ( publicKey $ privateKey $ rADIUSAgedInterval $ rADIUSClient $ rADIUSCommonNameResolution $ rADIUSConcurrentLimit $ rADIUSDASVersion $ rADIUSEnableCommonNameLogin $ rADIUSEnableDialAccess $ rADIUSInterimAcctingTimeout $ rADIUSLookupContexts $ rADIUSMaxDASHistoryRecord $ rADIUSMaximumHistoryRecord $ rADIUSPasswordPolicy $ rADIUSPrivateKey $ rADIUSProxyContext $ rADIUSProxyDomain $ rADIUSProxyTarget $ rADIUSPublicKey $ sASLoginConfiguration $ sASLoginConfigurationKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Dial Access System' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.10 NAME 'rADIUSProfile' SUP Top STRUCTURAL MUST cn MAY rADIUSAttributeList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Profile' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.11 NAME 'sasPostLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.39.42.2.0.12 NAME 'sasPostLoginMethod' SUP Top STRUCTURAL MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sasPostLoginMethodContainer' )", + "( 2.16.840.1.113719.1.6.6.1 NAME 'snmpGroup' SUP Top STRUCTURAL MUST cn MAY ( Version $ snmpServerList $ snmpTrapDisable $ snmpTrapInterval $ snmpTrapDescription $ snmpTrapConfig ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.2 NAME 'nspmPasswordPolicyContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) )", + "( 2.16.840.1.113719.1.39.43.6.3 NAME 'nspmPolicyAgent' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyAgentNetWare $ nspmPolicyAgentWINNT $ nspmPolicyAgentSolaris $ nspmPolicyAgentLinux $ nspmPolicyAgentAIX $ nspmPolicyAgentHPUX ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nspmPasswordPolicyContainer' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.1 NAME 'nspmPasswordPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyPrecedence $ nspmConfigurationOptions $ nspmChangePasswordMessage $ passwordExpirationInterval $ loginGraceLimit $ nspmMinPasswordLifetime $ passwordUniqueRequired $ nspmPasswordHistoryLimit $ nspmPasswordHistoryExpiration $ passwordAllowChange $ passwordRequired $ passwordMinimumLength $ nspmMaximumLength $ nspmCaseSensitive $ nspmMinUpperCaseCharacters $ nspmMaxUpperCaseCharacters $ nspmMinLowerCaseCharacters $ nspmMaxLowerCaseCharacters $ nspmNumericCharactersAllowed $ nspmNumericAsFirstCharacter $ nspmNumericAsLastCharacter $ nspmMinNumericCharacters $ nspmMaxNumericCharacters $ nspmSpecialCharactersAllowed $ nspmSpecialAsFirstCharacter $ nspmSpecialAsLastCharacter $ nspmMinSpecialCharacters $ nspmMaxSpecialCharacters $ nspmMaxRepeatedCharacters $ nspmMaxConsecutiveCharacters $ nspmMinUniqueCharacters $ nspmDisallowedAttributeValues $ nspmExcludeList $ nspmExtendedCharactersAllowed $ nspmExtendedAsFirstCharacter $ nspmExtendedAsLastCharacter $ nspmMinExtendedCharacters $ nspmMaxExtendedCharacters $ nspmUpperAsFirstCharacter $ nspmUpperAsLastCharacter $ nspmLowerAsFirstCharacter $ nspmLowerAsLastCharacter $ nspmComplexityRules $ nspmAD2K8Syntax $ nspmAD2K8maxViolation $ nspmXCharLimit $ nspmXCharHistoryLimit $ nspmUnicodeAllowed $ nspmNonAlphaCharactersAllowed $ nspmMinNonAlphaCharacters $ nspmMaxNonAlphaCharacters $ pwdInHistory $ nspmAdminsDoNotExpirePassword $ nspmPasswordACL $ nsimChallengeSetDN $ nsimForgottenAction $ nsimForgottenLoginConfig $ nsimAssignments $ nsimChallengeSetGUID $ nsimPwdRuleEnforcement ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'domain' 'Locality' 'Organization' 'organizationalUnit' 'Country' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.4 NAME 'nspmPasswordAux' AUXILIARY MAY ( publicKey $ privateKey $ loginGraceLimit $ loginGraceRemaining $ passwordExpirationTime $ passwordRequired $ nspmPasswordKey $ nspmPassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.12.6.1.0 NAME 'auditFileObject' SUP Top STRUCTURAL MUST ( cn $ auditPolicy $ auditContents ) MAY ( description $ auditPath $ auditLinkList $ auditType $ auditCurrentEncryptionKey $ auditAEncryptionKey $ auditBEncryptionKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'treeRoot' 'domain' ) X-NDS_NAME 'Audit:File Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.38.6.1.4 NAME 'wANMANLANArea' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ o $ ou $ owner $ seeAlso $ wANMANWANPolicy $ wANMANCost $ wANMANDefaultCost ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NAME 'WANMAN:LAN Area' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.37.1 NAME 'rbsCollection' SUP Top STRUCTURAL MUST cn MAY ( owner $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.30.1 NAME 'rbsExternalScope' SUP Top ABSTRACT MUST cn MAY ( rbsURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.31.1 NAME 'rbsModule' SUP Top STRUCTURAL MUST cn MAY ( rbsURL $ rbsPath $ rbsType $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.32.1 NAME 'rbsRole' SUP Top STRUCTURAL MUST cn MAY ( rbsContent $ rbsMember $ rbsTrusteeOf $ rbsGALabel $ rbsParameters $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.33.1 NAME 'rbsTask' SUP Top STRUCTURAL MUST cn MAY ( rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ rbsTaskTemplates $ rbsTaskTemplatesURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.34.1 NAME 'rbsBook' SUP rbsTask STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.35.1 NAME 'rbsScope' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.45.1 NAME 'rbsCollection2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsParameters $ owner $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.38.1 NAME 'rbsExternalScope2' SUP Top ABSTRACT MUST cn MAY ( rbsXMLInfo $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.39.1 NAME 'rbsModule2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsPath $ rbsType $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.40.1 NAME 'rbsRole2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContent $ rbsMember $ rbsTrusteeOf $ rbsParameters $ description $ rbsCategoryMembership ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.41.1 NAME 'rbsTask2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.42.1 NAME 'rbsBook2' SUP rbsTask2 STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.43.1 NAME 'rbsScope2' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.49 NAME 'prSyncPolicy' SUP Top STRUCTURAL MUST cn MAY prSyncAttributes X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.50 NAME 'encryptionPolicy' SUP Top STRUCTURAL MUST cn MAY ( attrEncryptionDefinition $ attrEncryptionRequiresSecure ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.5 NAME 'ndspkiContainer' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'ndspkiContainer' 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'nDSPKITrustedRoot' ) )", + "( 2.16.840.1.113719.1.48.6.1.6 NAME 'ndspkiCertificate' SUP Top STRUCTURAL MUST ( cn $ userCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'ndspkiContainer' 'nDSPKITrustedRoot' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.7 NAME 'ndspkiCRLConfiguration' SUP Top STRUCTURAL MUST cn MAY ( ndspkiCRLFileName $ ndspkiDirectory $ ndspkiStatus $ ndspkiIssueTime $ ndspkiNextIssueTime $ ndspkiAttemptTime $ ndspkiTimeInterval $ ndspkiCRLMaxProcessingInterval $ ndspkiCRLNumber $ ndspkiDistributionPoints $ ndspkiDistributionPointDN $ ndspkiCADN $ ndspkiCRLProcessData $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ cACertificate $ hostServer ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'ndspkiContainer' )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP Top STRUCTURAL MUST cn MAY ( authorityRevocationList $ authorityRevocationList $ cACertificate $ certificateRevocationList $ certificateRevocationList $ crossCertificatePair $ deltaRevocationList $ deltaRevocationList $ ndspkiCRLConfigurationDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'sASSecurity' 'domain' 'ndspkiCRLConfiguration' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.7.6.1 NAME 'notfTemplateCollection' SUP Top STRUCTURAL MUST cn MAY ( notfSMTPEmailHost $ notfSMTPEmailFrom $ notfSMTPEmailUserName $ sASSecretStore ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.7.6.2 NAME 'notfMergeTemplate' SUP Top STRUCTURAL MUST cn MAY ( notfMergeTemplateData $ notfMergeTemplateSubject ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'notfTemplateCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.44.6.1 NAME 'nsimChallengeSet' SUP Top STRUCTURAL MUST cn MAY ( description $ nsimRequiredQuestions $ nsimRandomQuestions $ nsimNumberRandomQuestions $ nsimMinResponseLength $ nsimMaxResponseLength ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.266.6.1 NAME 'sssServerPolicies' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.266.6.2 NAME 'sssServerPolicyOverride' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sssServerPolicies' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.91 NAME 'nestedGroupAux' AUXILIARY MAY ( groupMember $ excludedMember $ nestedConfig $ groupMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.46.1 NAME 'rbsCategory2' SUP Top STRUCTURAL MUST cn MAY ( rbsRoleMember $ rbsXMLInfo $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' X-NDS_NOT_CONTAINER '1' )" + ] + }, + "schema_entry": "cn=schema", + "type": "SchemaInfo" +} +""" + +edir_8_8_8_dsa_info = """ +{ + "raw": { + "abandonOps": [ + "0" + ], + "addEntryOps": [ + "947" + ], + "altServer": [], + "bindSecurityErrors": [ + "3" + ], + "chainings": [ + "0" + ], + "compareOps": [ + "61" + ], + "directoryTreeName": [ + "EDIR-TEST" + ], + "dsaName": [ + "cn=edir1,o=services" + ], + "errors": [ + "984" + ], + "extendedOps": [ + "213" + ], + "inBytes": [ + "1253717" + ], + "inOps": [ + "14342" + ], + "listOps": [ + "0" + ], + "modifyEntryOps": [ + "121" + ], + "modifyRDNOps": [ + "63" + ], + "namingContexts": [ + "" + ], + "oneLevelSearchOps": [ + "129" + ], + "outBytes": [ + "547685251" + ], + "readOps": [ + "7427" + ], + "referralsReturned": [ + "0" + ], + "removeEntryOps": [ + "146" + ], + "repUpdatesIn": [ + "0" + ], + "repUpdatesOut": [ + "0" + ], + "searchOps": [ + "8316" + ], + "securityErrors": [ + "3" + ], + "simpleAuthBinds": [ + "1654" + ], + "strongAuthBinds": [ + "57" + ], + "subschemaSubentry": [ + "cn=schema" + ], + "supportedControl": [ + "2.16.840.1.113719.1.27.101.6", + "2.16.840.1.113719.1.27.101.5", + "1.2.840.113556.1.4.319", + "2.16.840.1.113730.3.4.3", + "2.16.840.1.113730.3.4.2", + "2.16.840.1.113719.1.27.103.7", + "2.16.840.1.113719.1.27.101.40", + "2.16.840.1.113719.1.27.101.41", + "1.2.840.113556.1.4.1413", + "1.2.840.113556.1.4.805" + ], + "supportedExtension": [ + "2.16.840.1.113719.1.148.100.1", + "2.16.840.1.113719.1.148.100.3", + "2.16.840.1.113719.1.148.100.5", + "2.16.840.1.113719.1.148.100.7", + "2.16.840.1.113719.1.148.100.9", + "2.16.840.1.113719.1.148.100.11", + "2.16.840.1.113719.1.148.100.13", + "2.16.840.1.113719.1.148.100.15", + "2.16.840.1.113719.1.148.100.17", + "2.16.840.1.113719.1.39.42.100.1", + "2.16.840.1.113719.1.39.42.100.3", + "2.16.840.1.113719.1.39.42.100.5", + "2.16.840.1.113719.1.39.42.100.7", + "2.16.840.1.113719.1.39.42.100.9", + "2.16.840.1.113719.1.39.42.100.11", + "2.16.840.1.113719.1.39.42.100.13", + "2.16.840.1.113719.1.39.42.100.15", + "2.16.840.1.113719.1.39.42.100.17", + "2.16.840.1.113719.1.39.42.100.19", + "2.16.840.1.113719.1.39.42.100.21", + "2.16.840.1.113719.1.39.42.100.23", + "2.16.840.1.113719.1.39.42.100.25", + "2.16.840.1.113719.1.39.42.100.27", + "2.16.840.1.113719.1.27.100.1", + "2.16.840.1.113719.1.27.100.3", + "2.16.840.1.113719.1.27.100.5", + "2.16.840.1.113719.1.27.100.7", + "2.16.840.1.113719.1.27.100.11", + "2.16.840.1.113719.1.27.100.13", + "2.16.840.1.113719.1.27.100.15", + "2.16.840.1.113719.1.27.100.17", + "2.16.840.1.113719.1.27.100.19", + "2.16.840.1.113719.1.27.100.21", + "2.16.840.1.113719.1.27.100.23", + "2.16.840.1.113719.1.27.100.25", + "2.16.840.1.113719.1.27.100.27", + "2.16.840.1.113719.1.27.100.29", + "2.16.840.1.113719.1.27.100.31", + "2.16.840.1.113719.1.27.100.33", + "2.16.840.1.113719.1.27.100.35", + "2.16.840.1.113719.1.27.100.37", + "2.16.840.1.113719.1.27.100.39", + "2.16.840.1.113719.1.27.100.41", + "2.16.840.1.113719.1.27.100.96", + "2.16.840.1.113719.1.27.100.98", + "2.16.840.1.113719.1.27.100.101", + "2.16.840.1.113719.1.27.100.103", + "2.16.840.1.113719.1.142.100.1", + "2.16.840.1.113719.1.142.100.4", + "2.16.840.1.113719.1.142.100.6", + "2.16.840.1.113719.1.27.100.9", + "2.16.840.1.113719.1.27.100.43", + "2.16.840.1.113719.1.27.100.45", + "2.16.840.1.113719.1.27.100.47", + "2.16.840.1.113719.1.27.100.49", + "2.16.840.1.113719.1.27.100.51", + "2.16.840.1.113719.1.27.100.53", + "2.16.840.1.113719.1.27.100.55", + "1.3.6.1.4.1.1466.20037", + "2.16.840.1.113719.1.27.100.79", + "2.16.840.1.113719.1.27.100.84", + "2.16.840.1.113719.1.27.103.1", + "2.16.840.1.113719.1.27.103.2" + ], + "supportedFeatures": [ + "1.3.6.1.4.1.4203.1.5.1", + "2.16.840.1.113719.1.27.99.1" + ], + "supportedGroupingTypes": [ + "2.16.840.1.113719.1.27.103.8" + ], + "supportedLDAPVersion": [ + "2", + "3" + ], + "supportedSASLMechanisms": [ + "NMAS_LOGIN", + "EXTERNAL", + "DIGEST-MD5", + "GSSAPI" + ], + "unAuthBinds": [ + "1897" + ], + "vendorName": [ + "NetIQ Corporation" + ], + "vendorVersion": [ + "LDAP Agent for NetIQ eDirectory 8.8 SP8 (20804.04)" + ], + "wholeSubtreeSearchOps": [ + "760" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir914.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir914.py new file mode 100644 index 0000000..0a1d2e6 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/edir914.py @@ -0,0 +1,1157 @@ +""" +""" + +# Created on 2019.08.31 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +edir_9_1_4_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 2.5.4.35 NAME 'userPassword' DESC 'Internal NDS policy forces this to be single-valued' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} USAGE directoryOperation )", + "( 2.5.18.1 NAME 'createTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.2 NAME 'modifyTimestamp' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.10 NAME 'subschemaSubentry' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation )", + "( 2.5.21.9 NAME 'structuralObjectClass' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.49 NAME 'subordinateCount' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.48 NAME 'entryFlags' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.27.4.51 NAME 'federationBoundary' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.21.5 NAME 'attributeTypes' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", + "( 2.5.21.6 NAME 'objectClasses' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", + "( 1.3.6.1.1.20 NAME 'entryDN' DESC 'Operational Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.1.4.1.2 NAME 'ACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.1 NAME 'aliasedObjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Aliased Object Name' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.6 NAME 'backLink' SYNTAX 2.16.840.1.113719.1.1.5.1.23 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Back Link' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.8 NAME 'binderyProperty' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Property' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.7 NAME 'binderyObjectRestriction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Object Restriction' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.9 NAME 'binderyType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Bindery Type' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.11 NAME 'cAPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.12 NAME 'cAPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'CA Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.10 NAME 'Cartridge' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'CN' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.78 NAME 'printerConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Printer Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.15 NAME 'Convergence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{1} SINGLE-VALUE X-NDS_UPPER_BOUND '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2} SINGLE-VALUE X-NDS_NAME 'C' X-NDS_LOWER_BOUND '2' X-NDS_UPPER_BOUND '2' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.18 NAME 'defaultQueue' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Default Queue' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.13 NAME ( 'description' 'multiLineDescription' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} X-NDS_NAME 'Description' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '1024' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.64 NAME 'partitionCreationTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Creation Time' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.23 NAME 'facsimileTelephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22{64512} X-NDS_NAME 'Facsimile Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.117 NAME 'highConvergenceSyncInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'High Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.25 NAME 'groupMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Group Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.26 NAME 'ndsHomeDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{255} SINGLE-VALUE X-NDS_NAME 'Home Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.27 NAME 'hostDevice' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Device' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.28 NAME 'hostResourceName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Host Resource Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.29 NAME 'hostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Host Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.30 NAME 'inheritedACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Inherited ACL' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.7 NAME ( 'l' 'localityname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'L' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.39 NAME 'loginAllowedTimeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{42} SINGLE-VALUE X-NDS_NAME 'Login Allowed Time Map' X-NDS_LOWER_BOUND '42' X-NDS_UPPER_BOUND '42' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.40 NAME 'loginDisabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Login Disabled' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.41 NAME 'loginExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.42 NAME 'loginGraceLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Grace Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.43 NAME 'loginGraceRemaining' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Grace Remaining' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.44 NAME 'loginIntruderAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 SINGLE-VALUE X-NDS_NAME 'Login Intruder Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.45 NAME 'loginIntruderAttempts' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Login Intruder Attempts' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.46 NAME 'loginIntruderLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Intruder Limit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.31 NAME 'intruderAttemptResetInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Attempt Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.47 NAME 'loginIntruderResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Intruder Reset Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.48 NAME 'loginMaximumSimultaneous' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Login Maximum Simultaneous' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.49 NAME 'loginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Login Script' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.50 NAME 'loginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.31 NAME ( 'member' 'uniqueMember' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Member' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.52 NAME 'Memory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.22 NAME 'eMailAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.14{64512} X-NDS_NAME 'EMail Address' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.55 NAME 'networkAddress' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.56 NAME 'networkAddressRestriction' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NAME 'Network Address Restriction' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.57 NAME 'notify' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Notify' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.114 NAME 'Obituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.0 NAME 'objectClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_NAME 'Object Class' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.59 NAME 'operator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Operator' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'OU' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.10 NAME ( 'o' 'organizationname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'O' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.32 NAME 'owner' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Owner' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.63 NAME 'pageDescriptionLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Page Description Language' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.65 NAME 'passwordsUsed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'Passwords Used' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.66 NAME 'passwordAllowChange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Allow Change' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.67 NAME 'passwordExpirationInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Password Expiration Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.68 NAME 'passwordExpirationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NAME 'Password Expiration Time' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.69 NAME 'passwordMinimumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Password Minimum Length' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.70 NAME 'passwordRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.71 NAME 'passwordUniqueRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Password Unique Required' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.72 NAME 'path' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Path' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'Physical Delivery Office Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.16 NAME 'postalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'Postal Address' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.17 NAME 'postalCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Code' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.18 NAME 'postOfficeBox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} X-NDS_NAME 'Postal Office Box' X-NDS_UPPER_BOUND '40' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.80 NAME 'printJobConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Print Job Configuration' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.79 NAME 'printerControl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Printer Control' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.82 NAME 'privateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Private Key' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.83 NAME 'Profile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.84 NAME 'publicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Public Key' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.85 NAME 'queue' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Queue' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.86 NAME 'queueDirectory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE X-NDS_NAME 'Queue Directory' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '255' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.115 NAME 'Reference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.88 NAME 'Replica' SYNTAX 2.16.840.1.113719.1.1.5.1.16{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.89 NAME 'Resource' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.33 NAME 'roleOccupant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Role Occupant' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.116 NAME 'higherPrivileges' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Higher Privileges' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.92 NAME 'securityEquals' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Security Equals' X-NDS_SERVER_READ '1' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.4.34 NAME 'seeAlso' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'See Also' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.5 NAME 'serialNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} X-NDS_NAME 'Serial Number' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.95 NAME 'server' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Server' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'S' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.98 NAME 'status' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Status' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.5.4.9 NAME 'street' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'SA' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.102 NAME 'supportedTypefaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Typefaces' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.101 NAME 'supportedServices' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Supported Services' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.4 NAME ( 'sn' 'surname' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Surname' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.20 NAME 'telephoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} X-NDS_NAME 'Telephone Number' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.12 NAME 'title' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'Title' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.111 NAME 'User' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.112 NAME 'Version' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.1 NAME 'accountBalance' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_NAME 'Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.4 NAME 'allowUnlimitedCredit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Allow Unlimited Credit' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.118 NAME 'lowConvergenceResetTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Low Convergence Reset Time' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.54 NAME 'minimumAccountBalance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Minimum Account Balance' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.104 NAME 'lowConvergenceSyncInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Low Convergence Sync Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.21 NAME 'Device' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.53 NAME 'messageServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Message Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.34 NAME 'Language' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.100 NAME 'supportedConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Supported Connections' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.107 NAME 'typeCreatorMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Type Creator Map' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.108 NAME 'ndsUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'UID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.24 NAME 'groupID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'GID' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.110 NAME 'unknownBaseClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Unknown Base Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.87 NAME 'receivedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.33 NAME 'synchronizedUpTo' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Synchronized Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.5 NAME 'authorityRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Authority Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.13 NAME 'certificateRevocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Certificate Revocation' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.17 NAME 'ndsCrossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Cross Certificate Pair' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.37 NAME 'lockedByIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Locked By Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.77 NAME 'printer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 X-NDS_NAME 'Printer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.20 NAME 'detectIntruder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Detect Intruder' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.38 NAME 'lockoutAfterDetection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Lockout After Detection' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.32 NAME 'intruderLockoutResetInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_NAME 'Intruder Lockout Reset Interval' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.96 NAME 'serverHolds' SYNTAX 2.16.840.1.113719.1.1.5.1.26 X-NDS_NAME 'Server Holds' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.91 NAME 'sAPName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{47} SINGLE-VALUE X-NDS_NAME 'SAP Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '47' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.113 NAME 'Volume' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.35 NAME 'lastLoginTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Last Login Time' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.81 NAME 'printServer' SYNTAX 2.16.840.1.113719.1.1.5.1.25 SINGLE-VALUE X-NDS_NAME 'Print Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.119 NAME 'nNSDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_NAME 'NNS Domain' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.120 NAME 'fullName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{127} X-NDS_NAME 'Full Name' X-NDS_UPPER_BOUND '127' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.121 NAME 'partitionControl' SYNTAX 2.16.840.1.113719.1.1.5.1.25 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Control' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.122 NAME 'revision' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Revision' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.123 NAME 'certificateValidityInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'Certificate Validity Interval' X-NDS_LOWER_BOUND '60' X-NDS_UPPER_BOUND '-1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.124 NAME 'externalSynchronizer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'External Synchronizer' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.125 NAME 'messagingDatabaseLocation' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Messaging Database Location' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.126 NAME 'messageRoutingGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Message Routing Group' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.127 NAME 'messagingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Messaging Server' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.128 NAME 'Postmaster' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.162 NAME 'mailboxLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Mailbox Location' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.163 NAME 'mailboxID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Mailbox ID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.164 NAME 'externalName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'External Name' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.165 NAME 'securityFlags' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Security Flags' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.166 NAME 'messagingServerType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE X-NDS_NAME 'Messaging Server Type' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.167 NAME 'lastReferencedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Last Referenced Time' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.4.42 NAME 'givenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_NAME 'Given Name' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.43 NAME 'initials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} X-NDS_NAME 'Initials' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.4.44 NAME 'generationQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} SINGLE-VALUE X-NDS_NAME 'Generational Qualifier' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '8' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.171 NAME 'profileMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Profile Membership' X-NDS_NAME_VALUE_ACCESS '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.172 NAME 'dsRevision' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'DS Revision' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_OPERATIONAL '1' )", + "( 2.16.840.1.113719.1.1.4.1.173 NAME 'supportedGateway' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} X-NDS_NAME 'Supported Gateway' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '4096' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.174 NAME 'equivalentToMe' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Equivalent To Me' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.16.840.1.113719.1.1.4.1.175 NAME 'replicaUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Replica Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.176 NAME 'partitionStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Partition Status' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.177 NAME 'permanentConfigParms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Permanent Config Parms' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.178 NAME 'Timezone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.179 NAME 'binderyRestrictionLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Bindery Restriction Level' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.180 NAME 'transitiveVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Transitive Vector' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.181 NAME 'T' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.183 NAME 'purgeVector' SYNTAX 2.16.840.1.113719.1.1.5.1.19 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Purge Vector' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_SCHED_SYNC_NEVER '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.184 NAME 'synchronizationTolerance' SYNTAX 2.16.840.1.113719.1.1.5.1.19 USAGE directoryOperation X-NDS_NAME 'Synchronization Tolerance' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.185 NAME 'passwordManagement' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'Password Management' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.186 NAME 'usedBy' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Used By' X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.187 NAME 'Uses' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_SERVER_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.500 NAME 'obituaryNotify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Obituary Notify' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.501 NAME 'GUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.502 NAME 'otherGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{16} USAGE directoryOperation X-NDS_NAME 'Other GUID' X-NDS_LOWER_BOUND '16' X-NDS_UPPER_BOUND '16' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.503 NAME 'auxiliaryClassFlag' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Auxiliary Class Flag' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.504 NAME 'unknownAuxiliaryClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} USAGE directoryOperation X-NDS_NAME 'Unknown Auxiliary Class' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userId' ) SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64} X-NDS_NAME 'uniqueID' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.1.25 NAME 'dc' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} X-NDS_NAME 'dc' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '64' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.507 NAME 'auxClassObjectClassBackup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'AuxClass Object Class Backup' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.508 NAME 'localReceivedUpTo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NAME 'Local Received Up To' X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.4 NAME 'federationControl' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.2 NAME 'federationSearchPath' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.3 NAME 'federationDNSName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.141.4.1 NAME 'federationBoundaryType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.14.4.1.4 NAME 'DirXML-Associations' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' )", + "( 2.5.18.3 NAME 'creatorsName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.5.18.4 NAME 'modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_FILTERED_REQUIRED '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.300 NAME 'languageId' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.35 NAME 'ndsPredicate' SYNTAX 2.16.840.1.113719.1.1.5.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.36 NAME 'ndsPredicateState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.37 NAME 'ndsPredicateFlush' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.38 NAME 'ndsPredicateTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.40 NAME 'ndsPredicateStatsDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.4.39 NAME 'ndsPredicateUseValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.601 NAME 'syncPanePoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.600 NAME 'syncWindowVector' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.602 NAME 'objectVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'memberQueryURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'memberQuery' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.302 NAME 'excludedMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.1.525 NAME 'auxClassCompatibility' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.518 NAME 'ndsAgentPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.519 NAME 'ndsOperationCheckpoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.520 NAME 'localReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.521 NAME 'treeReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.522 NAME 'schemaResetLock' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.523 NAME 'modifiedACLEntry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.524 NAME 'monitoredConnection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.526 NAME 'localFederationBoundary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.527 NAME 'replicationFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.721 NAME 'ServerEBAEnabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.716 NAME 'EBATreeConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.722 NAME 'EBAPartitionConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.723 NAME 'EBAServerConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.1.4.1.296 NAME 'loginActivationTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.687 NAME 'UpdateInProgress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.720 NAME 'dsContainerReadyAttrs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.4.400.1 NAME 'edirSchemaFlagVersion' SYNTAX 2.16.840.1.113719.1.1.5.1.0 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NONREMOVABLE '1' X-NDS_HIDDEN '1' X-NDS_READ_FILTERED '1' )", + "( 2.16.840.1.113719.1.1.4.1.512 NAME 'indexDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.513 NAME 'ndsStatusRepair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.514 NAME 'ndsStatusExternalReference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.515 NAME 'ndsStatusObituary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.516 NAME 'ndsStatusSchema' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.517 NAME 'ndsStatusLimber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.511 NAME 'authoritative' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'CachedAttrsOnExtRefs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.547 NAME 'ExtRefLastUpdatedTime' SYNTAX 2.16.840.1.113719.1.1.5.1.19 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation X-NDS_PUBLIC_READ '1' X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.688 NAME 'NCPKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.1.4.713 NAME 'UTF8LoginScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.714 NAME 'loginScriptCharset' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.721 NAME 'NDSRightsToMonitor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NEVER_SYNC '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.1.192 NAME 'lDAPLogLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Log Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.12 NAME 'lDAPUDPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP UDP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.1.4.1.204 NAME 'lDAPLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.205 NAME 'lDAPBackupLogFilename' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Backup Log Filename' )", + "( 2.16.840.1.113719.1.1.4.1.206 NAME 'lDAPLogSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Log Size Limit' X-NDS_LOWER_BOUND '2048' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.1.4.1.194 NAME 'lDAPSearchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Size Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.195 NAME 'lDAPSearchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_NAME 'LDAP Search Time Limit' X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.1.4.1.207 NAME 'lDAPSuffix' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Suffix' )", + "( 2.16.840.1.113719.1.27.4.70 NAME 'ldapConfigVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.14 NAME 'ldapReferral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Referral' )", + "( 2.16.840.1.113719.1.27.4.73 NAME 'ldapDefaultReferralBehavior' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.23 NAME 'ldapSearchReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:searchReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.24 NAME 'lDAPOtherReferralUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'LDAP:otherReferralUsage' )", + "( 2.16.840.1.113719.1.27.4.1 NAME 'ldapHostServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Host Server' )", + "( 2.16.840.1.113719.1.27.4.2 NAME 'ldapGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Group' )", + "( 2.16.840.1.113719.1.27.4.3 NAME 'ldapTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_NAME 'LDAP Screen Level' X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.27.4.4 NAME 'searchSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.5 NAME 'searchTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{2147483647} SINGLE-VALUE X-NDS_UPPER_BOUND '2147483647' )", + "( 2.16.840.1.113719.1.27.4.6 NAME 'ldapServerBindLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Bind Limit' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.7 NAME 'ldapServerIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{4294967295} SINGLE-VALUE X-NDS_NAME 'LDAP Server Idle Timeout' X-NDS_UPPER_BOUND '-1' )", + "( 2.16.840.1.113719.1.27.4.8 NAME 'ldapEnableTCP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable TCP' )", + "( 2.16.840.1.113719.1.27.4.10 NAME 'ldapEnableSSL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Enable SSL' )", + "( 2.16.840.1.113719.1.27.4.11 NAME 'ldapTCPPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP TCP Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.13 NAME 'ldapSSLPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{65535} SINGLE-VALUE X-NDS_NAME 'LDAP SSL Port' X-NDS_UPPER_BOUND '65535' )", + "( 2.16.840.1.113719.1.27.4.21 NAME 'filteredReplicaUsage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.22 NAME 'ldapKeyMaterialName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'LDAP:keyMaterialName' )", + "( 2.16.840.1.113719.1.27.4.42 NAME 'extensionInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.27.4.45 NAME 'nonStdClientSchemaCompatMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.46 NAME 'sslEnableMutualAuthentication' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.62 NAME 'ldapEnablePSearch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.63 NAME 'ldapMaximumPSearchOperations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.64 NAME 'ldapIgnorePSearchLimitsForEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.65 NAME 'ldapTLSTrustedRootContainer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.27.4.66 NAME 'ldapEnableMonitorEvents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.67 NAME 'ldapMaximumMonitorEventsLoad' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.68 NAME 'ldapTLSRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.69 NAME 'ldapTLSVerifyClientCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.71 NAME 'ldapDerefAlias' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.72 NAME 'ldapNonStdAllUserAttrsMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.75 NAME 'ldapBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.79 NAME 'ldapInterfaces' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.80 NAME 'ldapChainSecureRequired' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.82 NAME 'ldapStdCompliance' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.83 NAME 'ldapDerefAliasOnAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.84 NAME 'ldapGeneralizedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.85 NAME 'ldapPermissiveModify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.86 NAME 'ldapSSLConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.27.4.15 NAME 'ldapServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server List' )", + "( 2.16.840.1.113719.1.27.4.16 NAME 'ldapAttributeMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Attribute Map v11' )", + "( 2.16.840.1.113719.1.27.4.17 NAME 'ldapClassMap' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'LDAP Class Map v11' )", + "( 2.16.840.1.113719.1.27.4.18 NAME 'ldapAllowClearTextPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'LDAP Allow Clear Text Password' )", + "( 2.16.840.1.113719.1.27.4.19 NAME 'ldapAnonymousIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'LDAP Anonymous Identity' )", + "( 2.16.840.1.113719.1.27.4.52 NAME 'ldapAttributeList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.53 NAME 'ldapClassList' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} )", + "( 2.16.840.1.113719.1.27.4.56 NAME 'transitionGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.74 NAME 'ldapTransitionBackLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.78 NAME 'ldapLBURPNumWriterThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.27.4.20 NAME 'ldapServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'LDAP Server' )", + "( 0.9.2342.19200300.100.1.3 NAME 'mail' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'Internet EMail Address' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'NSCP:employeeNumber' )", + "( 2.16.840.1.113719.1.27.4.76 NAME 'referralExcludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.27.4.77 NAME 'referralIncludeFilter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.5.4.36 NAME 'userCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'userCertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.37 NAME 'cACertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'cACertificate' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.40 NAME 'crossCertificatePair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'crossCertificatePair' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.58 NAME 'attributeCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.2 NAME 'knowledgeInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.14 NAME 'searchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25{64512} X-NDS_NAME 'searchGuide' )", + "( 2.5.4.15 NAME 'businessCategory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.21 NAME 'telexNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52{64512} X-NDS_NAME 'telexNumber' )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51{64512} X-NDS_NAME 'teletexTerminalIdentifier' )", + "( 2.5.4.24 NAME 'x121Address' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '15' )", + "( 2.5.4.25 NAME 'internationaliSDNNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '16' )", + "( 2.5.4.26 NAME 'registeredAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} X-NDS_NAME 'registeredAddress' )", + "( 2.5.4.27 NAME 'destinationIndicator' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '128' )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14{64512} SINGLE-VALUE X-NDS_NAME 'preferredDeliveryMethod' )", + "( 2.5.4.29 NAME 'presentationAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.43{64512} SINGLE-VALUE X-NDS_NAME 'presentationAddress' )", + "( 2.5.4.30 NAME 'supportedApplicationContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38{64512} X-NDS_NAME 'supportedApplicationContext' )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6{64512} X-NDS_NAME 'x500UniqueIdentifier' )", + "( 2.5.4.46 NAME 'dnQualifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64512} )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21{64512} X-NDS_NAME 'enhancedSearchGuide' )", + "( 2.5.4.48 NAME 'protocolInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.42{64512} X-NDS_NAME 'protocolInformation' )", + "( 2.5.4.51 NAME 'houseIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 2.5.4.52 NAME 'supportedAlgorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49{64512} X-NDS_NAME 'supportedAlgorithms' )", + "( 2.5.4.54 NAME 'dmdName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '32768' )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.4.49 NAME 'dn' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.1 NAME 'httpServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.3.4.2 NAME 'httpHostServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.3 NAME 'httpThreadsPerCPU' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.4 NAME 'httpIOBufferSize' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.5 NAME 'httpRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.6 NAME 'httpKeepAliveRequestTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.7 NAME 'httpSessionTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.8 NAME 'httpKeyMaterialObject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.9 NAME 'httpTraceLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.10 NAME 'httpAuthRequiresTLS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.11 NAME 'httpDefaultClearPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.12 NAME 'httpDefaultTLSPort' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.3.4.13 NAME 'httpBindRestrictions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.295 NAME 'emboxConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.54.4.1.1 NAME 'trusteesOfNewObject' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'Trustees Of New Object' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.55.4.1.1 NAME 'newObjectSDSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's DS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.56.4.1.1 NAME 'newObjectSFSRights' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'New Object's FS Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.57.4.1.1 NAME 'setupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.58.4.1.1 NAME 'runSetupScript' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Run Setup Script' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.59.4.1.1 NAME 'membersOfTemplate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Members Of Template' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.60.4.1.1 NAME 'volumeSpaceRestrictions' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'Volume Space Restrictions' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.61.4.1.1 NAME 'setPasswordAfterCreate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'Set Password After Create' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.62.4.1.1 NAME 'homeDirectoryRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_NAME 'Home Directory Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.63.4.1.1 NAME 'newObjectSSelfRights' SYNTAX 2.16.840.1.113719.1.1.5.1.17 X-NDS_NAME 'New Object's Self Rights' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.8.4.1 NAME 'digitalMeID' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.2 NAME 'assistant' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.3 NAME 'assistantPhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.4 NAME 'city' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.5 NAME 'company' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.43 NAME 'co' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.6 NAME 'directReports' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.8.4.7 NAME 'mailstop' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.41 NAME 'mobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.42 NAME 'pager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.8 NAME 'workforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.9 NAME 'instantMessagingID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.10 NAME 'preferredName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.8.4.11 NAME 'jobCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.12 NAME 'siteLocation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.13 NAME 'employeeStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.14 NAME 'costCenter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.15 NAME 'costCenterDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.16 NAME 'tollFreePhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.17 NAME 'otherPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.18 NAME 'managerWorkforceID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.19 NAME 'jackNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.20 NAME 'vehicleInformation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.21 NAME 'accessCardNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.32 NAME 'isManager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.8.4.22 NAME 'homeCity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.23 NAME 'homeEmailAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 1.3.6.1.4.1.1466.101.120.31 NAME 'homeFax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 0.9.2342.19200300.100.1.20 NAME 'homePhone' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.24 NAME 'homeState' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41{64512} )", + "( 2.16.840.1.113719.1.8.4.25 NAME 'homeZipCode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.26 NAME 'personalMobile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.8.4.27 NAME 'children' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.28 NAME 'spouse' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.29 NAME 'vendorName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.30 NAME 'vendorAddress' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.8.4.31 NAME 'vendorPhoneNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{64512} )", + "( 2.16.840.1.113719.1.1.4.1.303 NAME 'dgIdentity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME_VALUE_ACCESS '1' )", + "( 2.16.840.1.113719.1.1.4.1.304 NAME 'dgTimeOut' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.305 NAME 'dgAllowUnknown' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.306 NAME 'dgAllowDuplicates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.546 NAME 'allowAliasToAncestor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.39.4.1.1 NAME 'sASSecurityDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Security DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.2 NAME 'sASServiceDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Service DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.4.1.3 NAME 'sASSecretStore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:SecretStore' )", + "( 2.16.840.1.113719.1.39.4.1.4 NAME 'sASSecretStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Key' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.5 NAME 'sASSecretStoreData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:SecretStore:Data' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.6 NAME 'sASPKIStoreKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'SAS:PKIStore:Keys' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.48.4.1.1 NAME 'nDSPKIPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.2 NAME 'nDSPKIPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Private Key' )", + "( 2.16.840.1.113719.1.48.4.1.3 NAME 'nDSPKIPublicKeyCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.4 NAME 'nDSPKICertificateChain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:Certificate Chain' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.16 NAME 'nDSPKIPublicKeyEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.17 NAME 'nDSPKIPrivateKeyEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Private Key EC' )", + "( 2.16.840.1.113719.1.48.4.1.18 NAME 'nDSPKIPublicKeyCertificateEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Public Key Certificate EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.19 NAME 'crossCertificatePairEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'Cross Certificate Pair EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'nDSPKICertificateChainEC' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:Certificate Chain EC' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.5 NAME 'nDSPKIParentCA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA' )", + "( 2.16.840.1.113719.1.48.4.1.6 NAME 'nDSPKIParentCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'NDSPKI:Parent CA DN' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'nDSPKISuiteBMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'NDSPKI:SuiteBMode' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.7 NAME 'nDSPKIKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Key File' )", + "( 2.16.840.1.113719.1.48.4.1.8 NAME 'nDSPKISubjectName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Subject Name' )", + "( 2.16.840.1.113719.1.48.4.1.11 NAME 'nDSPKIGivenName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Given Name' )", + "( 2.16.840.1.113719.1.48.4.1.9 NAME 'nDSPKIKeyMaterialDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Key Material DN' )", + "( 2.16.840.1.113719.1.48.4.1.10 NAME 'nDSPKITreeCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:Tree CA DN' )", + "( 2.5.4.59 NAME 'cAECCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.12 NAME 'nDSPKIUserCertificateInfo' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'NDSPKI:userCertificateInfo' )", + "( 2.16.840.1.113719.1.48.4.1.13 NAME 'nDSPKITrustedRootCertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Trusted Root Certificate' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.14 NAME 'nDSPKINotBefore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not Before' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.15 NAME 'nDSPKINotAfter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:Not After' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.101 NAME 'nDSPKISDKeyServerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'NDSPKI:SD Key Server DN' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.102 NAME 'nDSPKISDKeyStruct' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'NDSPKI:SD Key Struct' )", + "( 2.16.840.1.113719.1.48.4.1.103 NAME 'nDSPKISDKeyCert' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key Cert' )", + "( 2.16.840.1.113719.1.48.4.1.104 NAME 'nDSPKISDKeyID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'NDSPKI:SD Key ID' )", + "( 2.16.840.1.113719.1.39.4.1.105 NAME 'nDSPKIKeystore' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_NAME 'NDSPKI:Keystore' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.4.1.106 NAME 'ndspkiAdditionalRoots' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.3 NAME 'masvLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.4 NAME 'masvProposedLabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.5 NAME 'masvDefaultRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.6 NAME 'masvAuthorizedRange' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.2.7 NAME 'masvDomainPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.8 NAME 'masvClearanceNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.9 NAME 'masvLabelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.10 NAME 'masvLabelSecrecyLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.11 NAME 'masvLabelSecrecyCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.12 NAME 'masvLabelIntegrityLevelNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.13 NAME 'masvLabelIntegrityCategoryNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.14 NAME 'masvPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.31.4.1.16 NAME 'masvNDSAttributeLabels' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.31.4.1.15 NAME 'masvPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.2 NAME 'sASLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_NAME 'SAS:Login Sequence' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.8 NAME 'sASLoginPolicyUpdate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy Update' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'sasNMASProductOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.74 NAME 'sasAuditConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.14 NAME 'sASNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.15 NAME 'sASPolicyCredentials' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Policy Credentials' X-NDS_SERVER_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.16 NAME 'sASPolicyMethods' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Methods' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.17 NAME 'sASPolicyObjectVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Policy Object Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.18 NAME 'sASPolicyServiceSubtypes' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Service Subtypes' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.19 NAME 'sASPolicyServices' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Services' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.20 NAME 'sASPolicyUsers' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'SAS:Policy Users' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.21 NAME 'sASAllowNDSPasswordWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'SAS:Allow NDS Password Window' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.9 NAME 'sASMethodIdentifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Identifier' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.10 NAME 'sASMethodVendor' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Method Vendor' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.11 NAME 'sASAdvisoryMethodGrade' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Advisory Method Grade' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.12 NAME 'sASVendorSupport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'SAS:Vendor Support' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.13 NAME 'sasCertificateSearchContainers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.70 NAME 'sasNMASMethodConfigData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.22 NAME 'sASLoginClientMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.23 NAME 'sASLoginServerMethodNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method NetWare' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.24 NAME 'sASLoginClientMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Client Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.25 NAME 'sASLoginServerMethodWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NAME 'SAS:Login Server Method WINNT' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.26 NAME 'sasLoginClientMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.27 NAME 'sasLoginServerMethodSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.28 NAME 'sasLoginClientMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.29 NAME 'sasLoginServerMethodLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.30 NAME 'sasLoginClientMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.31 NAME 'sasLoginServerMethodTru64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.32 NAME 'sasLoginClientMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.33 NAME 'sasLoginServerMethodAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.34 NAME 'sasLoginClientMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.35 NAME 'sasLoginServerMethodHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1000 NAME 'sasLoginClientMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1001 NAME 'sasLoginServerMethods390' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1002 NAME 'sasLoginClientMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1003 NAME 'sasLoginServerMethodLinuxX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1004 NAME 'sasLoginClientMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1005 NAME 'sasLoginServerMethodWinX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1006 NAME 'sasLoginClientMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1007 NAME 'sasLoginServerMethodSolaris64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1008 NAME 'sasLoginClientMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1009 NAME 'sasLoginServerMethodAIX64' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasLoginServerMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasLoginClientMethodSolarisi386' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.78 NAME 'sasUnsignedMethodModules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.79 NAME 'sasServerModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.80 NAME 'sasServerModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.81 NAME 'sasSASLMechanismName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.82 NAME 'sasSASLMechanismEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.83 NAME 'sasClientModuleName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.84 NAME 'sasClientModuleEntryPointName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.36 NAME 'sASLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Method Container DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.37 NAME 'sASLoginPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'SAS:Login Policy DN' X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.63 NAME 'sasPostLoginMethodContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.38 NAME 'rADIUSActiveConnections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Active Connections' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.39 NAME 'rADIUSAgedInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Aged Interval' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.40 NAME 'rADIUSAttributeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Attribute List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.41 NAME 'rADIUSAttributeLists' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Attribute Lists' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.42 NAME 'rADIUSClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Client' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.43 NAME 'rADIUSCommonNameResolution' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Common Name Resolution' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.44 NAME 'rADIUSConcurrentLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Concurrent Limit' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.45 NAME 'rADIUSConnectionHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Connection History' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.46 NAME 'rADIUSDASVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:DAS Version' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.47 NAME 'rADIUSDefaultProfile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Default Profile' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.48 NAME 'rADIUSDialAccessGroup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'RADIUS:Dial Access Group' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.49 NAME 'rADIUSEnableCommonNameLogin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Common Name Login' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.50 NAME 'rADIUSEnableDialAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NAME 'RADIUS:Enable Dial Access' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.51 NAME 'rADIUSInterimAcctingTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Interim Accting Timeout' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.52 NAME 'rADIUSLookupContexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'RADIUS:Lookup Contexts' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.53 NAME 'rADIUSMaxDASHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Max DAS History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.54 NAME 'rADIUSMaximumHistoryRecord' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Maximum History Record' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.55 NAME 'rADIUSPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Password' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.56 NAME 'rADIUSPasswordPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'RADIUS:Password Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.57 NAME 'rADIUSPrivateKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Private Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.58 NAME 'rADIUSProxyContext' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Proxy Context' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.59 NAME 'rADIUSProxyDomain' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Domain' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.60 NAME 'rADIUSProxyTarget' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'RADIUS:Proxy Target' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.61 NAME 'rADIUSPublicKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'RADIUS:Public Key' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.62 NAME 'rADIUSServiceList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_NAME 'RADIUS:Service List' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.3 NAME 'sASLoginSecret' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.4 NAME 'sASLoginSecretKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Secret Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.5 NAME 'sASEncryptionType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'SAS:Encryption Type' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.6 NAME 'sASLoginConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.7 NAME 'sASLoginConfigurationKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'SAS:Login Configuration Key' X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.73 NAME 'sasDefaultLoginSequence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.64 NAME 'sasAuthorizedLoginSequences' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.69 NAME 'sasAllowableSubjectNames' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.71 NAME 'sasLoginFailureDelay' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.72 NAME 'sasMethodVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1010 NAME 'sasUpdateLoginInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1011 NAME 'sasOTPEnabled' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1012 NAME 'sasOTPCounter' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1013 NAME 'sasOTPLookAheadWindow' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1014 NAME 'sasOTPDigits' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1015 NAME 'sasOTPReSync' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.39.42.1.0.1016 NAME 'sasUpdateLoginTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.6.4.1 NAME 'snmpGroupDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.2 NAME 'snmpServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.6.4.3 NAME 'snmpTrapConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.4 NAME 'snmpTrapDescription' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.5 NAME 'snmpTrapInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.6.4.6 NAME 'snmpTrapDisable' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.528 NAME 'ndapPartitionPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.529 NAME 'ndapClassPasswordMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.530 NAME 'ndapPasswordMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.537 NAME 'ndapPartitionLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.538 NAME 'ndapClassLoginMgmt' SYNTAX 2.16.840.1.113719.1.1.5.1.0 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.539 NAME 'ndapLoginMgmt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.1 NAME 'nspmPasswordKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.2 NAME 'nspmPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.3 NAME 'nspmDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.4 NAME 'nspmPasswordHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.5 NAME 'nspmAdministratorChangeCount' SYNTAX 2.16.840.1.113719.1.1.5.1.22 SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.6 NAME 'nspmPasswordPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.7 NAME 'nspmPreviousDistributionPassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.39.43.4.8 NAME 'nspmDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.42.2.27.8.1.16 NAME 'pwdChangedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.17 NAME 'pwdAccountLockedTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.19 NAME 'pwdFailureTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.16.840.1.113719.1.39.43.4.100 NAME 'nspmConfigurationOptions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.102 NAME 'nspmChangePasswordMessage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.103 NAME 'nspmPasswordHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.104 NAME 'nspmPasswordHistoryExpiration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.105 NAME 'nspmMinPasswordLifetime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.106 NAME 'nspmAdminsDoNotExpirePassword' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.107 NAME 'nspmPasswordACL' SYNTAX 2.16.840.1.113719.1.1.5.1.17 )", + "( 2.16.840.1.113719.1.39.43.4.200 NAME 'nspmMaximumLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.201 NAME 'nspmMinUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.202 NAME 'nspmMaxUpperCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.203 NAME 'nspmMinLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.204 NAME 'nspmMaxLowerCaseCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.205 NAME 'nspmNumericCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.206 NAME 'nspmNumericAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.207 NAME 'nspmNumericAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.208 NAME 'nspmMinNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.209 NAME 'nspmMaxNumericCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.210 NAME 'nspmSpecialCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.211 NAME 'nspmSpecialAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.212 NAME 'nspmSpecialAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.213 NAME 'nspmMinSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.214 NAME 'nspmMaxSpecialCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.215 NAME 'nspmMaxRepeatedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.216 NAME 'nspmMaxConsecutiveCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.217 NAME 'nspmMinUniqueCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.218 NAME 'nspmDisallowedAttributeValues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.219 NAME 'nspmExcludeList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.220 NAME 'nspmCaseSensitive' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.221 NAME 'nspmPolicyPrecedence' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.222 NAME 'nspmExtendedCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.223 NAME 'nspmExtendedAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.224 NAME 'nspmExtendedAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.225 NAME 'nspmMinExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.226 NAME 'nspmMaxExtendedCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.227 NAME 'nspmUpperAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.228 NAME 'nspmUpperAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.229 NAME 'nspmLowerAsFirstCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.230 NAME 'nspmLowerAsLastCharacter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.231 NAME 'nspmComplexityRules' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.233 NAME 'nspmAD2K8Syntax' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.234 NAME 'nspmAD2K8maxViolation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.235 NAME 'nspmXCharLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.236 NAME 'nspmXCharHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.237 NAME 'nspmUnicodeAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.238 NAME 'nspmNonAlphaCharactersAllowed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.239 NAME 'nspmMinNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.240 NAME 'nspmMaxNonAlphaCharacters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.241 NAME 'nspmGraceLoginHistoryLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.300 NAME 'nspmPolicyAgentContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.301 NAME 'nspmPolicyAgentNetWare' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.302 NAME 'nspmPolicyAgentWINNT' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.303 NAME 'nspmPolicyAgentSolaris' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.304 NAME 'nspmPolicyAgentLinux' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.305 NAME 'nspmPolicyAgentAIX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.43.4.306 NAME 'nspmPolicyAgentHPUX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledUri' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 0.9.2342.19200300.100.1.7 NAME 'ldapPhoto' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.12.4.1.0 NAME 'auditAEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:A Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.2.0 NAME 'auditBEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:B Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.3.0 NAME 'auditContents' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Contents' )", + "( 2.16.840.1.113719.1.12.4.4.0 NAME 'auditType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'Audit:Type' )", + "( 2.16.840.1.113719.1.12.4.5.0 NAME 'auditCurrentEncryptionKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Current Encryption Key' )", + "( 2.16.840.1.113719.1.12.4.6.0 NAME 'auditFileLink' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'Audit:File Link' )", + "( 2.16.840.1.113719.1.12.4.7.0 NAME 'auditLinkList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NAME 'Audit:Link List' )", + "( 2.16.840.1.113719.1.12.4.8.0 NAME 'auditPath' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Path' )", + "( 2.16.840.1.113719.1.12.4.9.0 NAME 'auditPolicy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_NAME 'Audit:Policy' )", + "( 2.16.840.1.113719.1.38.4.1.1 NAME 'wANMANWANPolicy' SYNTAX 2.16.840.1.113719.1.1.5.1.13{64512} X-NDS_NAME 'WANMAN:WAN Policy' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.2 NAME 'wANMANLANAreaMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NAME 'WANMAN:LAN Area Membership' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.3 NAME 'wANMANCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_NAME 'WANMAN:Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.38.4.1.4 NAME 'wANMANDefaultCost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NAME 'WANMAN:Default Cost' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.135.4.30 NAME 'rbsAssignedRoles' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.31 NAME 'rbsContent' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.32 NAME 'rbsContentMembership' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.33 NAME 'rbsEntryPoint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.34 NAME 'rbsMember' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.35 NAME 'rbsOwnedCollections' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.135.4.36 NAME 'rbsPath' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.37 NAME 'rbsParameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.38 NAME 'rbsTaskRights' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.39 NAME 'rbsTrusteeOf' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.40 NAME 'rbsType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} SINGLE-VALUE X-NDS_LOWER_BOUND '1' X-NDS_UPPER_BOUND '256' )", + "( 2.16.840.1.113719.1.135.4.41 NAME 'rbsURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.42 NAME 'rbsTaskTemplates' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.135.4.43 NAME 'rbsTaskTemplatesURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.44 NAME 'rbsGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.45 NAME 'rbsPageMembership' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} )", + "( 2.16.840.1.113719.1.135.4.46 NAME 'rbsTargetObjectType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.135.4.47 NAME 'rbsContext' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.48 NAME 'rbsXMLInfo' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.135.4.51 NAME 'rbsAssignedRoles2' SYNTAX 2.16.840.1.113719.1.1.5.1.25 )", + "( 2.16.840.1.113719.1.135.4.52 NAME 'rbsOwnedCollections2' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.1.540 NAME 'prSyncPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.541 NAME 'prSyncAttributes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_SERVER_READ '1' )", + "( 2.16.840.1.113719.1.1.4.1.542 NAME 'dsEncryptedReplicationConfig' SYNTAX 2.16.840.1.113719.1.1.5.1.19 )", + "( 2.16.840.1.113719.1.1.4.1.543 NAME 'encryptionPolicyDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.544 NAME 'attrEncryptionRequiresSecure' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.545 NAME 'attrEncryptionDefinition' SYNTAX 2.16.840.1.113719.1.1.5.1.6{64512} X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.48.4.1.16 NAME 'ndspkiCRLFileName' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.17 NAME 'ndspkiStatus' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.18 NAME 'ndspkiIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.19 NAME 'ndspkiNextIssueTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.20 NAME 'ndspkiAttemptTime' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.21 NAME 'ndspkiTimeInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.22 NAME 'ndspkiCRLMaxProcessingInterval' SYNTAX 2.16.840.1.113719.1.1.5.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.23 NAME 'ndspkiCRLNumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.24 NAME 'ndspkiDistributionPoints' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.25 NAME 'ndspkiCRLProcessData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.26 NAME 'ndspkiCRLConfigurationDNList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.27 NAME 'ndspkiCADN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.28 NAME 'ndspkiCRLContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.29 NAME 'ndspkiIssuedCertContainerDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.30 NAME 'ndspkiDistributionPointDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.31 NAME 'ndspkiCRLConfigurationDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.32 NAME 'ndspkiDirectory' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} )", + "( 2.5.4.38 NAME 'authorityRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-NDS_NAME 'ndspkiAuthorityRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.39 NAME 'certificateRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-NDS_NAME 'ndspkiCertificateRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.5.4.53 NAME 'deltaRevocationList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE X-NDS_NAME 'ndspkiDeltaRevocationList' X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.36 NAME 'ndspkiTrustedRootList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.37 NAME 'ndspkiSecurityRightsLevel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.48.4.1.38 NAME 'ndspkiKMOExport' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.48.4.1.39 NAME 'ndspkiCRLECConfigurationDNList' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.40 NAME 'ndspkiCRLType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.41 NAME 'ndspkiCRLExtendValidity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.42 NAME 'ndspkiDefaultRSAKeySize' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.43 NAME 'ndspkiDefaultECCurve' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.48.4.1.44 NAME 'ndspkiDefaultCertificateLife' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.7.4.1 NAME 'notfSMTPEmailHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.2 NAME 'notfSMTPEmailFrom' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.3 NAME 'notfSMTPEmailUserName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.5 NAME 'notfMergeTemplateData' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.7.4.6 NAME 'notfMergeTemplateSubject' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.1 NAME 'nsimRequiredQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.2 NAME 'nsimRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.3 NAME 'nsimNumberRandomQuestions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.4 NAME 'nsimMinResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.5 NAME 'nsimMaxResponseLength' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.6 NAME 'nsimForgottenLoginConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.7 NAME 'nsimForgottenAction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.8 NAME 'nsimAssignments' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.9 NAME 'nsimChallengeSetDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.10 NAME 'nsimChallengeSetGUID' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.11 NAME 'nsimPwdRuleEnforcement' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.39.44.4.12 NAME 'nsimHint' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.39.44.4.13 NAME 'nsimPasswordReminder' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.4 NAME 'sssProxyStoreKey' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.5 NAME 'sssProxyStoreSecrets' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} USAGE directoryOperation X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.266.4.6 NAME 'sssActiveServerList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.7 NAME 'sssCacheRefreshInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.8 NAME 'sssAdminList' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.266.4.9 NAME 'sssAdminGALabel' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.10 NAME 'sssEnableReadTimestamps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.11 NAME 'sssDisableMasterPasswords' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.12 NAME 'sssEnableAdminAccess' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.266.4.13 NAME 'sssReadSecretPolicies' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} )", + "( 2.16.840.1.113719.1.266.4.14 NAME 'sssServerPolicyOverrideDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.1.531 NAME 'eDirCloneSource' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.1.532 NAME 'eDirCloneKeys' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{64512} NO-USER-MODIFICATION USAGE directoryOperation X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' X-NDS_HIDDEN '1' )", + "( 2.16.840.1.113719.1.1.4.1.533 NAME 'eDirCloneLock' SYNTAX 2.16.840.1.113719.1.1.5.1.15{64512} SINGLE-VALUE X-NDS_NOT_SCHED_SYNC_IMMEDIATE '1' )", + "( 2.16.840.1.113719.1.1.4.711 NAME 'groupMember' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.16.840.1.113719.1.1.4.712 NAME 'nestedConfig' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.16.840.1.113719.1.1.4.717 NAME 'xdasDSConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.718 NAME 'xdasConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.719 NAME 'xdasVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_UPPER_BOUND '32768' )", + "( 2.16.840.1.113719.1.347.4.79 NAME 'NAuditInstrumentation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.347.4.2 NAME 'NAuditLoggingServer' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_PUBLIC_READ '1' )", + "( 2.16.840.1.113719.1.1.4.724 NAME 'cefConfiguration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{64512} )", + "( 2.16.840.1.113719.1.1.4.725 NAME 'cefVersion' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27{32768} SINGLE-VALUE X-NDS_UPPER_BOUND '32768' )" + ], + "createTimestamp": [], + "dITContentRules": [], + "dITStructureRules": [], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.1 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.2 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.3 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.4 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.5 X-NDS_SYNTAX '21' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 X-NDS_SYNTAX '7' )", + "( 2.16.840.1.113719.1.1.5.1.6 X-NDS_SYNTAX '6' )", + "( 1.3.6.1.4.1.1466.115.121.1.8 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.9 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.10 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.22 X-NDS_SYNTAX '22' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 X-NDS_SYNTAX '1' )", + "( 1.3.6.1.4.1.1466.115.121.1.13 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.16 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.17 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.18 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.19 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.20 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.21 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 X-NDS_SYNTAX '11' )", + "( 1.3.6.1.4.1.1466.115.121.1.23 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 X-NDS_SYNTAX '24' )", + "( 1.3.6.1.4.1.1466.115.121.1.25 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 X-NDS_SYNTAX '2' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 X-NDS_SYNTAX '8' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 X-NDS_SYNTAX '9' )", + "( 1.2.840.113556.1.4.906 X-NDS_SYNTAX '29' )", + "( 1.3.6.1.4.1.1466.115.121.1.54 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.56 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.57 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.29 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.30 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.31 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.32 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.33 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.55 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.35 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.19 X-NDS_SYNTAX '19' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 X-NDS_SYNTAX '5' )", + "( 2.16.840.1.113719.1.1.5.1.17 X-NDS_SYNTAX '17' )", + "( 1.3.6.1.4.1.1466.115.121.1.37 X-NDS_SYNTAX '3' )", + "( 2.16.840.1.113719.1.1.5.1.13 X-NDS_SYNTAX '13' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 X-NDS_SYNTAX '20' )", + "( 1.3.6.1.4.1.1466.115.121.1.39 X-NDS_SYNTAX '3' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 X-NDS_SYNTAX '18' )", + "( 1.3.6.1.4.1.1466.115.121.1.43 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 X-NDS_SYNTAX '4' )", + "( 1.3.6.1.4.1.1466.115.121.1.42 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.16 X-NDS_SYNTAX '16' )", + "( 1.3.6.1.4.1.1466.115.121.1.58 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.45 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.46 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.47 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.48 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.49 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.12 X-NDS_SYNTAX '12' )", + "( 2.16.840.1.113719.1.1.5.1.23 X-NDS_SYNTAX '23' )", + "( 2.16.840.1.113719.1.1.5.1.15 X-NDS_SYNTAX '15' )", + "( 2.16.840.1.113719.1.1.5.1.14 X-NDS_SYNTAX '14' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 X-NDS_SYNTAX '10' )", + "( 1.3.6.1.4.1.1466.115.121.1.51 X-NDS_SYNTAX '9' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.25 X-NDS_SYNTAX '25' )", + "( 1.3.6.1.4.1.1466.115.121.1.53 X-NDS_SYNTAX '9' )", + "( 2.16.840.1.113719.1.1.5.1.26 X-NDS_SYNTAX '26' )", + "( 2.16.840.1.113719.1.1.5.1.27 X-NDS_SYNTAX '27' )" + ], + "matchingRuleUse": [], + "matchingRules": [], + "modifyTimestamp": [ + "20190831135835Z" + ], + "nameForms": [], + "objectClass": [ + "top", + "subschema" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'Top' STRUCTURAL MUST objectClass MAY ( cAPublicKey $ cAPrivateKey $ certificateValidityInterval $ authorityRevocation $ lastReferencedTime $ equivalentToMe $ ACL $ backLink $ binderyProperty $ Obituary $ Reference $ revision $ ndsCrossCertificatePair $ certificateRevocation $ usedBy $ GUID $ otherGUID $ DirXML-Associations $ creatorsName $ modifiersName $ objectVersion $ auxClassCompatibility $ unknownBaseClass $ unknownAuxiliaryClass $ masvProposedLabel $ masvDefaultRange $ masvAuthorizedRange $ auditFileLink $ rbsAssignedRoles $ rbsOwnedCollections $ rbsAssignedRoles2 $ rbsOwnedCollections2 ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '16#subtree#[Creator]#[Entry Rights]' )", + "( 1.3.6.1.4.1.42.2.27.1.2.1 NAME 'aliasObject' SUP Top STRUCTURAL MUST aliasedObjectName X-NDS_NAME 'Alias' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.2 NAME 'Country' SUP Top STRUCTURAL MUST c MAY ( description $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING 'c' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.3 NAME 'Locality' SUP Top STRUCTURAL MAY ( description $ l $ seeAlso $ st $ street $ searchGuide $ sssActiveServerList $ sssServerPolicyOverrideDN ) X-NDS_NAMING ( 'l' 'st' ) X-NDS_CONTAINMENT ( 'Country' 'organizationalUnit' 'Locality' 'Organization' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.4 NAME 'Organization' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST o MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'o' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'domain' ) X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.5 NAME 'organizationalUnit' SUP ( ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST ou MAY ( description $ facsimileTelephoneNumber $ l $ loginScript $ eMailAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ printJobConfiguration $ printerControl $ seeAlso $ st $ street $ telephoneNumber $ loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ nNSDomain $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber $ businessCategory $ searchGuide $ rADIUSAttributeLists $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSServiceList $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'ou' X-NDS_CONTAINMENT ( 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Unit' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Self]#loginScript' '2#entry#[Self]#printJobConfiguration') )", + "( 2.5.6.8 NAME 'organizationalRole' SUP Top STRUCTURAL MUST cn MAY ( description $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ roleOccupant $ seeAlso $ st $ street $ telephoneNumber $ mailboxLocation $ mailboxID $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ internationaliSDNNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Role' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.9 NAME ( 'groupOfNames' 'group' 'groupOfUniqueNames' ) SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ owner $ seeAlso $ groupID $ fullName $ eMailAddress $ mailboxLocation $ mailboxID $ Profile $ profileMembership $ loginScript $ businessCategory $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.6 NAME 'Person' SUP ndsLoginProperties STRUCTURAL MUST ( cn $ sn ) MAY ( description $ seeAlso $ telephoneNumber $ fullName $ givenName $ initials $ generationQualifier $ uid $ assistant $ assistantPhone $ city $ st $ company $ co $ directReports $ manager $ mailstop $ mobile $ personalTitle $ pager $ workforceID $ instantMessagingID $ preferredName $ photo $ jobCode $ siteLocation $ employeeStatus $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ otherPhoneNumber $ managerWorkforceID $ roomNumber $ jackNumber $ departmentNumber $ vehicleInformation $ accessCardNumber $ isManager $ userPassword ) X-NDS_NAMING ( 'cn' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.5.6.7 NAME 'organizationalPerson' SUP Person STRUCTURAL MAY ( facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ mailboxLocation $ mailboxID $ uid $ mail $ employeeNumber $ destinationIndicator $ internationaliSDNNumber $ preferredDeliveryMethod $ registeredAddress $ teletexTerminalIdentifier $ telexNumber $ x121Address $ businessCategory $ roomNumber $ x500UniqueIdentifier ) X-NDS_NAMING ( 'cn' 'ou' 'uid' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Organizational Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' SUP organizationalPerson STRUCTURAL MAY ( groupMembership $ ndsHomeDirectory $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ printJobConfiguration $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ messageServer $ Language $ ndsUID $ lockedByIntruder $ serverHolds $ lastLoginTime $ typeCreatorMap $ higherPrivileges $ printerControl $ securityFlags $ profileMembership $ Timezone $ sASServiceDN $ sASSecretStore $ sASSecretStoreKey $ sASSecretStoreData $ sASPKIStoreKeys $ userCertificate $ nDSPKIUserCertificateInfo $ nDSPKIKeystore $ rADIUSActiveConnections $ rADIUSAttributeLists $ rADIUSConcurrentLimit $ rADIUSConnectionHistory $ rADIUSDefaultProfile $ rADIUSDialAccessGroup $ rADIUSEnableDialAccess $ rADIUSPassword $ rADIUSServiceList $ audio $ businessCategory $ carLicense $ departmentNumber $ employeeNumber $ employeeType $ displayName $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledUri $ mail $ manager $ mobile $ o $ pager $ ldapPhoto $ preferredLanguage $ roomNumber $ secretary $ uid $ userSMIMECertificate $ x500UniqueIdentifier $ userPKCS12 $ sssProxyStoreKey $ sssProxyStoreSecrets $ sssServerPolicyOverrideDN ) X-NDS_NAME 'User' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#loginScript' '1#subtree#[Root Template]#[Entry Rights]' '2#entry#[Public]#messageServer' '2#entry#[Root Template]#groupMembership' '6#entry#[Self]#printJobConfiguration' '2#entry#[Root Template]#networkAddress') )", + "( 2.5.6.14 NAME 'Device' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ networkAddress $ ou $ o $ owner $ seeAlso $ serialNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.4 NAME 'Computer' SUP Device STRUCTURAL MAY ( operator $ server $ status ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.17 NAME 'Printer' SUP Device STRUCTURAL MAY ( Cartridge $ printerConfiguration $ defaultQueue $ hostDevice $ printServer $ Memory $ networkAddressRestriction $ notify $ operator $ pageDescriptionLanguage $ queue $ status $ supportedTypefaces ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.21 NAME 'Resource' SUP Top ABSTRACT MUST cn MAY ( description $ hostResourceName $ l $ ou $ o $ seeAlso $ Uses ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.20 NAME 'Queue' SUP Resource STRUCTURAL MUST queueDirectory MAY ( Device $ operator $ server $ User $ networkAddress $ Volume $ hostServer ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.3 NAME 'binderyQueue' SUP Queue STRUCTURAL MUST binderyType X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_NAME 'Bindery Queue' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.26 NAME 'Volume' SUP Resource STRUCTURAL MUST hostServer MAY status X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Root Template]#hostResourceName' '2#entry#[Root Template]#hostServer') )", + "( 2.16.840.1.113719.1.1.6.1.7 NAME 'directoryMap' SUP Resource STRUCTURAL MUST hostServer MAY path X-NDS_NAME 'Directory Map' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.19 NAME 'Profile' SUP Top STRUCTURAL MUST ( cn $ loginScript ) MAY ( description $ l $ ou $ o $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.22 NAME 'Server' SUP Top ABSTRACT MUST cn MAY ( description $ hostDevice $ l $ ou $ o $ privateKey $ publicKey $ Resource $ seeAlso $ status $ User $ Version $ networkAddress $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ fullName $ securityEquals $ securityFlags $ Timezone $ ndapClassPasswordMgmt $ ndapClassLoginMgmt ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '2#entry#[Public]#networkAddress' '16#subtree#[Self]#[Entry Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.10 NAME 'ncpServer' SUP Server STRUCTURAL MAY ( operator $ supportedServices $ messagingServer $ dsRevision $ permanentConfigParms $ ndsPredicateStatsDN $ languageId $ indexDefinition $ CachedAttrsOnExtRefs $ NCPKeyMaterialName $ NDSRightsToMonitor $ ldapServerDN $ httpServerDN $ emboxConfig $ sASServiceDN $ cACertificate $ cAECCertificate $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKICertificateChain $ nDSPKIParentCADN $ nDSPKISDKeyID $ nDSPKISDKeyStruct $ snmpGroupDN $ wANMANWANPolicy $ wANMANLANAreaMembership $ wANMANCost $ wANMANDefaultCost $ encryptionPolicyDN $ eDirCloneSource $ eDirCloneLock $ xdasDSConfiguration $ xdasConfiguration $ xdasVersion $ NAuditLoggingServer $ NAuditInstrumentation $ cefConfiguration $ cefVersion ) X-NDS_NAME 'NCP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#messagingServer' )", + "( 2.16.840.1.113719.1.1.6.1.18 NAME 'printServer' SUP Server STRUCTURAL MAY ( operator $ printer $ sAPName ) X-NDS_NAME 'Print Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#subtree#[Root Template]#[All Attributes Rights]' )", + "( 2.16.840.1.113719.1.1.6.1.31 NAME 'CommExec' SUP Server STRUCTURAL MAY networkAddressRestriction X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.2 NAME 'binderyObject' SUP Top STRUCTURAL MUST ( binderyObjectRestriction $ binderyType $ cn ) X-NDS_NAMING ( 'cn' 'binderyType' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'Bindery Object' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.15 NAME 'Partition' AUXILIARY MAY ( Convergence $ partitionCreationTime $ Replica $ inheritedACL $ lowConvergenceSyncInterval $ receivedUpTo $ synchronizedUpTo $ authorityRevocation $ certificateRevocation $ cAPrivateKey $ cAPublicKey $ ndsCrossCertificatePair $ lowConvergenceResetTime $ highConvergenceSyncInterval $ partitionControl $ replicaUpTo $ partitionStatus $ transitiveVector $ purgeVector $ synchronizationTolerance $ obituaryNotify $ localReceivedUpTo $ federationControl $ syncPanePoint $ syncWindowVector $ EBAPartitionConfiguration $ authoritative $ allowAliasToAncestor $ sASSecurityDN $ masvLabel $ ndapPartitionPasswordMgmt $ ndapPartitionLoginMgmt $ prSyncPolicyDN $ dsEncryptedReplicationConfig ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.0 NAME 'aFPServer' SUP Server STRUCTURAL MAY ( serialNumber $ supportedConnections ) X-NDS_NAME 'AFP Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.27 NAME 'messagingServer' SUP Server STRUCTURAL MAY ( messagingDatabaseLocation $ messageRoutingGroup $ Postmaster $ supportedServices $ messagingServerType $ supportedGateway ) X-NDS_NAME 'Messaging Server' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]' '6#entry#[Self]#status' '2#entry#[Public]#messagingServerType' '2#entry#[Public]#messagingDatabaseLocation') )", + "( 2.16.840.1.113719.1.1.6.1.28 NAME 'messageRoutingGroup' SUP groupOfNames STRUCTURAL X-NDS_NAME 'Message Routing Group' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES ( '1#subtree#[Self]#[Entry Rights]' '2#subtree#[Self]#[All Attributes Rights]') )", + "( 2.16.840.1.113719.1.1.6.1.29 NAME 'externalEntity' SUP Top STRUCTURAL MUST cn MAY ( description $ seeAlso $ facsimileTelephoneNumber $ l $ eMailAddress $ ou $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ st $ street $ title $ externalName $ mailboxLocation $ mailboxID ) X-NDS_NAMING ( 'cn' 'ou' ) X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'External Entity' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Public]#externalName' )", + "( 2.16.840.1.113719.1.1.6.1.30 NAME 'List' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ ou $ o $ eMailAddress $ mailboxLocation $ mailboxID $ owner $ seeAlso $ fullName ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' X-NDS_ACL_TEMPLATES '2#entry#[Root Template]#member' )", + "( 2.16.840.1.113719.1.1.6.1.32 NAME 'treeRoot' SUP Top STRUCTURAL MUST T MAY ( EBATreeConfiguration $ sssActiveServerList ) X-NDS_NAMING 'T' X-NDS_NAME 'Tree Root' X-NDS_NONREMOVABLE '1' )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP ( Top $ ndsLoginProperties $ ndsContainerLoginProperties ) STRUCTURAL MUST dc MAY ( searchGuide $ o $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ associatedName $ description $ sssActiveServerList $ sssServerPolicyOverrideDN $ userPassword ) X-NDS_NAMING 'dc' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NONREMOVABLE '1' )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' AUXILIARY MUST dc X-NDS_NAMING 'dc' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.33 NAME 'ndsLoginProperties' SUP Top ABSTRACT MAY ( groupMembership $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginGraceRemaining $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginScript $ loginTime $ networkAddressRestriction $ networkAddress $ passwordsUsed $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ privateKey $ Profile $ publicKey $ securityEquals $ accountBalance $ allowUnlimitedCredit $ minimumAccountBalance $ Language $ lockedByIntruder $ serverHolds $ lastLoginTime $ higherPrivileges $ securityFlags $ profileMembership $ Timezone $ loginActivationTime $ UTF8LoginScript $ loginScriptCharset $ sASNDSPasswordWindow $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAllowableSubjectNames $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPCounter $ sasOTPDigits $ sasOTPReSync $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordKey $ nspmPassword $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ nsimHint $ nsimPasswordReminder $ userPassword ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.141.6.1 NAME 'federationBoundary' AUXILIARY MUST federationBoundaryType MAY ( federationControl $ federationDNSName $ federationSearchPath ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.34 NAME 'ndsContainerLoginProperties' SUP Top ABSTRACT MAY ( loginIntruderLimit $ intruderAttemptResetInterval $ detectIntruder $ lockoutAfterDetection $ intruderLockoutResetInterval $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPDigits $ sasUpdateLoginTimeInterval $ ndapPasswordMgmt $ ndapLoginMgmt $ nspmPasswordPolicyDN ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.27.6.3 NAME 'ndsPredicateStats' SUP Top STRUCTURAL MUST ( cn $ ndsPredicateState $ ndsPredicateFlush ) MAY ( ndsPredicate $ ndsPredicateTimeout $ ndsPredicateUseValues ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.400.1 NAME 'edirSchemaVersion' SUP Top ABSTRACT MAY edirSchemaFlagVersion X-NDS_NOT_CONTAINER '1' X-NDS_NONREMOVABLE '1' )", + "( 2.16.840.1.113719.1.1.6.1.47 NAME 'immediateSuperiorReference' AUXILIARY MAY ref X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.1 NAME 'ldapServer' SUP Top STRUCTURAL MUST cn MAY ( ldapHostServer $ ldapGroupDN $ ldapTraceLevel $ ldapServerBindLimit $ ldapServerIdleTimeout $ lDAPUDPPort $ lDAPSearchSizeLimit $ lDAPSearchTimeLimit $ lDAPLogLevel $ lDAPLogFilename $ lDAPBackupLogFilename $ lDAPLogSizeLimit $ Version $ searchSizeLimit $ searchTimeLimit $ ldapEnableTCP $ ldapTCPPort $ ldapEnableSSL $ ldapSSLPort $ ldapKeyMaterialName $ filteredReplicaUsage $ extensionInfo $ nonStdClientSchemaCompatMode $ sslEnableMutualAuthentication $ ldapEnablePSearch $ ldapMaximumPSearchOperations $ ldapIgnorePSearchLimitsForEvents $ ldapTLSTrustedRootContainer $ ldapEnableMonitorEvents $ ldapMaximumMonitorEventsLoad $ ldapTLSRequired $ ldapTLSVerifyClientCertificate $ ldapConfigVersion $ ldapDerefAlias $ ldapNonStdAllUserAttrsMode $ ldapBindRestrictions $ ldapDefaultReferralBehavior $ ldapReferral $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ ldapLBURPNumWriterThreads $ ldapInterfaces $ ldapChainSecureRequired $ ldapStdCompliance $ ldapDerefAliasOnAuth $ ldapGeneralizedTime $ ldapPermissiveModify $ ldapSSLConfig ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Server' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.27.6.2 NAME 'ldapGroup' SUP Top STRUCTURAL MUST cn MAY ( ldapReferral $ ldapServerList $ ldapAllowClearTextPassword $ ldapAnonymousIdentity $ lDAPSuffix $ ldapAttributeMap $ ldapClassMap $ ldapSearchReferralUsage $ lDAPOtherReferralUsage $ transitionGroupDN $ ldapAttributeList $ ldapClassList $ ldapConfigVersion $ Version $ ldapDefaultReferralBehavior $ ldapTransitionBackLink $ ldapSSLConfig $ referralIncludeFilter $ referralExcludeFilter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) X-NDS_NAME 'LDAP Group' X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.22 NAME 'pkiCA' AUXILIARY MAY ( cACertificate $ certificateRevocationList $ authorityRevocationList $ crossCertificatePair $ attributeCertificate $ publicKey $ privateKey $ networkAddress $ loginTime $ lastLoginTime $ cAECCertificate $ crossCertificatePairEC ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.21 NAME 'pkiUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' AUXILIARY MAY userCertificate X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.11 NAME 'applicationProcess' SUP Top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.12 NAME 'applicationEntity' SUP Top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.13 NAME 'dSA' SUP applicationEntity STRUCTURAL MAY knowledgeInformation X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.5.6.16 NAME 'certificationAuthority' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.18 NAME 'userSecurityInformation' AUXILIARY MAY supportedAlgorithms X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.20 NAME 'dmd' SUP ndsLoginProperties AUXILIARY MUST dmdName MAY ( searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ l $ description $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY ( crossCertificatePair $ deltaRevocationList ) X-NDS_NAME 'certificationAuthorityVer2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.3.6.1 NAME 'httpServer' SUP Top STRUCTURAL MUST cn MAY ( httpHostServerDN $ httpThreadsPerCPU $ httpIOBufferSize $ httpRequestTimeout $ httpKeepAliveRequestTimeout $ httpSessionTimeout $ httpKeyMaterialObject $ httpTraceLevel $ httpAuthRequiresTLS $ httpDefaultClearPort $ httpDefaultTLSPort $ httpBindRestrictions ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.64.6.1.1 NAME 'Template' SUP Top STRUCTURAL MUST cn MAY ( trusteesOfNewObject $ newObjectSDSRights $ newObjectSFSRights $ setupScript $ runSetupScript $ membersOfTemplate $ volumeSpaceRestrictions $ setPasswordAfterCreate $ homeDirectoryRights $ accountBalance $ allowUnlimitedCredit $ description $ eMailAddress $ facsimileTelephoneNumber $ groupMembership $ higherPrivileges $ ndsHomeDirectory $ l $ Language $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginGraceLimit $ loginMaximumSimultaneous $ loginScript $ mailboxID $ mailboxLocation $ member $ messageServer $ minimumAccountBalance $ networkAddressRestriction $ newObjectSSelfRights $ ou $ passwordAllowChange $ passwordExpirationInterval $ passwordExpirationTime $ passwordMinimumLength $ passwordRequired $ passwordUniqueRequired $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ Profile $ st $ street $ securityEquals $ securityFlags $ seeAlso $ telephoneNumber $ title $ assistant $ assistantPhone $ city $ company $ co $ manager $ managerWorkforceID $ mailstop $ siteLocation $ employeeType $ costCenter $ costCenterDescription $ tollFreePhoneNumber $ departmentNumber ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.1 NAME 'homeInfo' AUXILIARY MAY ( homeCity $ homeEmailAddress $ homeFax $ homePhone $ homeState $ homePostalAddress $ homeZipCode $ personalMobile $ spouse $ children ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.8.6.2 NAME 'contingentWorker' AUXILIARY MAY ( vendorName $ vendorAddress $ vendorPhoneNumber ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.45 NAME 'dynamicGroup' SUP ( groupOfNames $ ndsLoginProperties ) STRUCTURAL MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.46 NAME 'dynamicGroupAux' SUP ( groupOfNames $ ndsLoginProperties ) AUXILIARY MAY ( memberQueryURL $ excludedMember $ dgIdentity $ dgAllowUnknown $ dgTimeOut $ dgAllowDuplicates $ userPassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.6.1.1 NAME 'sASSecurity' SUP Top STRUCTURAL MUST cn MAY ( nDSPKITreeCADN $ masvPolicyDN $ sASLoginPolicyDN $ sASLoginMethodContainerDN $ sasPostLoginMethodContainerDN $ nspmPolicyAgentContainerDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'treeRoot' 'Country' 'Organization' 'domain' ) X-NDS_NAME 'SAS:Security' )", + "( 2.16.840.1.113719.1.39.6.1.2 NAME 'sASService' SUP Resource STRUCTURAL MAY ( hostServer $ privateKey $ publicKey $ allowUnlimitedCredit $ fullName $ lastLoginTime $ lockedByIntruder $ loginAllowedTimeMap $ loginDisabled $ loginExpirationTime $ loginIntruderAddress $ loginIntruderAttempts $ loginIntruderResetTime $ loginMaximumSimultaneous $ loginTime $ networkAddress $ networkAddressRestriction $ notify $ operator $ owner $ path $ securityEquals $ securityFlags $ status $ Version $ nDSPKIKeyMaterialDN $ ndspkiKMOExport ) X-NDS_NAMING 'cn' X-NDS_NAME 'SAS:Service' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.1 NAME 'nDSPKICertificateAuthority' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKICertificateChainEC $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ nDSPKIPublicKeyEC $ nDSPKIPrivateKeyEC $ nDSPKIPublicKeyCertificateEC $ crossCertificatePairEC $ nDSPKISuiteBMode $ cACertificate $ cAECCertificate $ ndspkiCRLContainerDN $ ndspkiIssuedCertContainerDN $ ndspkiCRLConfigurationDNList $ ndspkiCRLECConfigurationDNList $ ndspkiSecurityRightsLevel $ ndspkiDefaultRSAKeySize $ ndspkiDefaultECCurve $ ndspkiDefaultCertificateLife ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:Certificate Authority' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.2 NAME 'nDSPKIKeyMaterial' SUP Top STRUCTURAL MUST cn MAY ( hostServer $ nDSPKIKeyFile $ nDSPKIPrivateKey $ nDSPKIPublicKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKISubjectName $ nDSPKIGivenName $ ndspkiAdditionalRoots $ nDSPKINotBefore $ nDSPKINotAfter ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'domain' ) X-NDS_NAME 'NDSPKI:Key Material' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.3 NAME 'nDSPKITrustedRoot' SUP Top STRUCTURAL MUST cn MAY ndspkiTrustedRootList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NAME 'NDSPKI:Trusted Root' )", + "( 2.16.840.1.113719.1.48.6.1.4 NAME 'nDSPKITrustedRootObject' SUP Top STRUCTURAL MUST ( cn $ nDSPKITrustedRootCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKITrustedRoot' X-NDS_NAME 'NDSPKI:Trusted Root Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.101 NAME 'nDSPKISDKeyAccessPartition' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'NDSPKI:SD Key Access Partition' )", + "( 2.16.840.1.113719.1.48.6.1.102 NAME 'nDSPKISDKeyList' SUP Top STRUCTURAL MUST cn MAY ( nDSPKISDKeyServerDN $ nDSPKISDKeyStruct $ nDSPKISDKeyCert ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nDSPKISDKeyAccessPartition' X-NDS_NAME 'NDSPKI:SD Key List' )", + "( 2.16.840.1.113719.1.31.6.2.1 NAME 'mASVSecurityPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ masvDomainPolicy $ masvPolicyUpdate $ masvClearanceNames $ masvLabelNames $ masvLabelSecrecyLevelNames $ masvLabelSecrecyCategoryNames $ masvLabelIntegrityLevelNames $ masvLabelIntegrityCategoryNames $ masvNDSAttributeLabels ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'MASV:Security Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.1 NAME 'sASLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'SAS:Login Method Container' )", + "( 2.16.840.1.113719.1.39.42.2.0.4 NAME 'sASLoginPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ privateKey $ publicKey $ sASAllowNDSPasswordWindow $ sASPolicyCredentials $ sASPolicyMethods $ sASPolicyObjectVersion $ sASPolicyServiceSubtypes $ sASPolicyServices $ sASPolicyUsers $ sASLoginSequence $ sASLoginPolicyUpdate $ sasNMASProductOptions $ sasPolicyMethods $ sasPolicyServices $ sasPolicyUsers $ sasAllowNDSPasswordWindow $ sasLoginFailureDelay $ sasDefaultLoginSequence $ sasAuthorizedLoginSequences $ sasAuditConfiguration $ sasUpdateLoginInfo $ sasOTPEnabled $ sasOTPLookAheadWindow $ sasOTPDigits $ sasUpdateLoginTimeInterval $ nspmPasswordPolicyDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' X-NDS_NAME 'SAS:Login Policy' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.7 NAME 'sASNMASBaseLoginMethod' SUP Top ABSTRACT MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasCertificateSearchContainers $ sasNMASMethodConfigData $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASLoginMethodContainer' X-NDS_NAME 'SAS:NMAS Base Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.8 NAME 'sASNMASLoginMethod' SUP sASNMASBaseLoginMethod STRUCTURAL X-NDS_NAME 'SAS:NMAS Login Method' )", + "( 2.16.840.1.113719.1.39.42.2.0.9 NAME 'rADIUSDialAccessSystem' SUP Top STRUCTURAL MUST cn MAY ( publicKey $ privateKey $ rADIUSAgedInterval $ rADIUSClient $ rADIUSCommonNameResolution $ rADIUSConcurrentLimit $ rADIUSDASVersion $ rADIUSEnableCommonNameLogin $ rADIUSEnableDialAccess $ rADIUSInterimAcctingTimeout $ rADIUSLookupContexts $ rADIUSMaxDASHistoryRecord $ rADIUSMaximumHistoryRecord $ rADIUSPasswordPolicy $ rADIUSPrivateKey $ rADIUSProxyContext $ rADIUSProxyDomain $ rADIUSProxyTarget $ rADIUSPublicKey $ sASLoginConfiguration $ sASLoginConfigurationKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Dial Access System' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.10 NAME 'rADIUSProfile' SUP Top STRUCTURAL MUST cn MAY rADIUSAttributeList X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NAME 'RADIUS:Profile' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.42.2.0.11 NAME 'sasPostLoginMethodContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.39.42.2.0.12 NAME 'sasPostLoginMethod' SUP Top STRUCTURAL MUST cn MAY ( description $ sASLoginSecret $ sASLoginSecretKey $ sASEncryptionType $ sASLoginConfiguration $ sASLoginConfigurationKey $ sASMethodIdentifier $ sASMethodVendor $ sASVendorSupport $ sASAdvisoryMethodGrade $ sASLoginClientMethodNetWare $ sASLoginServerMethodNetWare $ sASLoginClientMethodWINNT $ sASLoginServerMethodWINNT $ sasMethodVersion $ sASLoginPolicyUpdate $ sasUnsignedMethodModules $ sasServerModuleName $ sasServerModuleEntryPointName $ sasSASLMechanismName $ sasSASLMechanismEntryPointName $ sasClientModuleName $ sasClientModuleEntryPointName $ sasLoginClientMethodSolaris $ sasLoginServerMethodSolaris $ sasLoginClientMethodLinux $ sasLoginServerMethodLinux $ sasLoginClientMethodTru64 $ sasLoginServerMethodTru64 $ sasLoginClientMethodAIX $ sasLoginServerMethodAIX $ sasLoginClientMethodHPUX $ sasLoginServerMethodHPUX $ sasLoginClientMethods390 $ sasLoginServerMethods390 $ sasLoginClientMethodLinuxX64 $ sasLoginServerMethodLinuxX64 $ sasLoginClientMethodWinX64 $ sasLoginServerMethodWinX64 $ sasLoginClientMethodSolaris64 $ sasLoginServerMethodSolaris64 $ sasLoginClientMethodSolarisi386 $ sasLoginServerMethodSolarisi386 $ sasLoginClientMethodAIX64 $ sasLoginServerMethodAIX64 ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sasPostLoginMethodContainer' )", + "( 2.16.840.1.113719.1.6.6.1 NAME 'snmpGroup' SUP Top STRUCTURAL MUST cn MAY ( Version $ snmpServerList $ snmpTrapDisable $ snmpTrapInterval $ snmpTrapDescription $ snmpTrapConfig ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.2 NAME 'nspmPasswordPolicyContainer' SUP Top STRUCTURAL MUST cn MAY description X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) )", + "( 2.16.840.1.113719.1.39.43.6.3 NAME 'nspmPolicyAgent' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyAgentNetWare $ nspmPolicyAgentWINNT $ nspmPolicyAgentSolaris $ nspmPolicyAgentLinux $ nspmPolicyAgentAIX $ nspmPolicyAgentHPUX ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'nspmPasswordPolicyContainer' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.1 NAME 'nspmPasswordPolicy' SUP Top STRUCTURAL MUST cn MAY ( description $ nspmPolicyPrecedence $ nspmConfigurationOptions $ nspmChangePasswordMessage $ passwordExpirationInterval $ loginGraceLimit $ nspmMinPasswordLifetime $ passwordUniqueRequired $ nspmPasswordHistoryLimit $ nspmPasswordHistoryExpiration $ passwordAllowChange $ passwordRequired $ passwordMinimumLength $ nspmMaximumLength $ nspmCaseSensitive $ nspmMinUpperCaseCharacters $ nspmMaxUpperCaseCharacters $ nspmMinLowerCaseCharacters $ nspmMaxLowerCaseCharacters $ nspmNumericCharactersAllowed $ nspmNumericAsFirstCharacter $ nspmNumericAsLastCharacter $ nspmMinNumericCharacters $ nspmMaxNumericCharacters $ nspmSpecialCharactersAllowed $ nspmSpecialAsFirstCharacter $ nspmSpecialAsLastCharacter $ nspmMinSpecialCharacters $ nspmMaxSpecialCharacters $ nspmMaxRepeatedCharacters $ nspmMaxConsecutiveCharacters $ nspmMinUniqueCharacters $ nspmDisallowedAttributeValues $ nspmExcludeList $ nspmExtendedCharactersAllowed $ nspmExtendedAsFirstCharacter $ nspmExtendedAsLastCharacter $ nspmMinExtendedCharacters $ nspmMaxExtendedCharacters $ nspmUpperAsFirstCharacter $ nspmUpperAsLastCharacter $ nspmLowerAsFirstCharacter $ nspmLowerAsLastCharacter $ nspmComplexityRules $ nspmAD2K8Syntax $ nspmAD2K8maxViolation $ nspmXCharLimit $ nspmXCharHistoryLimit $ nspmUnicodeAllowed $ nspmNonAlphaCharactersAllowed $ nspmMinNonAlphaCharacters $ nspmMaxNonAlphaCharacters $ pwdInHistory $ nspmAdminsDoNotExpirePassword $ nspmPasswordACL $ nsimChallengeSetDN $ nsimForgottenAction $ nsimForgottenLoginConfig $ nsimAssignments $ nsimChallengeSetGUID $ nsimPwdRuleEnforcement ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'domain' 'Locality' 'Organization' 'organizationalUnit' 'Country' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.43.6.4 NAME 'nspmPasswordAux' AUXILIARY MAY ( publicKey $ privateKey $ loginGraceLimit $ loginGraceRemaining $ passwordExpirationTime $ passwordRequired $ nspmPasswordKey $ nspmPassword $ nspmDistributionPassword $ nspmPreviousDistributionPassword $ nspmPasswordHistory $ nspmAdministratorChangeCount $ nspmPasswordPolicyDN $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ nspmDoNotExpirePassword ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.12.6.1.0 NAME 'auditFileObject' SUP Top STRUCTURAL MUST ( cn $ auditPolicy $ auditContents ) MAY ( description $ auditPath $ auditLinkList $ auditType $ auditCurrentEncryptionKey $ auditAEncryptionKey $ auditBEncryptionKey ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Top' 'Country' 'Locality' 'Organization' 'organizationalUnit' 'treeRoot' 'domain' ) X-NDS_NAME 'Audit:File Object' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.38.6.1.4 NAME 'wANMANLANArea' SUP Top STRUCTURAL MUST cn MAY ( description $ l $ member $ o $ ou $ owner $ seeAlso $ wANMANWANPolicy $ wANMANCost $ wANMANDefaultCost ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NAME 'WANMAN:LAN Area' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.37.1 NAME 'rbsCollection' SUP Top STRUCTURAL MUST cn MAY ( owner $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.30.1 NAME 'rbsExternalScope' SUP Top ABSTRACT MUST cn MAY ( rbsURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.31.1 NAME 'rbsModule' SUP Top STRUCTURAL MUST cn MAY ( rbsURL $ rbsPath $ rbsType $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.32.1 NAME 'rbsRole' SUP Top STRUCTURAL MUST cn MAY ( rbsContent $ rbsMember $ rbsTrusteeOf $ rbsGALabel $ rbsParameters $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection' )", + "( 2.16.840.1.113719.1.135.6.33.1 NAME 'rbsTask' SUP Top STRUCTURAL MUST cn MAY ( rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ rbsTaskTemplates $ rbsTaskTemplatesURL $ description $ rbsXMLInfo ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.34.1 NAME 'rbsBook' SUP rbsTask STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.35.1 NAME 'rbsScope' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.45.1 NAME 'rbsCollection2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsParameters $ owner $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'domain' ) )", + "( 2.16.840.1.113719.1.135.6.38.1 NAME 'rbsExternalScope2' SUP Top ABSTRACT MUST cn MAY ( rbsXMLInfo $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.39.1 NAME 'rbsModule2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsPath $ rbsType $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.40.1 NAME 'rbsRole2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContent $ rbsMember $ rbsTrusteeOf $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsCollection2' )", + "( 2.16.840.1.113719.1.135.6.41.1 NAME 'rbsTask2' SUP Top STRUCTURAL MUST cn MAY ( rbsXMLInfo $ rbsContentMembership $ rbsType $ rbsTaskRights $ rbsEntryPoint $ rbsParameters $ description ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'rbsModule2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.42.1 NAME 'rbsBook2' SUP rbsTask2 STRUCTURAL MAY ( rbsTargetObjectType $ rbsPageMembership ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.135.6.43.1 NAME 'rbsScope2' SUP groupOfNames STRUCTURAL MAY ( rbsContext $ rbsXMLInfo ) X-NDS_CONTAINMENT 'rbsRole2' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.49 NAME 'prSyncPolicy' SUP Top STRUCTURAL MUST cn MAY prSyncAttributes X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'domain' 'Country' 'Locality' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.50 NAME 'encryptionPolicy' SUP Top STRUCTURAL MUST cn MAY ( attrEncryptionDefinition $ attrEncryptionRequiresSecure ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'domain' 'organizationalUnit' 'Organization' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.5 NAME 'ndspkiContainer' SUP Top STRUCTURAL MUST cn X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'ndspkiContainer' 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'nDSPKITrustedRoot' ) )", + "( 2.16.840.1.113719.1.48.6.1.6 NAME 'ndspkiCertificate' SUP Top STRUCTURAL MUST ( cn $ userCertificate ) MAY ( nDSPKISubjectName $ nDSPKINotBefore $ nDSPKINotAfter $ externalName $ givenName $ sn ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sASSecurity' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'ndspkiContainer' 'nDSPKITrustedRoot' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.48.6.1.7 NAME 'ndspkiCRLConfiguration' SUP Top STRUCTURAL MUST cn MAY ( ndspkiCRLFileName $ ndspkiDirectory $ ndspkiStatus $ ndspkiIssueTime $ ndspkiNextIssueTime $ ndspkiAttemptTime $ ndspkiTimeInterval $ ndspkiCRLMaxProcessingInterval $ ndspkiCRLNumber $ ndspkiDistributionPoints $ ndspkiDistributionPointDN $ ndspkiCADN $ ndspkiCRLProcessData $ nDSPKIPublicKey $ nDSPKIPrivateKey $ nDSPKIPublicKeyCertificate $ nDSPKICertificateChain $ nDSPKIParentCA $ nDSPKIParentCADN $ nDSPKISubjectName $ cACertificate $ hostServer $ ndspkiCRLType $ ndspkiCRLExtendValidity ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'ndspkiContainer' )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP Top STRUCTURAL MUST cn MAY ( authorityRevocationList $ authorityRevocationList $ cACertificate $ certificateRevocationList $ certificateRevocationList $ crossCertificatePair $ deltaRevocationList $ deltaRevocationList $ ndspkiCRLConfigurationDN ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'Country' 'Locality' 'organizationalUnit' 'Organization' 'sASSecurity' 'domain' 'ndspkiCRLConfiguration' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.7.6.1 NAME 'notfTemplateCollection' SUP Top STRUCTURAL MUST cn MAY ( notfSMTPEmailHost $ notfSMTPEmailFrom $ notfSMTPEmailUserName $ sASSecretStore ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.7.6.2 NAME 'notfMergeTemplate' SUP Top STRUCTURAL MUST cn MAY ( notfMergeTemplateData $ notfMergeTemplateSubject ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'notfTemplateCollection' X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.39.44.6.1 NAME 'nsimChallengeSet' SUP Top STRUCTURAL MUST cn MAY ( description $ nsimRequiredQuestions $ nsimRandomQuestions $ nsimNumberRandomQuestions $ nsimMinResponseLength $ nsimMaxResponseLength ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'nspmPasswordPolicyContainer' 'Country' 'domain' 'Locality' 'Organization' 'organizationalUnit' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.266.6.1 NAME 'sssServerPolicies' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT 'sASSecurity' )", + "( 2.16.840.1.113719.1.266.6.2 NAME 'sssServerPolicyOverride' SUP Top STRUCTURAL MUST cn MAY ( sssCacheRefreshInterval $ sssEnableReadTimestamps $ sssDisableMasterPasswords $ sssEnableAdminAccess $ sssAdminList $ sssAdminGALabel $ sssReadSecretPolicies ) X-NDS_NAMING 'cn' X-NDS_CONTAINMENT ( 'sssServerPolicies' 'Organization' 'organizationalUnit' 'Country' 'Locality' 'domain' ) X-NDS_NOT_CONTAINER '1' )", + "( 2.16.840.1.113719.1.1.6.1.91 NAME 'nestedGroupAux' AUXILIARY MAY ( groupMember $ excludedMember $ nestedConfig $ groupMembership ) X-NDS_NOT_CONTAINER '1' )" + ] + }, + "schema_entry": "cn=schema", + "type": "SchemaInfo" +} +""" + +edir_9_1_4_dsa_info = """ +{ + "raw": { + "abandonOps": [ + "0" + ], + "addEntryOps": [ + "0" + ], + "altServer": [], + "bindSecurityErrors": [ + "0" + ], + "chainings": [ + "0" + ], + "compareOps": [ + "0" + ], + "directoryTreeName": [ + "TEST_TREE" + ], + "dsaName": [ + "cn=MYSERVER,o=resources" + ], + "errors": [ + "0" + ], + "extendedOps": [ + "0" + ], + "inBytes": [ + "293" + ], + "inOps": [ + "3" + ], + "listOps": [ + "0" + ], + "modifyEntryOps": [ + "0" + ], + "modifyRDNOps": [ + "0" + ], + "namingContexts": [ + "" + ], + "oneLevelSearchOps": [ + "0" + ], + "outBytes": [ + "14" + ], + "readOps": [ + "1" + ], + "referralsReturned": [ + "0" + ], + "removeEntryOps": [ + "0" + ], + "repUpdatesIn": [ + "0" + ], + "repUpdatesOut": [ + "0" + ], + "searchOps": [ + "1" + ], + "securityErrors": [ + "0" + ], + "simpleAuthBinds": [ + "1" + ], + "strongAuthBinds": [ + "0" + ], + "subschemaSubentry": [ + "cn=schema" + ], + "supportedCapabilities": [], + "supportedControl": [ + "2.16.840.1.113719.1.27.101.6", + "2.16.840.1.113719.1.27.101.5", + "1.2.840.113556.1.4.319", + "2.16.840.1.113730.3.4.3", + "2.16.840.1.113730.3.4.2", + "2.16.840.1.113719.1.27.101.57", + "2.16.840.1.113719.1.27.103.7", + "2.16.840.1.113719.1.27.101.40", + "2.16.840.1.113719.1.27.101.41", + "1.2.840.113556.1.4.1413", + "1.2.840.113556.1.4.805", + "2.16.840.1.113730.3.4.18", + "1.2.840.113556.1.4.529" + ], + "supportedExtension": [ + "2.16.840.1.113719.1.148.100.1", + "2.16.840.1.113719.1.148.100.3", + "2.16.840.1.113719.1.148.100.5", + "2.16.840.1.113719.1.148.100.7", + "2.16.840.1.113719.1.148.100.9", + "2.16.840.1.113719.1.148.100.11", + "2.16.840.1.113719.1.148.100.13", + "2.16.840.1.113719.1.148.100.15", + "2.16.840.1.113719.1.148.100.17", + "2.16.840.1.113719.1.39.42.100.1", + "2.16.840.1.113719.1.39.42.100.3", + "2.16.840.1.113719.1.39.42.100.5", + "2.16.840.1.113719.1.39.42.100.7", + "2.16.840.1.113719.1.39.42.100.9", + "2.16.840.1.113719.1.39.42.100.11", + "2.16.840.1.113719.1.39.42.100.13", + "2.16.840.1.113719.1.39.42.100.15", + "2.16.840.1.113719.1.39.42.100.17", + "2.16.840.1.113719.1.39.42.100.19", + "2.16.840.1.113719.1.39.42.100.21", + "2.16.840.1.113719.1.39.42.100.23", + "2.16.840.1.113719.1.39.42.100.25", + "2.16.840.1.113719.1.39.42.100.27", + "2.16.840.1.113719.1.39.42.100.29", + "1.3.6.1.4.1.4203.1.11.1", + "2.16.840.1.113719.1.27.100.1", + "2.16.840.1.113719.1.27.100.3", + "2.16.840.1.113719.1.27.100.5", + "2.16.840.1.113719.1.27.100.7", + "2.16.840.1.113719.1.27.100.11", + "2.16.840.1.113719.1.27.100.13", + "2.16.840.1.113719.1.27.100.15", + "2.16.840.1.113719.1.27.100.17", + "2.16.840.1.113719.1.27.100.19", + "2.16.840.1.113719.1.27.100.21", + "2.16.840.1.113719.1.27.100.23", + "2.16.840.1.113719.1.27.100.25", + "2.16.840.1.113719.1.27.100.27", + "2.16.840.1.113719.1.27.100.29", + "2.16.840.1.113719.1.27.100.31", + "2.16.840.1.113719.1.27.100.33", + "2.16.840.1.113719.1.27.100.35", + "2.16.840.1.113719.1.27.100.37", + "2.16.840.1.113719.1.27.100.39", + "2.16.840.1.113719.1.27.100.41", + "2.16.840.1.113719.1.27.100.96", + "2.16.840.1.113719.1.27.100.98", + "2.16.840.1.113719.1.27.100.101", + "2.16.840.1.113719.1.27.100.103", + "2.16.840.1.113719.1.142.100.1", + "2.16.840.1.113719.1.142.100.4", + "2.16.840.1.113719.1.142.100.6", + "2.16.840.1.113719.1.27.100.9", + "2.16.840.1.113719.1.27.100.43", + "2.16.840.1.113719.1.27.100.45", + "2.16.840.1.113719.1.27.100.47", + "2.16.840.1.113719.1.27.100.49", + "2.16.840.1.113719.1.27.100.51", + "2.16.840.1.113719.1.27.100.53", + "2.16.840.1.113719.1.27.100.55", + "1.3.6.1.4.1.1466.20037", + "2.16.840.1.113719.1.27.100.79", + "2.16.840.1.113719.1.27.100.84", + "2.16.840.1.113719.1.27.103.1", + "2.16.840.1.113719.1.27.103.2" + ], + "supportedFeatures": [ + "1.3.6.1.4.1.4203.1.5.1", + "2.16.840.1.113719.1.27.99.1" + ], + "supportedGroupingTypes": [ + "2.16.840.1.113719.1.27.103.8" + ], + "supportedLDAPVersion": [ + "2", + "3" + ], + "supportedSASLMechanisms": [ + "NMAS_LOGIN" + ], + "unAuthBinds": [ + "0" + ], + "vendorName": [ + "NetIQ Corporation" + ], + "vendorVersion": [ + "LDAP Agent for NetIQ eDirectory 9.1.4 (40105.09)" + ], + "wholeSubtreeSearchOps": [ + "0" + ] + }, + "type": "DsaInfo" +} +""" \ No newline at end of file diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/slapd24.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/slapd24.py new file mode 100644 index 0000000..1c66332 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/protocol/schemas/slapd24.py @@ -0,0 +1,758 @@ +""" +""" + +# Created on 2014.10.21 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +slapd_2_4_schema = """ +{ + "raw": { + "attributeTypes": [ + "( 2.5.4.0 NAME 'objectClass' DESC 'RFC4512: object classes of the entity' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.21.9 NAME 'structuralObjectClass' DESC 'RFC4512: structural object class of entry' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.1 NAME 'createTimestamp' DESC 'RFC4512: time which object was created' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.2 NAME 'modifyTimestamp' DESC 'RFC4512: time which object was last modified' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.3 NAME 'creatorsName' DESC 'RFC4512: name of creator' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.4 NAME 'modifiersName' DESC 'RFC4512: name of last modifier' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.9 NAME 'hasSubordinates' DESC 'X.501: entry has children' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 2.5.18.10 NAME 'subschemaSubentry' DESC 'RFC4512: name of controlling subschema entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.1.20 NAME 'entryDN' DESC 'DN of the entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.1.16.4 NAME 'entryUUID' DESC 'UUID of the entry' EQUALITY UUIDMatch ORDERING UUIDOrderingMatch SYNTAX 1.3.6.1.1.16.1 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' DESC 'RFC4512: alternative servers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.5 NAME 'namingContexts' DESC 'RFC4512: naming contexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.13 NAME 'supportedControl' DESC 'RFC4512: supported controls' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.7 NAME 'supportedExtension' DESC 'RFC4512: supported extended operations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.15 NAME 'supportedLDAPVersion' DESC 'RFC4512: supported LDAP versions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.120.14 NAME 'supportedSASLMechanisms' DESC 'RFC4512: supported SASL mechanisms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation )", + "( 1.3.6.1.4.1.4203.1.3.5 NAME 'supportedFeatures' DESC 'RFC4512: features supported by the server' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )", + "( 1.3.6.1.1.4 NAME 'vendorName' DESC 'RFC3045: name of implementation vendor' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", + "( 1.3.6.1.1.5 NAME 'vendorVersion' DESC 'RFC3045: version of implementation' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", + "( 2.5.21.4 NAME 'matchingRules' DESC 'RFC4512: matching rules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.30 USAGE directoryOperation )", + "( 2.5.21.5 NAME 'attributeTypes' DESC 'RFC4512: attribute types' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )", + "( 2.5.21.6 NAME 'objectClasses' DESC 'RFC4512: object classes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )", + "( 2.5.21.8 NAME 'matchingRuleUse' DESC 'RFC4512: matching rule uses' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.31 USAGE directoryOperation )", + "( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' DESC 'RFC4512: LDAP syntaxes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.54 USAGE directoryOperation )", + "( 2.5.4.1 NAME ( 'aliasedObjectName' 'aliasedEntryName' ) DESC 'RFC4512: name of aliased object' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.34 NAME 'ref' DESC 'RFC3296: subordinate referral URL' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE distributedOperation )", + "( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTtl' DESC 'RFC2589: entry time-to-live' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )", + "( 1.3.6.1.4.1.1466.101.119.4 NAME 'dynamicSubtrees' DESC 'RFC2589: dynamic subtrees' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE dSAOperation )", + "( 2.5.4.49 NAME 'distinguishedName' DESC 'RFC4519: common supertype of DN attributes' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.4.41 NAME 'name' DESC 'RFC4519: common supertype of name attributes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", + "( 2.5.4.3 NAME ( 'cn' 'commonName' ) DESC 'RFC4519: common name(s) for which the entity is known by' SUP name )", + "( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) DESC 'RFC4519: user identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'RFC2307: An integer uniquely identifying a user in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' DESC 'RFC2307: An integer uniquely identifying a group in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 2.5.4.35 NAME 'userPassword' DESC 'RFC4519/2307: password of user' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )", + "( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' DESC 'RFC2079: Uniform Resource Identifier with optional label' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.4.13 NAME 'description' DESC 'RFC4519: descriptive information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} )", + "( 2.5.4.34 NAME 'seeAlso' DESC 'RFC4519: DN of related object' SUP distinguishedName )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.78 NAME 'olcConfigFile' DESC 'File for slapd configuration directives' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.79 NAME 'olcConfigDir' DESC 'Directory for slapd configuration backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.1 NAME 'olcAccess' DESC 'Access Control List' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.86 NAME 'olcAddContentAcl' DESC 'Check ACLs against content of Add ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.2 NAME 'olcAllows' DESC 'Allowed set of deprecated features' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.3 NAME 'olcArgsFile' DESC 'File for slapd command line options' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.5 NAME 'olcAttributeOptions' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.4 NAME 'olcAttributeTypes' DESC 'OpenLDAP attributeTypes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.6 NAME 'olcAuthIDRewrite' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.7 NAME 'olcAuthzPolicy' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.8 NAME 'olcAuthzRegexp' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.9 NAME 'olcBackend' DESC 'A type of backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORDERED 'SIBLINGS' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.10 NAME 'olcConcurrency' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.11 NAME 'olcConnMaxPending' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.12 NAME 'olcConnMaxPendingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.13 NAME 'olcDatabase' DESC 'The backend type for a database instance' SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.14 NAME 'olcDefaultSearchBase' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.15 NAME 'olcDisallows' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.16 NAME 'olcDitContentRules' DESC 'OpenLDAP DIT content rules' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.20 NAME 'olcExtraAttrs' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.17 NAME 'olcGentleHUP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.17 NAME 'olcHidden' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.18 NAME 'olcIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.19 NAME 'olcInclude' SUP labeledURI )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.20 NAME 'olcIndexSubstrIfMinLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.21 NAME 'olcIndexSubstrIfMaxLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.22 NAME 'olcIndexSubstrAnyLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.23 NAME 'olcIndexSubstrAnyStep' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.84 NAME 'olcIndexIntLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.4 NAME 'olcLastMod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.85 NAME 'olcLdapSyntaxes' DESC 'OpenLDAP ldapSyntax' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.5 NAME 'olcLimits' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.93 NAME 'olcListenerThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.26 NAME 'olcLocalSSF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.27 NAME 'olcLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.28 NAME 'olcLogLevel' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.6 NAME 'olcMaxDerefDepth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.16 NAME 'olcMirrorMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.30 NAME 'olcModuleLoad' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.31 NAME 'olcModulePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.18 NAME 'olcMonitoring' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.32 NAME 'olcObjectClasses' DESC 'OpenLDAP object classes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.33 NAME 'olcObjectIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.34 NAME 'olcOverlay' SUP olcDatabase SINGLE-VALUE X-ORDERED 'SIBLINGS' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.35 NAME 'olcPasswordCryptSaltFormat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.36 NAME 'olcPasswordHash' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.37 NAME 'olcPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.38 NAME 'olcPlugin' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.39 NAME 'olcPluginLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.40 NAME 'olcReadOnly' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.41 NAME 'olcReferral' SUP labeledURI SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.7 NAME 'olcReplica' SUP labeledURI EQUALITY caseIgnoreMatch X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.43 NAME 'olcReplicaArgsFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.44 NAME 'olcReplicaPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.45 NAME 'olcReplicationInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.46 NAME 'olcReplogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.47 NAME 'olcRequires' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.48 NAME 'olcRestrict' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.49 NAME 'olcReverseLookup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.8 NAME 'olcRootDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.51 NAME 'olcRootDSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.9 NAME 'olcRootPW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.89 NAME 'olcSaslAuxprops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.53 NAME 'olcSaslHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.54 NAME 'olcSaslRealm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.56 NAME 'olcSaslSecProps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.58 NAME 'olcSchemaDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.59 NAME 'olcSecurity' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.81 NAME 'olcServerID' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.60 NAME 'olcSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.61 NAME 'olcSockbufMaxIncoming' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.62 NAME 'olcSockbufMaxIncomingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.83 NAME 'olcSortVals' DESC 'Attributes whose values will always be sorted' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.15 NAME 'olcSubordinate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.10 NAME 'olcSuffix' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.19 NAME 'olcSyncUseSubentry' DESC 'Store sync context in a subentry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.11 NAME 'olcSyncrepl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.90 NAME 'olcTCPBuffer' DESC 'Custom TCP buffer size' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.66 NAME 'olcThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.67 NAME 'olcTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.68 NAME 'olcTLSCACertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.69 NAME 'olcTLSCACertificatePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.70 NAME 'olcTLSCertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.71 NAME 'olcTLSCertificateKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.72 NAME 'olcTLSCipherSuite' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.73 NAME 'olcTLSCRLCheck' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.82 NAME 'olcTLSCRLFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.74 NAME 'olcTLSRandFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.75 NAME 'olcTLSVerifyClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.77 NAME 'olcTLSDHParamFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.87 NAME 'olcTLSProtocolMin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.80 NAME 'olcToolThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.12 NAME 'olcUpdateDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.13 NAME 'olcUpdateRef' SUP labeledURI EQUALITY caseIgnoreMatch )", + "( 1.3.6.1.4.1.4203.1.12.2.3.0.88 NAME 'olcWriteTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.1 NAME 'olcDbDirectory' DESC 'Directory for database content' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.11 NAME 'olcDbCacheFree' DESC 'Number of extra entries to free when max is reached' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.1 NAME 'olcDbCacheSize' DESC 'Entry cache size in entries' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.2 NAME 'olcDbCheckpoint' DESC 'Database checkpoint interval in kbytes and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.16 NAME 'olcDbChecksum' DESC 'Enable database checksum validation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.13 NAME 'olcDbCryptFile' DESC 'Pathname of file containing the DB encryption key' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.14 NAME 'olcDbCryptKey' DESC 'DB encryption key' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.3 NAME 'olcDbConfig' DESC 'BerkeleyDB DB_CONFIG configuration directives' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.4 NAME 'olcDbNoSync' DESC 'Disable synchronous database writes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.15 NAME 'olcDbPageSize' DESC 'Page size of specified DB, in Kbytes' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.5 NAME 'olcDbDirtyRead' DESC 'Allow reads of uncommitted data' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.12 NAME 'olcDbDNcacheSize' DESC 'DN cache size' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.6 NAME 'olcDbIDLcacheSize' DESC 'IDL cache size in IDLs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.2 NAME 'olcDbIndex' DESC 'Attribute index parameters' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.7 NAME 'olcDbLinearIndex' DESC 'Index attributes one at a time' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.8 NAME 'olcDbLockDetect' DESC 'Deadlock detection algorithm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.3 NAME 'olcDbMode' DESC 'Unix permissions of database files' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.9 NAME 'olcDbSearchStack' DESC 'Depth of search stack in IDLs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.1.10 NAME 'olcDbShmKey' DESC 'Key for shared memory region' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.0.14 NAME 'olcDbURI' DESC 'URI (list) for remote DSA' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.1 NAME 'olcDbStartTLS' DESC 'StartTLS' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.2 NAME 'olcDbACLAuthcDn' DESC 'Remote ACL administrative identity' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.3 NAME 'olcDbACLPasswd' DESC 'Remote ACL administrative identity credentials' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.4 NAME 'olcDbACLBind' DESC 'Remote ACL administrative identity auth bind configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.5 NAME 'olcDbIDAssertAuthcDn' DESC 'Remote Identity Assertion administrative identity' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.6 NAME 'olcDbIDAssertPasswd' DESC 'Remote Identity Assertion administrative identity credentials' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.7 NAME 'olcDbIDAssertBind' DESC 'Remote Identity Assertion administrative identity auth bind configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.8 NAME 'olcDbIDAssertMode' DESC 'Remote Identity Assertion mode' OBSOLETE SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.9 NAME 'olcDbIDAssertAuthzFrom' DESC 'Remote Identity Assertion authz rules' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.10 NAME 'olcDbRebindAsUser' DESC 'Rebind as user' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.11 NAME 'olcDbChaseReferrals' DESC 'Chase referrals' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.12 NAME 'olcDbTFSupport' DESC 'Absolute filters support' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.13 NAME 'olcDbProxyWhoAmI' DESC 'Proxy whoAmI exop' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.14 NAME 'olcDbTimeout' DESC 'Per-operation timeouts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.15 NAME 'olcDbIdleTimeout' DESC 'connection idle timeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.16 NAME 'olcDbConnTtl' DESC 'connection ttl' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.17 NAME 'olcDbNetworkTimeout' DESC 'connection network timeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.18 NAME 'olcDbProtocolVersion' DESC 'protocol version' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.19 NAME 'olcDbSingleConn' DESC 'cache a single connection per identity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.20 NAME 'olcDbCancel' DESC 'abandon/ignore/exop operations when appropriate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.21 NAME 'olcDbQuarantine' DESC 'Quarantine database if connection fails and retry according to rule' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.22 NAME 'olcDbUseTemporaryConn' DESC 'Use temporary connections if the cached one is busy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.23 NAME 'olcDbConnectionPoolMax' DESC 'Max size of privileged connections pool' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.25 NAME 'olcDbNoRefs' DESC 'Do not return search reference responses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.26 NAME 'olcDbNoUndefFilter' DESC 'Do not propagate undefined search filters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.3.27 NAME 'olcDbIDAssertPassThru' DESC 'Remote Identity Assertion passthru rules' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.1 NAME 'olcChainingBehavior' DESC 'Chaining behavior control parameters (draft-sermersheim-ldap-chaining)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.2 NAME 'olcChainCacheURI' DESC 'Enables caching of URIs not present in configuration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.3 NAME 'olcChainMaxReferralDepth' DESC 'max referral depth' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.3.4 NAME 'olcChainReturnError' DESC 'Errors are returned instead of the original referral' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.2.5.1 NAME 'olcRelay' DESC 'Relay DN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.1 NAME 'olcAccessLogDB' DESC 'Suffix of database for log content' SUP distinguishedName SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.2 NAME 'olcAccessLogOps' DESC 'Operation types to log' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.3 NAME 'olcAccessLogPurge' DESC 'Log cleanup parameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.4 NAME 'olcAccessLogSuccess' DESC 'Log successful ops only' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.5 NAME 'olcAccessLogOld' DESC 'Log old values when modifying entries matching the filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.6 NAME 'olcAccessLogOldAttr' DESC 'Log old values of these attributes even if unmodified' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.4.7 NAME 'olcAccessLogBase' DESC 'Operation types to log under a specific branch' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.15.1 NAME 'olcAuditlogFile' DESC 'Filename for auditlogging' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.19.1 NAME 'olcCollectInfo' DESC 'DN of entry and attribute to distribute' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.13.1 NAME 'olcConstraintAttribute' DESC 'constraint for list of attributes' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.1 NAME 'olcDDSstate' DESC 'RFC2589 Dynamic directory services state' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.2 NAME 'olcDDSmaxTtl' DESC 'RFC2589 Dynamic directory services max TTL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.3 NAME 'olcDDSminTtl' DESC 'RFC2589 Dynamic directory services min TTL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.4 NAME 'olcDDSdefaultTtl' DESC 'RFC2589 Dynamic directory services default TTL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.5 NAME 'olcDDSinterval' DESC 'RFC2589 Dynamic directory services expiration task run interval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.6 NAME 'olcDDStolerance' DESC 'RFC2589 Dynamic directory services additional TTL in expiration scheduling' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.9.7 NAME 'olcDDSmaxDynamicObjects' DESC 'RFC2589 Dynamic directory services max number of dynamic objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.17.1 NAME 'olcDGAttrPair' DESC 'Member and MemberURL attribute pair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.8.1 NAME 'olcDlAttrSet' DESC 'Dynamic list: , , ' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.2.840.113556.1.2.102 NAME 'memberOf' DESC 'Group that the entry belongs to' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation X-ORIGIN 'iPlanet Delegated Administrator' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.0 NAME 'olcMemberOfDN' DESC 'DN to be used as modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.1 NAME 'olcMemberOfDangling' DESC 'Behavior with respect to dangling members, constrained to ignore, drop, error' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.2 NAME 'olcMemberOfRefInt' DESC 'Take care of referential integrity' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.3 NAME 'olcMemberOfGroupOC' DESC 'Group objectClass' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.4 NAME 'olcMemberOfMemberAD' DESC 'member attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.5 NAME 'olcMemberOfMemberOfAD' DESC 'memberOf attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.18.7 NAME 'olcMemberOfDanglingError' DESC 'Error code returned in case of dangling back reference' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.42.2.27.8.1.16 NAME 'pwdChangedTime' DESC 'The time the password was last changed' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.17 NAME 'pwdAccountLockedTime' DESC 'The time an user account was locked' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.19 NAME 'pwdFailureTime' DESC 'The timestamps of the last consecutive authentication failures' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.20 NAME 'pwdHistory' DESC 'The history of users passwords' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.21 NAME 'pwdGraceUseTime' DESC 'The timestamps of the grace login once the password has expired' EQUALITY generalizedTimeMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 NO-USER-MODIFICATION USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.22 NAME 'pwdReset' DESC 'The indication that the password has been reset' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE USAGE directoryOperation )", + "( 1.3.6.1.4.1.42.2.27.8.1.23 NAME 'pwdPolicySubentry' DESC 'The pwdPolicy subentry in effect for this object' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE USAGE directoryOperation )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.1 NAME 'olcPPolicyDefault' DESC 'DN of a pwdPolicy object for uncustomized objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.2 NAME 'olcPPolicyHashCleartext' DESC 'Hash passwords on add or modify' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.4 NAME 'olcPPolicyForwardUpdates' DESC 'Allow policy state updates to be forwarded via updateref' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.12.3 NAME 'olcPPolicyUseLockout' DESC 'Warn clients with AccountLocked' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.1 NAME ( 'olcPcache' 'olcProxyCache' ) DESC 'Proxy Cache basic parameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.2 NAME ( 'olcPcacheAttrset' 'olcProxyAttrset' ) DESC 'A set of attributes to cache' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.3 NAME ( 'olcPcacheTemplate' 'olcProxyCacheTemplate' ) DESC 'Filter template, attrset, cache TTL, optional negative TTL, optional sizelimit TTL, optional TTR' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.4 NAME 'olcPcachePosition' DESC 'Response callback position in overlay stack' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.5 NAME ( 'olcPcacheMaxQueries' 'olcProxyCacheQueries' ) DESC 'Maximum number of queries to cache' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.6 NAME ( 'olcPcachePersist' 'olcProxySaveQueries' ) DESC 'Save cached queries for hot restart' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.7 NAME ( 'olcPcacheValidate' 'olcProxyCheckCacheability' ) DESC 'Check whether the results of a query are cacheable, e.g. for schema issues' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.8 NAME 'olcPcacheOffline' DESC 'Set cache to offline mode and disable expiration' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.2.9 NAME 'olcPcacheBind' DESC 'Parameters for caching Binds' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.11.1 NAME 'olcRefintAttribute' DESC 'Attributes for referential integrity' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.11.2 NAME 'olcRefintNothing' DESC 'Replacement DN to supply when needed' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.11.3 NAME 'olcRefintModifiersName' DESC 'The DN to use as modifiersName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.1 NAME 'olcRetcodeParent' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.2 NAME 'olcRetcodeItem' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.3 NAME 'olcRetcodeInDir' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.20.4 NAME 'olcRetcodeSleep' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.1 NAME 'olcRwmRewrite' DESC 'Rewrites strings' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.2 NAME 'olcRwmTFSupport' DESC 'Absolute filters support' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.3 NAME 'olcRwmMap' DESC 'maps attributes/objectClasses' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.4 NAME 'olcRwmNormalizeMapped' DESC 'Normalize mapped attributes/objectClasses' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.16.5 NAME 'olcRwmDropUnrequested' DESC 'Drop unrequested attributes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.21.1 NAME 'olcSssVlvMax' DESC 'Maximum number of concurrent Sort requests' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.21.2 NAME 'olcSssVlvMaxKeys' DESC 'Maximum number of Keys in a Sort request' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.21.3 NAME 'olcSssVlvMaxPerConn' DESC 'Maximum number of concurrent paged search requests per connection' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.1 NAME 'olcSpCheckpoint' DESC 'ContextCSN checkpoint interval in ops and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.2 NAME 'olcSpSessionlog' DESC 'Session log size in ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.3 NAME 'olcSpNoPresent' DESC 'Omit Present phase processing' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.1.4 NAME 'olcSpReloadHint' DESC 'Observe Reload Hint in Request control' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.1 NAME 'olcTranslucentStrict' DESC 'Reveal attribute deletion constraint violations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.2 NAME 'olcTranslucentNoGlue' DESC 'Disable automatic glue records for ADD and MODRDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.3 NAME 'olcTranslucentLocal' DESC 'Attributes to use in local search filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.4 NAME 'olcTranslucentRemote' DESC 'Attributes to use in remote search filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.5 NAME 'olcTranslucentBindLocal' DESC 'Enable local bind' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.14.6 NAME 'olcTranslucentPwModLocal' DESC 'Enable local RFC 3062 Password Modify extended operation' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.1 NAME 'olcUniqueBase' DESC 'Subtree for uniqueness searches' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.2 NAME 'olcUniqueIgnore' DESC 'Attributes for which uniqueness shall not be enforced' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.3 NAME 'olcUniqueAttribute' DESC 'Attributes for which uniqueness shall be enforced' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.4 NAME 'olcUniqueStrict' DESC 'Enforce uniqueness of null values' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.10.5 NAME 'olcUniqueURI' DESC 'List of keywords and LDAP URIs for a uniqueness domain' EQUALITY caseExactMatch ORDERING caseExactOrderingMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.4203.1.12.2.3.3.5.1 NAME 'olcValSortAttr' DESC 'Sorting rule for attribute under given DN' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: knowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", + "( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name )", + "( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial number of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} )", + "( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC4519: two-letter ISO-3166 country code' SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE )", + "( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: locality which this object resides in' SUP name )", + "( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RFC2256: state or province which this object resides in' SUP name )", + "( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC2256: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )", + "( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256: organization this object belongs to' SUP name )", + "( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC 'RFC2256: organizational unit this object belongs to' SUP name )", + "( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associated with the entity' SUP name )", + "( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search guide, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 )", + "( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: business category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )", + "( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal code' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )", + "( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post Office Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )", + "( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RFC2256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )", + "( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Telephone Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} )", + "( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 )", + "( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC2256: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 )", + "( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) DESC 'RFC2256: Facsimile (Fax) Telephone Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 )", + "( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} )", + "( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC2256: international ISDN number' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} )", + "( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: registered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256: destination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} )", + "( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC2256: preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE )", + "( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: presentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 SINGLE-VALUE )", + "( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'RFC2256: supported application context' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a group' SUP distinguishedName )", + "( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the object)' SUP distinguishedName )", + "( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupant of role' SUP distinguishedName )", + "( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.509 user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )", + "( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 CA certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )", + "( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC2256: X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )", + "( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC2256: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )", + "( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256: X.509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.10 )", + "( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: first name(s) for which the entity is known by' SUP name )", + "( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of some or all of names, but not the surname(s).' SUP name )", + "( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: name qualifier indicating a generation' SUP name )", + "( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256: X.500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", + "( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN qualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 )", + "( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: enhanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 )", + "( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: protocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )", + "( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique member of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", + "( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: house identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )", + "( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: supported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 )", + "( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: delta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )", + "( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD' SUP name )", + "( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudonym for the object' SUP name )", + "( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbox' ) DESC 'RFC1274: RFC822 Mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )", + "( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' DESC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 'pkcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )", + "( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274: general information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} )", + "( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RFC1274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274: photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} )", + "( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC1274: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274: host computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC1274: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' DESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC 'RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' DESC 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DESC 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' DESC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'RFC1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.39 )", + "( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DESC 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' DESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DESC 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCountryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' DESC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC 'RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )", + "( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOption' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC 'RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )", + "( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC 'RFC1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality' DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQuality' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQuality' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )", + "( 0.9.2342.19200300.100.1.53 NAME 'personalSignature' DESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 )", + "( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 'RFC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC1274: audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} )", + "( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' DESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC2798: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'RFC2798: identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RFC2798: numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 )", + "( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'RFC2798: preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )", + "( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )", + "( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'The GECOS field; the common name' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absolute path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'The path to the login shell' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.6 NAME 'shadowMin' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.7 NAME 'shadowMax' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.12 NAME 'memberUid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Netgroup triple' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' DESC 'Service port number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' DESC 'Service protocol name' SUP name )", + "( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' DESC 'IP protocol number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' DESC 'ONC RPC number' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'IPv4 addresses as a dotted decimal omitting leading zeros or IPv6 addresses as defined in RFC2373' SUP name )", + "( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'IP network as a dotted decimal, eg. 192.168, omitting leading zeros' SUP name SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'IP netmask as a dotted decimal, eg. 255.255.255.0, omitting leading zeros' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'MAC address in maximal, colon separated hex notation, eg. 00:00:92:90:ee:e2' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'rpc.bootparamd parameter' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Boot image name' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.26 NAME 'nisMapName' DESC 'Name of a A generic NIS map' SUP name )", + "( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' DESC 'A generic NIS entry' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.28 NAME 'nisPublicKey' DESC 'NIS public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.29 NAME 'nisSecretKey' DESC 'NIS secret key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.30 NAME 'nisDomain' DESC 'NIS domain' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.1.1.1.31 NAME 'automountMapName' DESC 'automount Map Name' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.32 NAME 'automountKey' DESC 'Automount Key value' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.1.1.1.33 NAME 'automountInformation' DESC 'Automount information' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.2 NAME 'suseDefaultBase' DESC 'Base DN where new Objects should be created by default' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.3 NAME 'suseNextUniqueId' DESC 'Next unused unique ID, can be used to generate directory wide uniqe IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.4 NAME 'suseMinUniqueId' DESC 'lower Border for Unique IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.5 NAME 'suseMaxUniqueId' DESC 'upper Border for Unique IDs' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.6 NAME 'suseDefaultTemplate' DESC 'The DN of a template that should be used by default' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.7 NAME 'suseSearchFilter' DESC 'Search filter to localize Objects' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.11 NAME 'suseDefaultValue' DESC 'an Attribute-Value-Assertions to define defaults for specific Attributes' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.12 NAME 'suseNamingAttribute' DESC 'AttributeType that should be used as the RDN' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.15 NAME 'suseSecondaryGroup' DESC 'seconday group DN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.16 NAME 'suseMinPasswordLength' DESC 'minimum Password length for new users' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.17 NAME 'suseMaxPasswordLength' DESC 'maximum Password length for new users' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.18 NAME 'susePasswordHash' DESC 'Hash method to use for new users' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.19 NAME 'suseSkelDir' DESC '' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.20 NAME 'susePlugin' DESC 'plugin to use upon user/ group creation' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.21 NAME 'suseMapAttribute' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.3.6.1.4.1.7057.10.1.2.2.22 NAME 'suseImapServer' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.23 NAME 'suseImapAdmin' DESC '' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.24 NAME 'suseImapDefaultQuota' DESC '' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )", + "( 1.3.6.1.4.1.7057.10.1.2.2.25 NAME 'suseImapUseSsl' DESC '' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )" + ], + "cn": [ + "Subschema" + ], + "createTimestamp": [ + "20141024204149Z" + ], + "entryDN": [ + "cn=Subschema" + ], + "ldapSyntaxes": [ + "( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )", + "( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )", + "( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.4203.666.11.10.2.1 DESC 'X.509 AttributeCertificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )", + "( 1.2.36.79672281.1.5.0 DESC 'RDN' )", + "( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )", + "( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )", + "( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )", + "( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )", + "( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )", + "( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )", + "( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )", + "( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )", + "( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )", + "( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )", + "( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )", + "( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )", + "( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )", + "( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )", + "( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' )", + "( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )", + "( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )", + "( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )", + "( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' )", + "( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' )", + "( 1.3.6.1.1.16.1 DESC 'UUID' )" + ], + "matchingRuleUse": [ + "( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' APPLIES ( altServer $ olcDbConfig $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox $ gecos $ homeDirectory $ loginShell $ memberUid $ memberNisNetgroup $ nisNetgroupTriple $ ipNetmaskNumber $ macAddress $ bootParameter $ bootFile $ nisMapEntry $ nisDomain $ automountMapName $ automountKey $ automountInformation $ suseNamingAttribute $ susePasswordHash $ suseSkelDir ) )", + "( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' APPLIES ( altServer $ olcDbConfig $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox $ gecos $ homeDirectory $ loginShell $ memberUid $ memberNisNetgroup $ nisNetgroupTriple $ ipNetmaskNumber $ macAddress $ bootParameter $ bootFile $ nisMapEntry $ nisDomain $ automountMapName $ automountKey $ automountInformation $ suseNamingAttribute $ susePasswordHash $ suseSkelDir ) )", + "( 2.5.13.38 NAME 'certificateListExactMatch' APPLIES ( authorityRevocationList $ certificateRevocationList $ deltaRevocationList ) )", + "( 2.5.13.34 NAME 'certificateExactMatch' APPLIES ( userCertificate $ cACertificate ) )", + "( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ ldapSyntaxes $ supportedApplicationContext ) )", + "( 2.5.13.29 NAME 'integerFirstComponentMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' APPLIES ( createTimestamp $ modifyTimestamp $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ pwdGraceUseTime ) )", + "( 2.5.13.27 NAME 'generalizedTimeMatch' APPLIES ( createTimestamp $ modifyTimestamp $ pwdChangedTime $ pwdAccountLockedTime $ pwdFailureTime $ pwdGraceUseTime ) )", + "( 2.5.13.24 NAME 'protocolInformationMatch' APPLIES protocolInformation )", + "( 2.5.13.23 NAME 'uniqueMemberMatch' APPLIES uniqueMember )", + "( 2.5.13.22 NAME 'presentationAddressMatch' APPLIES presentationAddress )", + "( 2.5.13.20 NAME 'telephoneNumberMatch' APPLIES ( telephoneNumber $ homePhone $ mobile $ pager ) )", + "( 2.5.13.18 NAME 'octetStringOrderingMatch' APPLIES ( userPassword $ olcDbCryptKey $ pwdHistory $ nisPublicKey $ nisSecretKey ) )", + "( 2.5.13.17 NAME 'octetStringMatch' APPLIES ( userPassword $ olcDbCryptKey $ pwdHistory $ nisPublicKey $ nisSecretKey ) )", + "( 2.5.13.16 NAME 'bitStringMatch' APPLIES x500UniqueIdentifier )", + "( 2.5.13.15 NAME 'integerOrderingMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 2.5.13.14 NAME 'integerMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbCacheFree $ olcDbCacheSize $ olcDbDNcacheSize $ olcDbIDLcacheSize $ olcDbSearchStack $ olcDbShmKey $ olcDbProtocolVersion $ olcDbConnectionPoolMax $ olcChainMaxReferralDepth $ olcDDSmaxDynamicObjects $ olcPcacheMaxQueries $ olcRetcodeSleep $ olcSssVlvMax $ olcSssVlvMaxKeys $ olcSssVlvMaxPerConn $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseMinPasswordLength $ suseMaxPasswordLength $ suseImapDefaultQuota ) )", + "( 2.5.13.13 NAME 'booleanMatch' APPLIES ( hasSubordinates $ olcAddContentAcl $ olcGentleHUP $ olcHidden $ olcLastMod $ olcMirrorMode $ olcMonitoring $ olcReadOnly $ olcReverseLookup $ olcSyncUseSubentry $ olcDbChecksum $ olcDbNoSync $ olcDbDirtyRead $ olcDbLinearIndex $ olcDbRebindAsUser $ olcDbChaseReferrals $ olcDbProxyWhoAmI $ olcDbSingleConn $ olcDbUseTemporaryConn $ olcDbNoRefs $ olcDbNoUndefFilter $ olcChainCacheURI $ olcChainReturnError $ olcAccessLogSuccess $ olcDDSstate $ olcMemberOfRefInt $ pwdReset $ olcPPolicyHashCleartext $ olcPPolicyForwardUpdates $ olcPPolicyUseLockout $ olcPcachePersist $ olcPcacheValidate $ olcPcacheOffline $ olcRetcodeInDir $ olcRwmNormalizeMapped $ olcRwmDropUnrequested $ olcSpNoPresent $ olcSpReloadHint $ olcTranslucentStrict $ olcTranslucentNoGlue $ olcTranslucentBindLocal $ olcTranslucentPwModLocal $ olcUniqueStrict $ suseImapUseSsl ) )", + "( 2.5.13.11 NAME 'caseIgnoreListMatch' APPLIES ( postalAddress $ registeredAddress $ homePostalAddress ) )", + "( 2.5.13.9 NAME 'numericStringOrderingMatch' APPLIES ( x121Address $ internationaliSDNNumber ) )", + "( 2.5.13.8 NAME 'numericStringMatch' APPLIES ( x121Address $ internationaliSDNNumber ) )", + "( 2.5.13.7 NAME 'caseExactSubstringsMatch' APPLIES ( serialNumber $ destinationIndicator $ dnQualifier ) )", + "( 2.5.13.6 NAME 'caseExactOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.5 NAME 'caseExactMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' APPLIES ( serialNumber $ destinationIndicator $ dnQualifier ) )", + "( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.2 NAME 'caseIgnoreMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbCryptFile $ olcDbPageSize $ olcDbIndex $ olcDbLockDetect $ olcDbMode $ olcDbURI $ olcDbStartTLS $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbTFSupport $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbCancel $ olcDbQuarantine $ olcDbIDAssertPassThru $ olcChainingBehavior $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcAuditlogFile $ olcCollectInfo $ olcConstraintAttribute $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDGAttrPair $ olcDlAttrSet $ olcMemberOfDangling $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD $ olcMemberOfDanglingError $ olcPcache $ olcPcacheAttrset $ olcPcacheTemplate $ olcPcachePosition $ olcPcacheBind $ olcRefintAttribute $ olcRetcodeItem $ olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcSpCheckpoint $ olcTranslucentLocal $ olcTranslucentRemote $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueURI $ olcValSortAttr $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ ipServiceProtocol $ ipHostNumber $ ipNetworkNumber $ nisMapName $ suseSearchFilter $ suseDefaultValue $ susePlugin $ suseMapAttribute $ suseImapServer $ suseImapAdmin ) )", + "( 2.5.13.1 NAME 'distinguishedNameMatch' APPLIES ( creatorsName $ modifiersName $ subschemaSubentry $ entryDN $ namingContexts $ aliasedObjectName $ dynamicSubtrees $ distinguishedName $ seeAlso $ olcDefaultSearchBase $ olcRootDN $ olcSchemaDN $ olcSuffix $ olcUpdateDN $ olcDbACLAuthcDn $ olcDbIDAssertAuthcDn $ olcRelay $ olcAccessLogDB $ memberOf $ olcMemberOfDN $ pwdPolicySubentry $ olcPPolicyDefault $ olcRefintNothing $ olcRefintModifiersName $ olcRetcodeParent $ olcUniqueBase $ member $ owner $ roleOccupant $ manager $ documentAuthor $ secretary $ associatedName $ dITRedirect $ suseDefaultBase $ suseDefaultTemplate $ suseSecondaryGroup ) )", + "( 2.5.13.0 NAME 'objectIdentifierMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ supportedApplicationContext ) )" + ], + "matchingRules": [ + "( 1.3.6.1.1.16.3 NAME 'UUIDOrderingMatch' SYNTAX 1.3.6.1.1.16.1 )", + "( 1.3.6.1.1.16.2 NAME 'UUIDMatch' SYNTAX 1.3.6.1.1.16.1 )", + "( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", + "( 2.5.13.38 NAME 'certificateListExactMatch' SYNTAX 1.3.6.1.1.15.5 )", + "( 2.5.13.34 NAME 'certificateExactMatch' SYNTAX 1.3.6.1.1.15.1 )", + "( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", + "( 2.5.13.29 NAME 'integerFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.27 NAME 'generalizedTimeMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", + "( 2.5.13.23 NAME 'uniqueMemberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", + "( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.20 NAME 'telephoneNumberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", + "( 2.5.13.19 NAME 'octetStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.18 NAME 'octetStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.17 NAME 'octetStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + "( 2.5.13.16 NAME 'bitStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", + "( 2.5.13.15 NAME 'integerOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.14 NAME 'integerMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", + "( 2.5.13.13 NAME 'booleanMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", + "( 2.5.13.11 NAME 'caseIgnoreListMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", + "( 2.5.13.10 NAME 'numericStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.9 NAME 'numericStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.8 NAME 'numericStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", + "( 2.5.13.7 NAME 'caseExactSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.6 NAME 'caseExactOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.5 NAME 'caseExactMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", + "( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 2.5.13.2 NAME 'caseIgnoreMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", + "( 1.2.36.79672281.1.13.3 NAME 'rdnMatch' SYNTAX 1.2.36.79672281.1.5.0 )", + "( 2.5.13.1 NAME 'distinguishedNameMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", + "( 2.5.13.0 NAME 'objectIdentifierMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )" + ], + "modifyTimestamp": [ + "20141024204149Z" + ], + "objectClass": [ + "top", + "subentry", + "subschema", + "extensibleObject" + ], + "objectClasses": [ + "( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRACT MUST objectClass )", + "( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' DESC 'RFC4512: extensible object' SUP top AUXILIARY )", + "( 2.5.6.1 NAME 'alias' DESC 'RFC4512: an alias' SUP top STRUCTURAL MUST aliasedObjectName )", + "( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'namedref: named subordinate referral' SUP top STRUCTURAL MUST ref )", + "( 1.3.6.1.4.1.4203.1.4.1 NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) DESC 'OpenLDAP Root DSE object' SUP top STRUCTURAL MAY cn )", + "( 2.5.17.0 NAME 'subentry' DESC 'RFC3672: subentry' SUP top STRUCTURAL MUST ( cn $ subtreeSpecification ) )", + "( 2.5.20.1 NAME 'subschema' DESC 'RFC4512: controlling subschema (sub)entry' AUXILIARY MAY ( dITStructureRules $ nameForms $ dITContentRules $ objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) )", + "( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject' DESC 'RFC2589: Dynamic Object' SUP top AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.0 NAME 'olcConfig' DESC 'OpenLDAP configuration object' SUP top ABSTRACT )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.1 NAME 'olcGlobal' DESC 'OpenLDAP Global configuration options' SUP olcConfig STRUCTURAL MAY ( cn $ olcConfigFile $ olcConfigDir $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcDisallows $ olcGentleHUP $ olcIdleTimeout $ olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcLocalSSF $ olcLogFile $ olcLogLevel $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPluginLogFile $ olcReadOnly $ olcReferral $ olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ olcRootDSE $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcTCPBuffer $ olcThreads $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSCRLFile $ olcToolThreads $ olcWriteTimeout $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.2 NAME 'olcSchemaConfig' DESC 'OpenLDAP schema object' SUP olcConfig STRUCTURAL MAY ( cn $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.3 NAME 'olcBackendConfig' DESC 'OpenLDAP Backend-specific options' SUP olcConfig STRUCTURAL MUST olcBackend )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.4 NAME 'olcDatabaseConfig' DESC 'OpenLDAP Database-specific options' SUP olcConfig STRUCTURAL MUST olcDatabase MAY ( olcHidden $ olcSuffix $ olcSubordinate $ olcAccess $ olcAddContentAcl $ olcLastMod $ olcLimits $ olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncUseSubentry $ olcSyncrepl $ olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ olcMonitoring $ olcExtraAttrs ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.5 NAME 'olcOverlayConfig' DESC 'OpenLDAP Overlay-specific options' SUP olcConfig STRUCTURAL MUST olcOverlay )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.6 NAME 'olcIncludeFile' DESC 'OpenLDAP configuration include file' SUP olcConfig STRUCTURAL MUST olcInclude MAY ( cn $ olcRootDSE ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.7 NAME 'olcFrontendConfig' DESC 'OpenLDAP frontend configuration' AUXILIARY MAY ( olcDefaultSearchBase $ olcPasswordHash $ olcSortVals ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.0.8 NAME 'olcModuleList' DESC 'OpenLDAP dynamic module info' SUP olcConfig STRUCTURAL MAY ( cn $ olcModulePath $ olcModuleLoad ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.2.1 NAME 'olcLdifConfig' DESC 'LDIF backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.4.1 NAME 'olcMonitorConfig' DESC 'Monitor backend configuration' SUP olcDatabaseConfig STRUCTURAL )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.1.1 NAME 'olcBdbConfig' DESC 'BDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCacheSize $ olcDbCheckpoint $ olcDbConfig $ olcDbCryptFile $ olcDbCryptKey $ olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ olcDbMode $ olcDbSearchStack $ olcDbShmKey $ olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.1.2 NAME 'olcHdbConfig' DESC 'HDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCacheSize $ olcDbCheckpoint $ olcDbConfig $ olcDbCryptFile $ olcDbCryptKey $ olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ olcDbMode $ olcDbSearchStack $ olcDbShmKey $ olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.3.1 NAME 'olcLDAPConfig' DESC 'LDAP backend configuration' SUP olcDatabaseConfig STRUCTURAL MAY ( olcDbURI $ olcDbStartTLS $ olcDbACLAuthcDn $ olcDbACLPasswd $ olcDbACLBind $ olcDbIDAssertAuthcDn $ olcDbIDAssertPasswd $ olcDbIDAssertBind $ olcDbIDAssertMode $ olcDbIDAssertAuthzFrom $ olcDbIDAssertPassThru $ olcDbRebindAsUser $ olcDbChaseReferrals $ olcDbTFSupport $ olcDbProxyWhoAmI $ olcDbTimeout $ olcDbIdleTimeout $ olcDbConnTtl $ olcDbNetworkTimeout $ olcDbProtocolVersion $ olcDbSingleConn $ olcDbCancel $ olcDbQuarantine $ olcDbUseTemporaryConn $ olcDbConnectionPoolMax $ olcDbNoRefs $ olcDbNoUndefFilter ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.3.1 NAME 'olcChainConfig' DESC 'Chain configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcChainingBehavior $ olcChainCacheURI $ olcChainMaxReferralDepth $ olcChainReturnError ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.3.2 NAME 'olcChainDatabase' DESC 'Chain remote server configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.3.3 NAME 'olcPBindConfig' DESC 'Proxy Bind configuration' SUP olcOverlayConfig STRUCTURAL MUST olcDbURI MAY ( olcDbStartTLS $ olcDbNetworkTimeout $ olcDbQuarantine ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.7.1 NAME 'olcDistProcConfig' DESC 'Distributed procedures configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcChainingBehavior $ olcChainCacheURI ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.7.2 NAME 'olcDistProcDatabase' DESC 'Distributed procedure remote server configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.2.5.1 NAME 'olcRelayConfig' DESC 'Relay backend configuration' SUP olcDatabaseConfig STRUCTURAL MAY olcRelay )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.4.1 NAME 'olcAccessLogConfig' DESC 'Access log configuration' SUP olcOverlayConfig STRUCTURAL MUST olcAccessLogDB MAY ( olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogSuccess $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.15.1 NAME 'olcAuditlogConfig' DESC 'Auditlog configuration' SUP olcOverlayConfig STRUCTURAL MAY olcAuditlogFile )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.19.1 NAME 'olcCollectConfig' DESC 'Collective Attribute configuration' SUP olcOverlayConfig STRUCTURAL MAY olcCollectInfo )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.13.1 NAME 'olcConstraintConfig' DESC 'Constraint overlay configuration' SUP olcOverlayConfig STRUCTURAL MAY olcConstraintAttribute )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.9.1 NAME 'olcDDSConfig' DESC 'RFC2589 Dynamic directory services configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcDDSstate $ olcDDSmaxTtl $ olcDDSminTtl $ olcDDSdefaultTtl $ olcDDSinterval $ olcDDStolerance $ olcDDSmaxDynamicObjects ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.17.1 NAME 'olcDGConfig' DESC 'Dynamic Group configuration' SUP olcOverlayConfig STRUCTURAL MAY olcDGAttrPair )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.8.1 NAME 'olcDynamicList' DESC 'Dynamic list configuration' SUP olcOverlayConfig STRUCTURAL MAY olcDLattrSet )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.18.1 NAME 'olcMemberOf' DESC 'Member-of configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcMemberOfDN $ olcMemberOfDangling $ olcMemberOfDanglingError $ olcMemberOfRefInt $ olcMemberOfGroupOC $ olcMemberOfMemberAD $ olcMemberOfMemberOfAD ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.12.1 NAME 'olcPPolicyConfig' DESC 'Password Policy configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcPPolicyDefault $ olcPPolicyHashCleartext $ olcPPolicyUseLockout $ olcPPolicyForwardUpdates ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.2.1 NAME 'olcPcacheConfig' DESC 'ProxyCache configuration' SUP olcOverlayConfig STRUCTURAL MUST ( olcPcache $ olcPcacheAttrset $ olcPcacheTemplate ) MAY ( olcPcachePosition $ olcPcacheMaxQueries $ olcPcachePersist $ olcPcacheValidate $ olcPcacheOffline $ olcPcacheBind ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.2.2 NAME 'olcPcacheDatabase' DESC 'Cache database configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.11.1 NAME 'olcRefintConfig' DESC 'Referential integrity configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcRefintAttribute $ olcRefintNothing $ olcRefintModifiersName ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.20.1 NAME 'olcRetcodeConfig' DESC 'Retcode configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcRetcodeParent $ olcRetcodeItem $ olcRetcodeInDir $ olcRetcodeSleep ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.16.1 NAME 'olcRwmConfig' DESC 'Rewrite/remap configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcRwmRewrite $ olcRwmTFSupport $ olcRwmMap $ olcRwmNormalizeMapped ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.21.1 NAME 'olcSssVlvConfig' DESC 'SSS VLV configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcSssVlvMax $ olcSssVlvMaxKeys ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.1.1 NAME 'olcSyncProvConfig' DESC 'SyncRepl Provider configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcSpCheckpoint $ olcSpSessionlog $ olcSpNoPresent $ olcSpReloadHint ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.14.1 NAME 'olcTranslucentConfig' DESC 'Translucent configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcTranslucentStrict $ olcTranslucentNoGlue $ olcTranslucentLocal $ olcTranslucentRemote $ olcTranslucentBindLocal $ olcTranslucentPwModLocal ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.14.2 NAME 'olcTranslucentDatabase' DESC 'Translucent target database configuration' AUXILIARY )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.10.1 NAME 'olcUniqueConfig' DESC 'Attribute value uniqueness configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcUniqueBase $ olcUniqueIgnore $ olcUniqueAttribute $ olcUniqueStrict $ olcUniqueURI ) )", + "( 1.3.6.1.4.1.4203.1.12.2.4.3.5.1 NAME 'olcValSortConfig' DESC 'Value Sorting configuration' SUP olcOverlayConfig STRUCTURAL MUST olcValSortAttr )", + "( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) )", + "( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) )", + "( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )", + "( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )", + "( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )", + "( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )", + "( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an organizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) )", + "( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )", + "( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an residential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) )", + "( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an application process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) )", + "( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an application entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) )", + "( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory system agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformation )", + "( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) )", + "( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC2256: a strong authentication user' SUP top AUXILIARY MUST userCertificate )", + "( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256: a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair )", + "( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a group of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST ( uniqueMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )", + "( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC2256: a user security information' SUP top AUXILIARY MAY supportedAlgorithms )", + "( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP certificationAuthority AUXILIARY MAY deltaRevocationList )", + "( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST cn MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) )", + "( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST dmdName MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )", + "( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' SUP top AUXILIARY MAY userCertificate )", + "( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate authority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRevocationList $ cACertificate $ crossCertificatePair ) )", + "( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SUP top AUXILIARY MAY deltaRevocationList )", + "( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'RFC2079: object that contains the URI attribute type' SUP top AUXILIARY MAY labeledURI )", + "( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword )", + "( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: domain component object' SUP top AUXILIARY MUST dc )", + "( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid object' SUP top AUXILIARY MUST uid )", + "( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPilotPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rfc822Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber $ homePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod $ businessCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ pagerTelephoneNumber $ organizationalStatus $ mailPreferenceOption $ personalSignature ) )", + "( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST userid MAY ( description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ host ) )", + "( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) )", + "( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) )", + "( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber $ localityName $ organizationName $ organizationalUnitName ) )", + "( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST domainComponent MAY ( associatedName $ organizationName $ description $ businessCategory $ seeAlso $ searchGuide $ userPassword $ localityName $ stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) )", + "( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP domain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ telephoneNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) )", + "( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domain STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAMERecord ) )", + "( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' DESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST associatedDomain )", + "( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST friendlyCountryName )", + "( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' SUP ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName )", + "( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa STRUCTURAL MAY dSAQuality )", + "( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData' SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMaximumQuality ) )", + "( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )", + "( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) )", + "( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Additional attributes for shadow passwords' SUP top AUXILIARY MUST uid MAY ( userPassword $ description $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag ) )", + "( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top AUXILIARY MUST gidNumber MAY ( userPassword $ memberUid $ description ) )", + "( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Abstraction an Internet Protocol service. Maps an IP port and protocol (such as tcp or udp) to one or more names; the distinguished value of the cn attribute denotes the services canonical name' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description )", + "( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Abstraction of an IP protocol. Maps a protocol number to one or more names. The distinguished value of the cn attribute denotes the protocols canonical name' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber ) MAY description )", + "( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Abstraction of an Open Network Computing (ONC) [RFC1057] Remote Procedure Call (RPC) binding. This class maps an ONC RPC number to a name. The distinguished value of the cn attribute denotes the RPC services canonical name' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber ) MAY description )", + "( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Abstraction of a host, an IP device. The distinguished value of the cn attribute denotes the hosts canonical name. Device SHOULD be used as a structural class' SUP top AUXILIARY MUST ( cn $ ipHostNumber ) MAY ( userPassword $ l $ description $ manager ) )", + "( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Abstraction of a network. The distinguished value of the cn attribute denotes the networks canonical name' SUP top STRUCTURAL MUST ipNetworkNumber MAY ( cn $ ipNetmaskNumber $ l $ description $ manager ) )", + "( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Abstraction of a netgroup. May refer to other netgroups' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) )", + "( 1.3.6.1.1.1.2.9 NAME 'nisMap' DESC 'A generic abstraction of a NIS map' SUP top STRUCTURAL MUST nisMapName MAY description )", + "( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'An entry in a NIS map' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY description )", + "( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'A device with a MAC address; device SHOULD be used as a structural class' SUP top AUXILIARY MAY macAddress )", + "( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'A device with boot parameters; device SHOULD be used as a structural class' SUP top AUXILIARY MAY ( bootFile $ bootParameter ) )", + "( 1.3.6.1.1.1.2.14 NAME 'nisKeyObject' DESC 'An object with a public and secret key' SUP top AUXILIARY MUST ( cn $ nisPublicKey $ nisSecretKey ) MAY ( uidNumber $ description ) )", + "( 1.3.6.1.1.1.2.15 NAME 'nisDomainObject' DESC 'Associates a NIS domain with a naming context' SUP top AUXILIARY MUST nisDomain )", + "( 1.3.6.1.1.1.2.16 NAME 'automountMap' SUP top STRUCTURAL MUST automountMapName MAY description )", + "( 1.3.6.1.1.1.2.17 NAME 'automount' DESC 'Automount information' SUP top STRUCTURAL MUST ( automountKey $ automountInformation ) MAY description )", + "( 1.3.6.1.4.1.5322.13.1.1 NAME 'namedObject' SUP top STRUCTURAL MAY cn )", + "( 1.3.6.1.4.1.7057.10.1.2.1.2 NAME 'suseModuleConfiguration' DESC 'Contains configuration of Management Modules' SUP top STRUCTURAL MUST cn MAY suseDefaultBase )", + "( 1.3.6.1.4.1.7057.10.1.2.1.3 NAME 'suseUserConfiguration' DESC 'Configuration of user management tools' SUP suseModuleConfiguration STRUCTURAL MAY ( suseMinPasswordLength $ suseMaxPasswordLength $ susePasswordHash $ suseSkelDir $ suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseDefaultTemplate $ suseSearchFilter $ suseMapAttribute ) )", + "( 1.3.6.1.4.1.7057.10.1.2.1.4 NAME 'suseObjectTemplate' DESC 'Base Class for Object-Templates' SUP top STRUCTURAL MUST cn MAY ( susePlugin $ suseDefaultValue $ suseNamingAttribute ) )", + "( 1.3.6.1.4.1.7057.10.1.2.1.5 NAME 'suseUserTemplate' DESC 'User object template' SUP suseObjectTemplate STRUCTURAL MUST cn MAY suseSecondaryGroup )", + "( 1.3.6.1.4.1.7057.10.1.2.1.6 NAME 'suseGroupTemplate' DESC 'Group object template' SUP suseObjectTemplate STRUCTURAL MUST cn )", + "( 1.3.6.1.4.1.7057.10.1.2.1.7 NAME 'suseGroupConfiguration' DESC 'Configuration of user management tools' SUP suseModuleConfiguration STRUCTURAL MAY ( suseNextUniqueId $ suseMinUniqueId $ suseMaxUniqueId $ suseDefaultTemplate $ suseSearchFilter $ suseMapAttribute ) )", + "( 1.3.6.1.4.1.7057.10.1.2.1.8 NAME 'suseCaConfiguration' DESC 'Configuration of CA management tools' SUP suseModuleConfiguration STRUCTURAL )", + "( 1.3.6.1.4.1.7057.10.1.2.1.9 NAME 'suseDnsConfiguration' DESC 'Configuration of mail server management tools' SUP suseModuleConfiguration STRUCTURAL )", + "( 1.3.6.1.4.1.7057.10.1.2.1.10 NAME 'suseDhcpConfiguration' DESC 'Configuration of DHCP server management tools' SUP suseModuleConfiguration STRUCTURAL )", + "( 1.3.6.1.4.1.7057.10.1.2.1.11 NAME 'suseMailConfiguration' DESC 'Configuration of IMAP user management tools' SUP suseModuleConfiguration STRUCTURAL MUST ( suseImapServer $ suseImapAdmin $ suseImapDefaultQuota $ suseImapUseSsl ) )" + ], + "structuralObjectClass": [ + "subentry" + ], + "subschemaSubentry": [ + "cn=Subschema" + ] + }, + "schema_entry": "cn=Subschema", + "type": "SchemaInfo" +} +""" + +slapd_2_4_dsa_info = """ +{ + "raw": { + "configContext": [ + "cn=config" + ], + "entryDN": [ + "" + ], + "namingContexts": [ + "o=services", + "o=test" + ], + "objectClass": [ + "top", + "OpenLDAProotDSE" + ], + "structuralObjectClass": [ + "OpenLDAProotDSE" + ], + "subschemaSubentry": [ + "cn=Subschema" + ], + "supportedControl": [ + "1.3.6.1.4.1.4203.1.9.1.1", + "2.16.840.1.113730.3.4.18", + "2.16.840.1.113730.3.4.2", + "1.3.6.1.4.1.4203.1.10.1", + "1.2.840.113556.1.4.319", + "1.2.826.0.1.3344810.2.3", + "1.3.6.1.1.13.2", + "1.3.6.1.1.13.1", + "1.3.6.1.1.12" + ], + "supportedExtension": [ + "1.3.6.1.4.1.1466.20037", + "1.3.6.1.4.1.4203.1.11.1", + "1.3.6.1.4.1.4203.1.11.3", + "1.3.6.1.1.8" + ], + "supportedFeatures": [ + "1.3.6.1.1.14", + "1.3.6.1.4.1.4203.1.5.1", + "1.3.6.1.4.1.4203.1.5.2", + "1.3.6.1.4.1.4203.1.5.3", + "1.3.6.1.4.1.4203.1.5.4", + "1.3.6.1.4.1.4203.1.5.5" + ], + "supportedLDAPVersion": [ + "3" + ], + "supportedSASLMechanisms": [ + "GSSAPI", + "DIGEST-MD5" + ] + }, + "type": "DsaInfo" +} +""" diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4fcc1a07bfddc095f218f8e70a7afdc0100c442 GIT binary patch literal 145 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vCza+OnzaXjpvA`Hg7MBzymZYXv>c_`t=4F<|$LkeT-r}&y%}*)K MNwou+`5A~A0O#c*x&QzG literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/asyncStream.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/asyncStream.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..286c6188751494987e1af0157e69908fbb9c1420 GIT binary patch literal 3024 zcma)8&2!vD7VqwnG#bsPorI9AH>;&;53`VQK1>J{Pz2aesY-bllG+Wr2wB}TmaQ+k zdjg)4FKh10eJ?gQivNd$j_ipm#VIG=Yt7h@n5vbkUqAJi-skW2`~AL0;Q8-&Lj15s z$p7$T^|-*i2Tgqggp+_Aj5y^ir5OttCI2G1ZxPYj_v98O_?lVP%zjF8_5?>-sg>D* zZDy_1$=X31c$+(^n{|SY;oGT~b%UaOG9J{_`w>JXV_MrE&&6B-<37?d$!8D#4tzUJa-l@|BWo7RwDC2w36cRxK3Lapb z1})Bb>njpi+~PL$U`gJF-r+9qK;Pyb??UhL9`8fn;RCSEu)eTT1ms((v#2~Dp2xe1 z@YjbyjYcNqIfVm4<__m;0~JreEGY*u)*TmvrU$P2=@P#?zDXKn~!H zO=xNZ2%$adEMNDObLfD%Y_V}pXiZkuj45u12YXb-c=;`08ZVzv3Vz&U@($3J{HwOG z*Y?qJWY58w<2H;CTxuG)#yLV+_p zB_Pk6Jf-qw+<@k4$W`S20OTGtg>gZs2l`&6i$9;M<*)yKzN**YjOSFniYgvkCy1FC zhMme0l!_fA|QRa)31QF8tq-_Vn-=eSuFKS_fL=7w}RA*|JCW z+1J$gg#Kql$;|kuqHhE2bMi6yggn8Kmi!s0rBa~wv2z01y3b^)+nmkl5#{s>IfTrG zIahZoKL$oo$I=_KaSC47uDC5w*B{YjX3>pK7c$WRqc}H2(#28l3+OlmZWH6+|SI&f1;IXqEvG1--n`$ux;0 zM4aams9uZWc%IEu_~A0s9>O2hYd{c4TzU~w>LMM`4dB;d1i$g?8bfgL;B^677JoS} zh+jDSH))3`VK1Pu(SK9S$g}DP zfMIRlf4sQdfS8}nmG*apk1-MLq+;yU?uxIye@5wCn7c|nxToPVv@_Suw?qj|Xc?1? zTP7B2`zh|IZGrcj=R7MB%=V!v3|vAj%D_|TLyuY1Wxr>lGsxW@dsu1nC=+2=dtsOr ze4ZlT3&YRnQM#OIhaoTGFf?VzAhJZ5ldmGdKr*8IN<4$%2EO|+i^~*NFt-JAt-FqE zyH{OX;@tN5f_xqN+J-_pU)I;|gRCs1ZVbheqNy3IQ04{@j7nMPA}-R2oW{5AZoO%; zD!8;No)eS8%PW(C@?aPjQcT2`u_!S|lreYU&2^Hh31sTiCVeq;O;Q`#&Qqv%-)@Zb YE@F$qie><{Wv^mY#CWb(^`@*TuV&Rm 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/ldifProducer.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/ldifProducer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..309dcc9331ca6c5167b8cae7496ed3edcf070bae GIT binary patch literal 4966 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 F{ug(w>1qG~ literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockAsync.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockAsync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6165fc81ff5b380df0e9b90949cb4ab289ed5907 GIT binary patch literal 4655 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockBase.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockBase.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d577f5ea24261b7af5b5e661afa6b9c55549905 GIT binary patch literal 20859 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 Nvv9kQB%{3#{9k^5C2;@% literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockSync.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/mockSync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..133f263e22448982a0996f7a45c6384cdb101c96 GIT binary patch literal 4258 zcmai1&2QYs6(_meT`u=i-&)yL>94dKG;-=RMVdHK{P&=~{Eq<(r zv#}&_fuPEv2Nw{~-g=RbZSVaXdg!?*c<7}-fn0hDdhn_54awbgq@ugv<9jo2-pqUR z-fxBv>vdCs-|zp#*l({Y%0E%ae??#(z!Uug2vvweRjPTauMtgEXo2cp!Pkinyh@8+ z(JzsbUnXVWAcpKOc@^IzrtB|!Rli1Rk~h4%-yjXiSG=a*A}z_A-jqL0rX^qXX8c() zEBTr?=g*UQ$=AIFe~~QuZPJ!zZ}wr9&3Gq2G7- zrDK--kh;BNn+BIzT*!JatV2s~M$F;e0~|H*giXWXqW$F7+e$1D{P?nY+U!WMfU--L zuO%~2)>gN6Al^)D_F1sbdC1d75Fz?*7;MW$bo8X)h5Jbrh|L0L&to(xu5WK|ZYRdp z_U7*9qs=E>*uc>bcl!Z6(T{*Ig{Y9?8dXVwYP9f;LUgLrBD{;VM9c6lQ3DdClF03! z+_95arUk#<12?jwEG4WiXOJ6~WBIUn3%#%+#=m0x$JR?%99R)-`2i1ua1dEex67hP z8hI?Nt`k^$%o;?jH}EVGT7pF)wSXhTfyf59!9LiBc|2=JnwA#2=okL*t;6#Oo@fb( zP|np@iPhIozCuI(wF-rzfLH29r@$+qlNh$`2ClGej^*Fc5sV8l$tjW->v8e5_Dma=hUGK$=w4h}Q_j>c?+y)7j13(7y!5=By;Hezst+qviz~En zPuhHLg0TnSUKuMNQO2qgOylG+{-uFRtEG zG6}{@sU@aPRnVChQ?wMDv2qHa`r_-S>3lP1YSi0ThP9*nU?H9J?s!gGj;rUhua(0R z{|>l0YP?pT6^8X;W7vpm=kswLclpJ4PnDyO;~K0N$I2POk0)}@N zGxf#$*-BKfR*}{oJXOR(Tn3-Z)QrnAHZpE@K}K&;MjT=caWB(qTM_L;DUD|Si=4R@ z%TegBSV}d4)?wx{ZAjXbw9r;)>o>(;LC(S+sgSW#8>F5B%r<*5fC?dvT#VKcY7$)> z_gP{(LU4C)07XO^+<9q_<&*m(9%@rysWHDVjxEoHg6oCc^4%zsRhHYZ?%j^=TW%oV zC#6rg6YR4$>L(}e*c48i>T%|WUondMIfz1KcO58gE9_a3;{!m9Omij%JOFhkvZP&W z@7NLtEW?d_*0I~s8sKhHNK-uP zA+7Ep5}|LyqI__iaZ-g27!*J#BGQuKpV*;g0oOH>(_Q$XfF z698^-1W7=aFrq=p1H=aZ0uB980Gf*%q>6XT95QREklr)-GVC9z z4}wXJhO_4caKFn(m~aElc|a84)4@=HbY!+F`K+UnT|o0u&5@ib)Zm`Ewvl(&Gb!st z5w56tZzC78?rMH_1O-wX3sGN|;Qs@~?_u8MNXTzPTsn&!Ka@yCVjM<@6!*dbU`iF6 zQ|L=?=e&k3hE#+=@H&d%B*0weI&WYT_ySF-LvRJ>c(ch2rHy;dLpHpvi%6L6RytM7av@v!ASel*G zZ2QH)@v@$>4PPW(xWVEDlYfNd=SaprN)C~fw}HG1PlVuQ=-`fStjN}l&TalFG?H33 z xi&o%kOCG@KdAxw#@=(UOUKa4gxR>tQef&I$5OVaz8l=)JJd^(xNG)}-@Lxnxqd))v literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/restartable.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/restartable.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2eeae2e53d3bc9e2bb81c7b51627df7d56dd5b33 GIT binary patch literal 6883 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/sync.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/__pycache__/sync.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ecdddae1e06897a4af0c21f1bd0a733733b24db GIT binary patch literal 6826 zcmaJ`O^h2ycJ4ot%_fKQ|0l~<%ZV2vkfk)%j~&A>Bx@*JyVi_CawWU5i$)KtXQpS^ z-Bfi`))37g$T-L;fUt)k$mTFQW`kT8i$!wHA*URI92z++kX&@mA;Dgf?^ThUA4}n& ztE;+RRlR!e)q7vP`Fv)^QtW&^7ju94|f~w$Kp;rt`PAN1UGb}sh&~mJ>;#9(_Qx*Ni-b`3?YT>Li8_qd%;k+|1 zzL$Cn;i9uB>Sk{#Ty~bj6=x+}bymYQXDwWJ*27EACDC8*y%Sz`E{E?r?~1n7doR4= zTu~K&@mO)}FBDc`)$bHm^=rqvbCqdrr9P9Z)@y7**?O&^tm}EL-Tb4UG`H?I-Oe|U zo9%pQ&rjWM9PI{sZr|fx=%+r)uxT-u(^@YPMS2t-6|5 zXzfRSl6ZSQ1fcigy}W|L^&@WwYv%<)nU}Vjou}KaALnNC>rQiPv$>fs?#4XyQn$yv zz8j9G(DD-VyD@`k7iDGAO;xM2vKdx|opcz>as%PVX~&YA9mX z`*9TcT{61{_vLE#w?VIG!>Cg)h{WJ;_py*oO2y)1BIrrpO?H4KFwC>TN@|lf zzrT*$>Gzhw+{Ce1XFTnjrs~pJq#wP>)!fIEe25}dPSi}v)K?mgIBKrOG?Y*`N<)-| zw8->h>MJn?sx!7a51dMS`~Huc9k>0^Y1U0XgQ;@Ub%Q8KT{kyKX-*}IUG955mnEK4 z?33u3V|BgAg?@c6AzLD4dUP3xt@mo>;0hr z!yrmhuh;uw|M2$S?u(C)uG5H{<8op@*NKlt|A=44;2U_7Dhfrds>Si&aQUnmHYPjh zbm<__kKQI8A+aZ@OeB_RuXI((G~UXT1MNUhT1PdiofxkaRe7pJ*9;{s99sObiZ-OH z2)ZIkaa=RMQ6lYY^gycWR=q66XvBR#%B|DQJ2jX2yFTYWbE(f+ajSTKUap7Yi0Bx%S z?tTwsPPrE(aMwY!mlwOeIPqCs6?{vcY|seC@)=l?$Km<}{XKk7$hsAEP90u4$JjZ- zDTi~QC5sRo{uaFMDI=AsBOHPej=;!3y}sVbC(s0eAYNni&$0lcnSpmHD`w?GAuW7CyjW9ER@M|T zsv^Fb^i8y@qAh1M!NGWh=qpKXM>FZ#$$EMzo5?`EsvILau_{qO{i1bN?!R z_vF2d^gWx+GDFDn0olv5YoH^CIeVyp&Y^FS1N~h&R?+?wXz&V~CmQT*mUt%TDm9s@ zC-&+0S1KHgj@hLwbha=m$hpA->Fzi9qCLAN%csh8jei$wEP_@&J2y_*((s80E);6V z&?>Q+mwI*#Pa?vT^v6@G`}=2R7Gtg1y&t8ebQwSVA$p-=07*8>~&Sn7u2&n3zEZ z?QY;dM+iL^1fxN?gZ&Jb8+P+WAK@AV$#lM9+1?qX_FkOYx!M?Bl1zf+17`0WrG8>R z4?Mx&gW>yUJ1NN6<3M{#RKF_x7QC+rWx0VN&-r__vC?*1BF=&kM_#*^raZvnV??VX zROMC=kj#|?1tC{n#$dik1<8UhP(fjcmr&$JderxwTH+-=z`E|f7X?YkNp#Mv%Yr?i zBA4LZVURd;f+~pIK9Bd{_LE!>qBOU5c^tZ8vp|~&I0acR(f57-1;0eAk#o#-YEp!E z)`7qK;Qbud6p@=R6J^osBLJ}aobc9wm=cX9d3kCEPGt~*lP-FIY7H_yXNIl>Va$D3 zG}i^kX^i+T83c-uI(8OB*F+vfUC-RzFfm0Qe zC4Se1wKzHnYpLt?x`Q47Ap+vWT=Jrv<3jY|cd_Lro@9tZDH!VbPZMw5KzJ-7P%f!! zh({WN<`UYbx}@FE-&aj-PFun^1COa$#U;>G)j7>nFJs&-d^go1S`=h0v?$;fH4D89 zVidJ74s#Ay&PBSZq^F>dU>4bih;qa$A`U@5^{3hhaSk2^QQ6htcU1Uv_`z@r^M&7qF)`cQ#T5`R{uF4#H%Y{MP2TbBw(s%oetkN&B@lfw2I>L?Pw+21%T^r8 z8vwaE{t>pEFTv=29{MbRa$93aKD0x?=b#U$J~7p?!va_0JYH~D^>SV%W5qcV*NpMG zM-%h#+gRx0p{4W6KSNP3$U|X`S8@YJ$3o7N@CU@CIcZ-owS2uF<4DuZ2WA=V_53LZ zzreU;1%*<8zJt)#_-Rl>b+{4>F8qL_>JP~qeO zgc(Q`S^*RUR2p@CPO{_=sd$@Z)D4MizaXM7sUSPJsQtM!Y7=t!dk`fQ6Qt5D_znZU zf|Ndd_iYLnBd7NoN<~fYHNOQ^2lRyl7#T0s7yp!@O#X#5|4JDZ0CQFT&-nh!tgxxP zRDbr@qhhLN&>WnF!LLD&xc~5ucpE1L*(Z)X^%Qv@uoTpQfeM^K36RN*E~n)K3sAAb z^uN&Hh)MvG$_c<6^#Z=sU^l-6tgQ(LqXFKQSm9U`mNSofQNSh@&g$PX{bV6C#d-ju za8~AFiT^7rj|@PuDXj#u{Ikqt7HBFM`9JAmTN$^j1arBSF2Q zvBJdd?qHev1Q)Afzsu6movxFqfSxMi7|+S(FO2#1 z8^@gEbApK|8>r=vu@*dw$Se&({>F@^v z=haom^pa?!4SY4cdKMa;I?)M^`s9OTsD1h=GL;e%Jlqs+xvm4n2*YgoNi$0M5u);> z-NG$*6K2|Rs*~flg>>O?WutMkai_7-xP@oq)}1?z4{zMKd1rX}!^Xy)#>cmA(C3Yt zA8q_0Dj$B-*tl`CaclSogXl1dzm4ocl*GND8&Kql;`9u#1oDBSp)2);WA0ReF5rB9 z1~&V{kEc;%@);W*J90`Yd4QVar0p}^BAg8`1rbtD0h@#ykpmJ5PFBAp00sX9JC732Aas>#lnf9-jZ;Q|6L6O4mo|5abxa+ziJtwkE{0CS@y)3Vu+W(PPazRkEqUn@ zw=rSSlw}jQB4=ijWNhr<-vQ!&Bu@hwy*Lui94Lt;zT3TZdt-yoqt7W1(x8_# zklmL@YLNzrlS7v%F3uVqGslvIseS a6`zsa2w@p(Chj3N?kH81xPxd#$~z literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asyncStream.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asyncStream.py new file mode 100644 index 0000000..631331c --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asyncStream.py @@ -0,0 +1,119 @@ +""" +""" + +# Created on 2016.07.10 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +try: + from queue import Queue +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Queue + +from io import StringIO +from os import linesep + +from ..protocol.rfc2849 import decode_persistent_search_control +from ..strategy.asynchronous import AsyncStrategy +from ..core.exceptions import LDAPLDIFError +from ..utils.conv import prepare_for_stream +from ..protocol.rfc2849 import persistent_search_response_to_ldif, add_ldif_header + + +# noinspection PyProtectedMember +class AsyncStreamStrategy(AsyncStrategy): + """ + This strategy is asynchronous. It streams responses in a generator as they appear in the self._responses container + """ + def __init__(self, ldap_connection): + AsyncStrategy.__init__(self, ldap_connection) + self.can_stream = True + self.line_separator = linesep + self.all_base64 = False + self.stream = None + self.order = dict() + self._header_added = False + self.persistent_search_message_id = None + self.streaming = False + self.callback = None + if ldap_connection.pool_size: + self.events = Queue(ldap_connection.pool_size) + else: + self.events = Queue() + + del self._requests # remove _requests dict from Async Strategy + + def _start_listen(self): + AsyncStrategy._start_listen(self) + if self.streaming: + if not self.stream or (isinstance(self.stream, StringIO) and self.stream.closed): + self.set_stream(StringIO()) + + def _stop_listen(self): + AsyncStrategy._stop_listen(self) + if self.streaming: + self.stream.close() + + def accumulate_stream(self, message_id, change): + if message_id == self.persistent_search_message_id: + with self.async_lock: + self._responses[message_id] = [] + if self.streaming: + if not self._header_added and self.stream.tell() == 0: + header = add_ldif_header(['-'])[0] + self.stream.write(prepare_for_stream(header + self.line_separator + self.line_separator)) + ldif_lines = persistent_search_response_to_ldif(change) + if self.stream and ldif_lines and not self.connection.closed: + fragment = self.line_separator.join(ldif_lines) + if not self._header_added and self.stream.tell() == 0: + self._header_added = True + header = add_ldif_header(['-'])[0] + self.stream.write(prepare_for_stream(header + self.line_separator + self.line_separator)) + self.stream.write(prepare_for_stream(fragment + self.line_separator + self.line_separator)) + else: # strategy is not streaming, events are added to a queue + notification = decode_persistent_search_control(change) + if notification: + change.update(notification) + del change['controls']['2.16.840.1.113730.3.4.7'] + if not self.callback: + self.events.put(change) + else: + self.callback(change) + + def get_stream(self): + if self.streaming: + return self.stream + return None + + def set_stream(self, value): + error = False + try: + if not value.writable(): + error = True + except (ValueError, AttributeError): + error = True + + if error: + raise LDAPLDIFError('stream must be writable') + + self.stream = value + self.streaming = True diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asynchronous.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asynchronous.py new file mode 100644 index 0000000..613db2a --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/asynchronous.py @@ -0,0 +1,292 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from threading import Thread, Lock, Event +import socket + +from .. import get_config_parameter, DIGEST_MD5 +from ..core.exceptions import LDAPSSLConfigurationError, LDAPStartTLSError, LDAPOperationResult, LDAPSignatureVerificationFailedError +from ..strategy.base import BaseStrategy, RESPONSE_COMPLETE +from ..protocol.rfc4511 import LDAPMessage +from ..utils.log import log, log_enabled, format_ldap_message, ERROR, NETWORK, EXTENDED +from ..utils.asn1 import decoder, decode_message_fast +from ..protocol.sasl.digestMd5 import md5_hmac + + +# noinspection PyProtectedMember +class AsyncStrategy(BaseStrategy): + """ + This strategy is asynchronous. You send the request and get the messageId of the request sent + Receiving data from socket is managed in a separated thread in a blocking mode + Requests return an int value to indicate the messageId of the requested Operation + You get the response with get_response, it has a timeout to wait for response to appear + Connection.response will contain the whole LDAP response for the messageId requested in a dict form + Connection.request will contain the result LDAP message in a dict form + Response appear in strategy._responses dictionary + """ + + # noinspection PyProtectedMember + class ReceiverSocketThread(Thread): + """ + The thread that actually manage the receiver socket + """ + + def __init__(self, ldap_connection): + Thread.__init__(self) + self.connection = ldap_connection + self.socket_size = get_config_parameter('SOCKET_SIZE') + + def run(self): + """ + Waits for data on socket, computes the length of the message and waits for enough bytes to decode the message + Message are appended to strategy._responses + """ + unprocessed = b'' + get_more_data = True + listen = True + data = b'' + sasl_total_bytes_recieved = 0 + sasl_received_data = b'' # used to verify the signature, typo GC + sasl_next_packet = b'' + sasl_buffer_length = -1 + # sasl_signature = b'' # not needed here GC + # sasl_sec_num = b'' # used to verify the signature, not needed here GC + + while listen: + if get_more_data: + try: + data = self.connection.socket.recv(self.socket_size) + except (OSError, socket.error, AttributeError): + if self.connection.receive_timeout: # a receive timeout has been detected - keep kistening on the socket + continue + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', str(e), self.connection) + raise # unexpected exception - re-raise + if len(data) > 0: + # If we are using DIGEST-MD5 and LDAP signing is set : verify & remove the signature from the message + if self.connection.sasl_mechanism == DIGEST_MD5 and self.connection._digest_md5_kis and not self.connection.sasl_in_progress: + data = sasl_next_packet + data + + if sasl_received_data == b'' or sasl_next_packet: + # Remove the sizeOf(encoded_message + signature + 0x0001 + secNum) from data. + sasl_buffer_length = int.from_bytes(data[0:4], "big") + data = data[4:] + sasl_next_packet = b'' + sasl_total_bytes_recieved += len(data) + sasl_received_data += data + + if sasl_total_bytes_recieved >= sasl_buffer_length: + # When the LDAP response is splitted accross multiple TCP packets, the SASL buffer length is equal to the MTU of each packet..Which is usually not equal to self.socket_size + # This means that the end of one SASL packet/beginning of one other....could be located in the middle of data + # We are using "sasl_received_data" instead of "data" & "unprocessed" for this reason + + # structure of messages when LDAP signing is enabled : sizeOf(encoded_message + signature + 0x0001 + secNum) + encoded_message + signature + 0x0001 + secNum + sasl_signature = sasl_received_data[sasl_buffer_length - 16:sasl_buffer_length - 6] + sasl_sec_num = sasl_received_data[sasl_buffer_length - 4:sasl_buffer_length] + sasl_next_packet = sasl_received_data[sasl_buffer_length:] # the last "data" variable may contain another sasl packet. We'll process it at the next iteration. + sasl_received_data = sasl_received_data[:sasl_buffer_length - 16] # remove signature + 0x0001 + secNum + the next packet if any, from sasl_received_data + + kis = self.connection._digest_md5_kis # renamed to lowercase GC + calculated_signature = bytes.fromhex(md5_hmac(kis, sasl_sec_num + sasl_received_data)[0:20]) + if sasl_signature != calculated_signature: + raise LDAPSignatureVerificationFailedError("Signature verification failed for the recieved LDAP message number " + str(int.from_bytes(sasl_sec_num, 'big')) + ". Expected signature " + calculated_signature.hex() + " but got " + sasl_signature.hex() + ".") + sasl_total_bytes_recieved = 0 + unprocessed += sasl_received_data + sasl_received_data = b'' + else: + unprocessed += data + data = b'' + else: + listen = False + length = BaseStrategy.compute_ldap_message_size(unprocessed) + if length == -1 or len(unprocessed) < length: + get_more_data = True + elif len(unprocessed) >= length: # add message to message list + if self.connection.usage: + self.connection._usage.update_received_message(length) + if log_enabled(NETWORK): + log(NETWORK, 'received %d bytes via <%s>', length, self.connection) + if self.connection.fast_decoder: + ldap_resp = decode_message_fast(unprocessed[:length]) + dict_response = self.connection.strategy.decode_response_fast(ldap_resp) + else: + ldap_resp = decoder.decode(unprocessed[:length], asn1Spec=LDAPMessage())[0] + dict_response = self.connection.strategy.decode_response(ldap_resp) + message_id = int(ldap_resp['messageID']) + if log_enabled(NETWORK): + log(NETWORK, 'received 1 ldap message via <%s>', self.connection) + if log_enabled(EXTENDED): + log(EXTENDED, 'ldap message received via <%s>:%s', self.connection, format_ldap_message(ldap_resp, '<<')) + if dict_response['type'] == 'extendedResp' and (dict_response['responseName'] == '1.3.6.1.4.1.1466.20037' or hasattr(self.connection, '_awaiting_for_async_start_tls')): + if dict_response['result'] == 0: # StartTls in progress + if self.connection.server.tls: + self.connection.server.tls._start_tls(self.connection) + else: + self.connection.last_error = 'no Tls object defined in Server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSSLConfigurationError(self.connection.last_error) + else: + self.connection.last_error = 'asynchronous StartTls failed' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPStartTLSError(self.connection.last_error) + del self.connection._awaiting_for_async_start_tls + if message_id != 0: # 0 is reserved for 'Unsolicited Notification' from server as per RFC4511 (paragraph 4.4) + with self.connection.strategy.async_lock: + if message_id in self.connection.strategy._responses: + self.connection.strategy._responses[message_id].append(dict_response) + else: + self.connection.strategy._responses[message_id] = [dict_response] + if dict_response['type'] not in ['searchResEntry', 'searchResRef', 'intermediateResponse']: + self.connection.strategy._responses[message_id].append(RESPONSE_COMPLETE) + self.connection.strategy.set_event_for_message(message_id) + + if self.connection.strategy.can_stream: # for AsyncStreamStrategy, used for PersistentSearch + self.connection.strategy.accumulate_stream(message_id, dict_response) + unprocessed = unprocessed[length:] + get_more_data = False if unprocessed else True + listen = True if self.connection.listening or unprocessed else False + else: # Unsolicited Notification + if dict_response['responseName'] == '1.3.6.1.4.1.1466.20036': # Notice of Disconnection as per RFC4511 (paragraph 4.4.1) + listen = False + else: + self.connection.last_error = 'unknown unsolicited notification from server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPStartTLSError(self.connection.last_error) + self.connection.strategy.close() + + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = False + self.no_real_dsa = False + self.pooled = False + self._responses = None + self._requests = None + self.can_stream = False + self.receiver = None + self.async_lock = Lock() + self.event_lock = Lock() + self._events = {} + + def open(self, reset_usage=True, read_server_info=True): + """ + Open connection and start listen on the socket in a different thread + """ + with self.connection.connection_lock: + self._responses = dict() + self._requests = dict() + BaseStrategy.open(self, reset_usage, read_server_info) + + if read_server_info: + try: + self.connection.refresh_server_info() + except LDAPOperationResult: # catch errors from server if raise_exception = True + self.connection.server._dsa_info = None + self.connection.server._schema_info = None + + def close(self): + """ + Close connection and stop socket thread + """ + with self.connection.connection_lock: + BaseStrategy.close(self) + + def _add_event_for_message(self, message_id): + with self.event_lock: + # Should have the check here because the receiver thread may has created it + if message_id not in self._events: + self._events[message_id] = Event() + + def set_event_for_message(self, message_id): + with self.event_lock: + # The receiver thread may receive the response before the sender set the event for the message_id, + # so we have to check if the event exists + if message_id not in self._events: + self._events[message_id] = Event() + self._events[message_id].set() + + def _get_event_for_message(self, message_id): + with self.event_lock: + if message_id not in self._events: + raise RuntimeError('Event for message[{}] should have been created before accessing'.format(message_id)) + return self._events[message_id] + + def post_send_search(self, message_id): + """ + Clears connection.response and returns messageId + """ + self.connection.response = None + self.connection.request = None + self.connection.result = None + self._add_event_for_message(message_id) + return message_id + + def post_send_single_response(self, message_id): + """ + Clears connection.response and returns messageId. + """ + self.connection.response = None + self.connection.request = None + self.connection.result = None + self._add_event_for_message(message_id) + return message_id + + def _start_listen(self): + """ + Start thread in daemon mode + """ + if not self.connection.listening: + self.receiver = AsyncStrategy.ReceiverSocketThread(self.connection) + self.connection.listening = True + self.receiver.daemon = True + self.receiver.start() + + def _get_response(self, message_id, timeout): + """ + Performs the capture of LDAP response for this strategy + The response is only complete after the event been set + """ + event = self._get_event_for_message(message_id) + flag = event.wait(timeout) + if not flag: + # timeout + return None + + # In this stage we could ensure the response is already there + self._events.pop(message_id) + with self.async_lock: + return self._responses.pop(message_id) + + def receiving(self): + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/base.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/base.py new file mode 100644 index 0000000..6b6211e --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/base.py @@ -0,0 +1,925 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more dectails. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket +try: # try to discover if unix sockets are available for LDAP over IPC (ldapi:// scheme) + # noinspection PyUnresolvedReferences + from socket import AF_UNIX + unix_socket_available = True +except ImportError: + unix_socket_available = False +from struct import pack +from platform import system +from random import choice + +from .. import SYNC, ANONYMOUS, get_config_parameter, BASE, ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES, DIGEST_MD5 +from ..core.results import DO_NOT_RAISE_EXCEPTIONS, RESULT_REFERRAL +from ..core.exceptions import LDAPOperationResult, LDAPSASLBindInProgressError, LDAPSocketOpenError, LDAPSessionTerminatedByServerError,\ + LDAPUnknownResponseError, LDAPUnknownRequestError, LDAPReferralError, communication_exception_factory, LDAPStartTLSError, \ + LDAPSocketSendError, LDAPExceptionError, LDAPControlError, LDAPResponseTimeoutError, LDAPTransactionError +from ..utils.uri import parse_uri +from ..protocol.rfc4511 import LDAPMessage, ProtocolOp, MessageID, SearchResultEntry +from ..operation.add import add_response_to_dict, add_request_to_dict +from ..operation.modify import modify_request_to_dict, modify_response_to_dict +from ..operation.search import search_result_reference_response_to_dict, search_result_done_response_to_dict,\ + search_result_entry_response_to_dict, search_request_to_dict, search_result_entry_response_to_dict_fast,\ + search_result_reference_response_to_dict_fast, attributes_to_dict, attributes_to_dict_fast +from ..operation.bind import bind_response_to_dict, bind_request_to_dict, sicily_bind_response_to_dict, bind_response_to_dict_fast, \ + sicily_bind_response_to_dict_fast +from ..operation.compare import compare_response_to_dict, compare_request_to_dict +from ..operation.extended import extended_request_to_dict, extended_response_to_dict, intermediate_response_to_dict, extended_response_to_dict_fast, intermediate_response_to_dict_fast +from ..core.server import Server +from ..operation.modifyDn import modify_dn_request_to_dict, modify_dn_response_to_dict +from ..operation.delete import delete_response_to_dict, delete_request_to_dict +from ..protocol.convert import prepare_changes_for_request, build_controls_list +from ..operation.abandon import abandon_request_to_dict +from ..core.tls import Tls +from ..protocol.oid import Oids +from ..protocol.rfc2696 import RealSearchControlValue +from ..protocol.microsoft import DirSyncControlResponseValue +from ..utils.log import log, log_enabled, ERROR, BASIC, PROTOCOL, NETWORK, EXTENDED, format_ldap_message +from ..utils.asn1 import encode, decoder, ldap_result_to_dict_fast, decode_sequence +from ..utils.conv import to_unicode +from ..protocol.sasl.digestMd5 import md5_h, md5_hmac + +SESSION_TERMINATED_BY_SERVER = 'TERMINATED_BY_SERVER' +TRANSACTION_ERROR = 'TRANSACTION_ERROR' +RESPONSE_COMPLETE = 'RESPONSE_FROM_SERVER_COMPLETE' + + +# noinspection PyProtectedMember +class BaseStrategy(object): + """ + Base class for connection strategy + """ + + def __init__(self, ldap_connection): + self.connection = ldap_connection + self._outstanding = None + self._referrals = [] + self.sync = None # indicates a synchronous connection + self.no_real_dsa = None # indicates a connection to a fake LDAP server + self.pooled = None # Indicates a connection with a connection pool + self.can_stream = None # indicates if a strategy keeps a stream of responses (i.e. LdifProducer can accumulate responses with a single header). Stream must be initialized and closed in _start_listen() and _stop_listen() + self.referral_cache = {} + self.thread_safe = False # Indicates that connection can be used in a multithread application + if log_enabled(BASIC): + log(BASIC, 'instantiated <%s>: <%s>', self.__class__.__name__, self) + + def __str__(self): + s = [ + str(self.connection) if self.connection else 'None', + 'sync' if self.sync else 'async', + 'no real DSA' if self.no_real_dsa else 'real DSA', + 'pooled' if self.pooled else 'not pooled', + 'can stream output' if self.can_stream else 'cannot stream output', + ] + return ' - '.join(s) + + def open(self, reset_usage=True, read_server_info=True): + """ + Open a socket to a server. Choose a server from the server pool if available + """ + if log_enabled(NETWORK): + log(NETWORK, 'opening connection for <%s>', self.connection) + if self.connection.lazy and not self.connection._executing_deferred: + self.connection._deferred_open = True + self.connection.closed = False + if log_enabled(NETWORK): + log(NETWORK, 'deferring open connection for <%s>', self.connection) + else: + if not self.connection.closed and not self.connection._executing_deferred: # try to close connection if still open + self.close() + + self._outstanding = dict() + if self.connection.usage: + if reset_usage or not self.connection._usage.initial_connection_start_time: + self.connection._usage.start() + + if self.connection.server_pool: + new_server = self.connection.server_pool.get_server(self.connection) # get a server from the server_pool if available + if self.connection.server != new_server: + self.connection.server = new_server + if self.connection.usage: + self.connection._usage.servers_from_pool += 1 + + exception_history = [] + if not self.no_real_dsa: # tries to connect to a real server + for candidate_address in self.connection.server.candidate_addresses(): + try: + if log_enabled(BASIC): + log(BASIC, 'try to open candidate address %s', candidate_address[:-2]) + self._open_socket(candidate_address, self.connection.server.ssl, unix_socket=self.connection.server.ipc) + self.connection.server.current_address = candidate_address + self.connection.server.update_availability(candidate_address, True) + break + except Exception as e: + self.connection.server.update_availability(candidate_address, False) + # exception_history.append((datetime.now(), exc_type, exc_value, candidate_address[4])) + exception_history.append((type(e)(str(e)), candidate_address[4])) + if not self.connection.server.current_address and exception_history: + if len(exception_history) == 1: # only one exception, reraise + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', str(exception_history[0][0]) + ' ' + str((exception_history[0][1])), self.connection) + raise exception_history[0][0] + else: + if log_enabled(ERROR): + log(ERROR, 'unable to open socket for <%s>', self.connection) + raise LDAPSocketOpenError('unable to open socket', exception_history) + elif not self.connection.server.current_address: + if log_enabled(ERROR): + log(ERROR, 'invalid server address for <%s>', self.connection) + raise LDAPSocketOpenError('invalid server address') + + self.connection._deferred_open = False + self._start_listen() + if log_enabled(NETWORK): + log(NETWORK, 'connection open for <%s>', self.connection) + + def close(self): + """ + Close connection + """ + if log_enabled(NETWORK): + log(NETWORK, 'closing connection for <%s>', self.connection) + if self.connection.lazy and not self.connection._executing_deferred and (self.connection._deferred_bind or self.connection._deferred_open): + self.connection.listening = False + self.connection.closed = True + if log_enabled(NETWORK): + log(NETWORK, 'deferred connection closed for <%s>', self.connection) + else: + if not self.connection.closed: + self._stop_listen() + if not self. no_real_dsa: + self._close_socket() + if log_enabled(NETWORK): + log(NETWORK, 'connection closed for <%s>', self.connection) + + self.connection.bound = False + self.connection.request = None + self.connection.response = None + self.connection.tls_started = False + self._outstanding = None + self._referrals = [] + + if not self.connection.strategy.no_real_dsa: + self.connection.server.current_address = None + if self.connection.usage: + self.connection._usage.stop() + + def _open_socket(self, address, use_ssl=False, unix_socket=False): + """ + Tries to open and connect a socket to a Server + raise LDAPExceptionError if unable to open or connect socket + """ + try: + self.connection.socket = socket.socket(*address[:3]) + except Exception as e: + self.connection.last_error = 'socket creation error: ' + str(e) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketOpenError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + # Try to bind the socket locally before connecting to the remote address + # We go through our connection's source ports and try to bind our socket to our connection's source address + # with them. + # If no source address or ports were specified, this will have the same success/fail result as if we + # tried to connect to the remote server without binding locally first. + # This is actually a little bit better, as it lets us distinguish the case of "issue binding the socket + # locally" from "remote server is unavailable" with more clarity, though this will only really be an + # issue when no source address/port is specified if the system checking server availability is running + # as a very unprivileged user. + last_bind_exc = None + if unix_socket_available and self.connection.socket.family != socket.AF_UNIX: + socket_bind_succeeded = False + for source_port in self.connection.source_port_list: + try: + self.connection.socket.bind((self.connection.source_address, source_port)) + socket_bind_succeeded = True + break + except Exception as bind_ex: + last_bind_exc = bind_ex + # we'll always end up logging at error level if we cannot bind any ports to the address locally. + # but if some work and some don't you probably don't want the ones that don't at ERROR level + if log_enabled(NETWORK): + log(NETWORK, 'Unable to bind to local address <%s> with source port <%s> due to <%s>', + self.connection.source_address, source_port, bind_ex) + if not socket_bind_succeeded: + self.connection.last_error = 'socket connection error while locally binding: ' + str(last_bind_exc) + if log_enabled(ERROR): + log(ERROR, 'Unable to locally bind to local address <%s> with any of the source ports <%s> for connection <%s due to <%s>', + self.connection.source_address, self.connection.source_port_list, self.connection, last_bind_exc) + raise communication_exception_factory(LDAPSocketOpenError, type(last_bind_exc)(str(last_bind_exc)))(last_bind_exc) + + try: # set socket timeout for opening connection + if self.connection.server.connect_timeout: + self.connection.socket.settimeout(self.connection.server.connect_timeout) + self.connection.socket.connect(address[4]) + except socket.error as e: + self.connection.last_error = 'socket connection error while opening: ' + str(e) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketOpenError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + + # Set connection recv timeout (must be set after connect, + # because socket.settimeout() affects both, connect() as + # well as recv(). Set it before tls.wrap_socket() because + # the recv timeout should take effect during the TLS + # handshake. + if self.connection.receive_timeout is not None: + try: # set receive timeout for the connection socket + self.connection.socket.settimeout(self.connection.receive_timeout) + if system().lower() == 'windows': + self.connection.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, int(1000 * self.connection.receive_timeout)) + else: + self.connection.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, pack('LL', self.connection.receive_timeout, 0)) + except socket.error as e: + self.connection.last_error = 'unable to set receive timeout for socket connection: ' + str(e) + + # if exc: + # if log_enabled(ERROR): + # log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketOpenError, exc)(self.connection.last_error) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + + if use_ssl: + try: + self.connection.server.tls.wrap_socket(self.connection, do_handshake=True) + if self.connection.usage: + self.connection._usage.wrapped_sockets += 1 + except Exception as e: + self.connection.last_error = 'socket ssl wrapping error: ' + str(e) + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise communication_exception_factory(LDAPSocketOpenError, type(e)(str(e)))(self.connection.last_error) + if self.connection.usage: + self.connection._usage.open_sockets += 1 + + self.connection.closed = False + + def _close_socket(self): + """ + Try to close a socket + don't raise exception if unable to close socket, assume socket is already closed + """ + + try: + self.connection.socket.shutdown(socket.SHUT_RDWR) + except Exception: + pass + + try: + self.connection.socket.close() + except Exception: + pass + + self.connection.socket = None + self.connection.closed = True + + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + def _stop_listen(self): + self.connection.listening = False + + def send(self, message_type, request, controls=None): + """ + Send an LDAP message + Returns the message_id + """ + self.connection.request = None + if self.connection.listening: + if self.connection.sasl_in_progress and message_type not in ['bindRequest']: # as per RFC4511 (4.2.1) + self.connection.last_error = 'cannot send operation requests while SASL bind is in progress' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSASLBindInProgressError(self.connection.last_error) + message_id = self.connection.server.next_message_id() + ldap_message = LDAPMessage() + ldap_message['messageID'] = MessageID(message_id) + ldap_message['protocolOp'] = ProtocolOp().setComponentByName(message_type, request) + message_controls = build_controls_list(controls) + if message_controls is not None: + ldap_message['controls'] = message_controls + self.connection.request = BaseStrategy.decode_request(message_type, request, controls) + self._outstanding[message_id] = self.connection.request + self.sending(ldap_message) + else: + self.connection.last_error = 'unable to send message, socket is not open' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketOpenError(self.connection.last_error) + + return message_id + + def get_response(self, message_id, timeout=None, get_request=False): + """ + Get response LDAP messages + Responses are returned by the underlying connection strategy + Check if message_id LDAP message is still outstanding and wait for timeout to see if it appears in _get_response + Result is stored in connection.result + Responses without result is stored in connection.response + A tuple (responses, result) is returned + """ + if timeout is None: + timeout = get_config_parameter('RESPONSE_WAITING_TIMEOUT') + response = None + result = None + # request = None + if self._outstanding and message_id in self._outstanding: + responses = self._get_response(message_id, timeout) + + if not responses: + if log_enabled(ERROR): + log(ERROR, 'socket timeout, no response from server for <%s>', self.connection) + raise LDAPResponseTimeoutError('no response from server') + + if responses == SESSION_TERMINATED_BY_SERVER: + try: # try to close the session but don't raise any error if server has already closed the session + self.close() + except (socket.error, LDAPExceptionError): + pass + self.connection.last_error = 'session terminated by server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSessionTerminatedByServerError(self.connection.last_error) + elif responses == TRANSACTION_ERROR: # Novell LDAP Transaction unsolicited notification + self.connection.last_error = 'transaction error' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPTransactionError(self.connection.last_error) + + # if referral in response opens a new connection to resolve referrals if requested + + if responses[-2]['result'] == RESULT_REFERRAL: + if self.connection.usage: + self.connection._usage.referrals_received += 1 + if self.connection.auto_referrals: + ref_response, ref_result = self.do_operation_on_referral(self._outstanding[message_id], responses[-2]['referrals']) + if ref_response is not None: + responses = ref_response + [ref_result] + responses.append(RESPONSE_COMPLETE) + elif ref_result is not None: + responses = [ref_result, RESPONSE_COMPLETE] + + self._referrals = [] + + if responses: + result = responses[-2] + response = responses[:-2] + self.connection.result = None + self.connection.response = None + + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + self._outstanding.pop(message_id) + self.connection.result = result.copy() + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + # checks if any response has a range tag + # self._auto_range_searching is set as a flag to avoid recursive searches + if self.connection.auto_range and not hasattr(self, '_auto_range_searching') and any((True for resp in response if 'raw_attributes' in resp for name in resp['raw_attributes'] if ';range=' in name)): + self._auto_range_searching = result.copy() + temp_response = response[:] # copy + if self.do_search_on_auto_range(self._outstanding[message_id], response): + for resp in temp_response: + if resp['type'] == 'searchResEntry': + keys = [key for key in resp['raw_attributes'] if ';range=' in key] + for key in keys: + del resp['raw_attributes'][key] + del resp['attributes'][key] + response = temp_response + result = self._auto_range_searching + del self._auto_range_searching + + if self.connection.empty_attributes: + for entry in response: + if entry['type'] == 'searchResEntry': + for attribute_type in self._outstanding[message_id]['attributes']: + if attribute_type not in entry['raw_attributes'] and attribute_type not in (ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES): + entry['raw_attributes'][attribute_type] = list() + entry['attributes'][attribute_type] = list() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute set to empty list for missing attribute <%s> in <%s>', attribute_type, self) + if not self.connection.auto_range: + attrs_to_remove = [] + # removes original empty attribute in case a range tag is returned + for attribute_type in entry['attributes']: + if ';range' in attribute_type.lower(): + orig_attr, _, _ = attribute_type.partition(';') + attrs_to_remove.append(orig_attr) + for attribute_type in attrs_to_remove: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute type <%s> removed in response because of same attribute returned as range by the server in <%s>', attribute_type, self) + del entry['raw_attributes'][attribute_type] + del entry['attributes'][attribute_type] + + request = self._outstanding.pop(message_id) + else: + if log_enabled(ERROR): + log(ERROR, 'message id not in outstanding queue for <%s>', self.connection) + raise(LDAPResponseTimeoutError('message id not in outstanding queue')) + + if get_request: + return response, result, request + else: + return response, result + + @staticmethod + def compute_ldap_message_size(data): + """ + Compute LDAP Message size according to BER definite length rules + Returns -1 if too few data to compute message length + """ + if isinstance(data, str): # fix for Python 2, data is string not bytes + data = bytearray(data) # Python 2 bytearray is equivalent to Python 3 bytes + + ret_value = -1 + if len(data) > 2: + if data[1] <= 127: # BER definite length - short form. Highest bit of byte 1 is 0, message length is in the last 7 bits - Value can be up to 127 bytes long + ret_value = data[1] + 2 + else: # BER definite length - long form. Highest bit of byte 1 is 1, last 7 bits counts the number of following octets containing the value length + bytes_length = data[1] - 128 + if len(data) >= bytes_length + 2: + value_length = 0 + cont = bytes_length + for byte in data[2:2 + bytes_length]: + cont -= 1 + value_length += byte * (256 ** cont) + ret_value = value_length + 2 + bytes_length + + return ret_value + + def decode_response(self, ldap_message): + """ + Convert received LDAPMessage to a dict + """ + message_type = ldap_message.getComponentByName('protocolOp').getName() + component = ldap_message['protocolOp'].getComponent() + controls = ldap_message['controls'] if ldap_message['controls'].hasValue() else None + if message_type == 'bindResponse': + if not bytes(component['matchedDN']).startswith(b'NTLM'): # patch for microsoft ntlm authentication + result = bind_response_to_dict(component) + else: + result = sicily_bind_response_to_dict(component) + elif message_type == 'searchResEntry': + result = search_result_entry_response_to_dict(component, self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + elif message_type == 'searchResDone': + result = search_result_done_response_to_dict(component) + elif message_type == 'searchResRef': + result = search_result_reference_response_to_dict(component) + elif message_type == 'modifyResponse': + result = modify_response_to_dict(component) + elif message_type == 'addResponse': + result = add_response_to_dict(component) + elif message_type == 'delResponse': + result = delete_response_to_dict(component) + elif message_type == 'modDNResponse': + result = modify_dn_response_to_dict(component) + elif message_type == 'compareResponse': + result = compare_response_to_dict(component) + elif message_type == 'extendedResp': + result = extended_response_to_dict(component) + elif message_type == 'intermediateResponse': + result = intermediate_response_to_dict(component) + else: + if log_enabled(ERROR): + log(ERROR, 'unknown response <%s> for <%s>', message_type, self.connection) + raise LDAPUnknownResponseError('unknown response') + result['type'] = message_type + if controls: + result['controls'] = dict() + for control in controls: + decoded_control = self.decode_control(control) + result['controls'][decoded_control[0]] = decoded_control[1] + return result + + def decode_response_fast(self, ldap_message): + """ + Convert received LDAPMessage from fast ber decoder to a dict + """ + if ldap_message['protocolOp'] == 1: # bindResponse + if not ldap_message['payload'][1][3].startswith(b'NTLM'): # patch for microsoft ntlm authentication + result = bind_response_to_dict_fast(ldap_message['payload']) + else: + result = sicily_bind_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'bindResponse' + elif ldap_message['protocolOp'] == 4: # searchResEntry' + result = search_result_entry_response_to_dict_fast(ldap_message['payload'], self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + result['type'] = 'searchResEntry' + elif ldap_message['protocolOp'] == 5: # searchResDone + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'searchResDone' + elif ldap_message['protocolOp'] == 19: # searchResRef + result = search_result_reference_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'searchResRef' + elif ldap_message['protocolOp'] == 7: # modifyResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'modifyResponse' + elif ldap_message['protocolOp'] == 9: # addResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'addResponse' + elif ldap_message['protocolOp'] == 11: # delResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'delResponse' + elif ldap_message['protocolOp'] == 13: # modDNResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'modDNResponse' + elif ldap_message['protocolOp'] == 15: # compareResponse + result = ldap_result_to_dict_fast(ldap_message['payload']) + result['type'] = 'compareResponse' + elif ldap_message['protocolOp'] == 24: # extendedResp + result = extended_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'extendedResp' + elif ldap_message['protocolOp'] == 25: # intermediateResponse + result = intermediate_response_to_dict_fast(ldap_message['payload']) + result['type'] = 'intermediateResponse' + else: + if log_enabled(ERROR): + log(ERROR, 'unknown response <%s> for <%s>', ldap_message['protocolOp'], self.connection) + raise LDAPUnknownResponseError('unknown response') + if ldap_message['controls']: + result['controls'] = dict() + for control in ldap_message['controls']: + decoded_control = self.decode_control_fast(control[3]) + result['controls'][decoded_control[0]] = decoded_control[1] + return result + + @staticmethod + def decode_control(control): + """ + decode control, return a 2-element tuple where the first element is the control oid + and the second element is a dictionary with description (from Oids), criticality and decoded control value + """ + control_type = str(control['controlType']) + criticality = bool(control['criticality']) + control_value = bytes(control['controlValue']) + unprocessed = None + if control_type == '1.2.840.113556.1.4.319': # simple paged search as per RFC2696 + control_resp, unprocessed = decoder.decode(control_value, asn1Spec=RealSearchControlValue()) + control_value = dict() + control_value['size'] = int(control_resp['size']) + control_value['cookie'] = bytes(control_resp['cookie']) + elif control_type == '1.2.840.113556.1.4.841': # DirSync AD + control_resp, unprocessed = decoder.decode(control_value, asn1Spec=DirSyncControlResponseValue()) + control_value = dict() + control_value['more_results'] = bool(control_resp['MoreResults']) # more_result if nonzero + control_value['cookie'] = bytes(control_resp['CookieServer']) + elif control_type == '1.3.6.1.1.13.1' or control_type == '1.3.6.1.1.13.2': # Pre-Read control, Post-Read Control as per RFC 4527 + control_resp, unprocessed = decoder.decode(control_value, asn1Spec=SearchResultEntry()) + control_value = dict() + control_value['result'] = attributes_to_dict(control_resp['attributes']) + if unprocessed: + if log_enabled(ERROR): + log(ERROR, 'unprocessed control response in substrate') + raise LDAPControlError('unprocessed control response in substrate') + return control_type, {'description': Oids.get(control_type, ''), 'criticality': criticality, 'value': control_value} + + @staticmethod + def decode_control_fast(control, from_server=True): + """ + decode control, return a 2-element tuple where the first element is the control oid + and the second element is a dictionary with description (from Oids), criticality and decoded control value + """ + control_type = str(to_unicode(control[0][3], from_server=from_server)) + criticality = False + control_value = None + for r in control[1:]: + if r[2] == 4: # controlValue + control_value = r[3] + else: + criticality = False if r[3] == 0 else True # criticality (booleand default to False) + if control_type == '1.2.840.113556.1.4.319': # simple paged search as per RFC2696 + control_resp = decode_sequence(control_value, 0, len(control_value)) + control_value = dict() + control_value['size'] = int(control_resp[0][3][0][3]) + control_value['cookie'] = bytes(control_resp[0][3][1][3]) + elif control_type == '1.2.840.113556.1.4.841': # DirSync AD + control_resp = decode_sequence(control_value, 0, len(control_value)) + control_value = dict() + control_value['more_results'] = True if control_resp[0][3][0][3] else False # more_result if nonzero + control_value['cookie'] = control_resp[0][3][2][3] + elif control_type == '1.3.6.1.1.13.1' or control_type == '1.3.6.1.1.13.2': # Pre-Read control, Post-Read Control as per RFC 4527 + control_resp = decode_sequence(control_value, 0, len(control_value)) + control_value = dict() + control_value['result'] = attributes_to_dict_fast(control_resp[0][3][1][3]) + return control_type, {'description': Oids.get(control_type, ''), 'criticality': criticality, 'value': control_value} + + @staticmethod + def decode_request(message_type, component, controls=None): + # message_type = ldap_message.getComponentByName('protocolOp').getName() + # component = ldap_message['protocolOp'].getComponent() + if message_type == 'bindRequest': + result = bind_request_to_dict(component) + elif message_type == 'unbindRequest': + result = dict() + elif message_type == 'addRequest': + result = add_request_to_dict(component) + elif message_type == 'compareRequest': + result = compare_request_to_dict(component) + elif message_type == 'delRequest': + result = delete_request_to_dict(component) + elif message_type == 'extendedReq': + result = extended_request_to_dict(component) + elif message_type == 'modifyRequest': + result = modify_request_to_dict(component) + elif message_type == 'modDNRequest': + result = modify_dn_request_to_dict(component) + elif message_type == 'searchRequest': + result = search_request_to_dict(component) + elif message_type == 'abandonRequest': + result = abandon_request_to_dict(component) + else: + if log_enabled(ERROR): + log(ERROR, 'unknown request <%s>', message_type) + raise LDAPUnknownRequestError('unknown request') + result['type'] = message_type + result['controls'] = controls + + return result + + def valid_referral_list(self, referrals): + referral_list = [] + for referral in referrals: + candidate_referral = parse_uri(referral) + if candidate_referral: + for ref_host in self.connection.server.allowed_referral_hosts: + if ref_host[0] == candidate_referral['host'] or ref_host[0] == '*': + if candidate_referral['host'] not in self._referrals: + candidate_referral['anonymousBindOnly'] = not ref_host[1] + referral_list.append(candidate_referral) + break + + return referral_list + + def do_next_range_search(self, request, response, attr_name): + done = False + current_response = response + while not done: + attr_type, _, returned_range = attr_name.partition(';range=') + _, _, high_range = returned_range.partition('-') + response['raw_attributes'][attr_type] += current_response['raw_attributes'][attr_name] + response['attributes'][attr_type] += current_response['attributes'][attr_name] + if high_range != '*': + if log_enabled(PROTOCOL): + log(PROTOCOL, 'performing next search on auto-range <%s> via <%s>', str(int(high_range) + 1), self.connection) + requested_range = attr_type + ';range=' + str(int(high_range) + 1) + '-*' + result = self.connection.search(search_base=response['dn'], + search_filter='(objectclass=*)', + search_scope=BASE, + dereference_aliases=request['dereferenceAlias'], + attributes=[attr_type + ';range=' + str(int(high_range) + 1) + '-*']) + if self.connection.strategy.thread_safe: + status, result, _response, _ = result + else: + status = result + result = self.connection.result + _response = self.connection.response + + if self.connection.strategy.sync: + if status: + current_response = _response[0] + else: + done = True + else: + current_response, _ = self.get_response(status) + current_response = current_response[0] + + if not done: + if requested_range in current_response['raw_attributes'] and len(current_response['raw_attributes'][requested_range]) == 0: + del current_response['raw_attributes'][requested_range] + del current_response['attributes'][requested_range] + attr_name = list(filter(lambda a: ';range=' in a, current_response['raw_attributes'].keys()))[0] + continue + done = True + + def do_search_on_auto_range(self, request, response): + for resp in [r for r in response if r['type'] == 'searchResEntry']: + for attr_name in list(resp['raw_attributes'].keys()): # generate list to avoid changing of dict size error + if ';range=' in attr_name: + attr_type, _, range_values = attr_name.partition(';range=') + if range_values in ('1-1', '0-0'): # DirSync returns these values for adding and removing members + return False + if attr_type not in resp['raw_attributes'] or resp['raw_attributes'][attr_type] is None: + resp['raw_attributes'][attr_type] = list() + if attr_type not in resp['attributes'] or resp['attributes'][attr_type] is None: + resp['attributes'][attr_type] = list() + self.do_next_range_search(request, resp, attr_name) + return True + + def create_referral_connection(self, referrals): + referral_connection = None + selected_referral = None + cachekey = None + valid_referral_list = self.valid_referral_list(referrals) + if valid_referral_list: + preferred_referral_list = [referral for referral in valid_referral_list if + referral['ssl'] == self.connection.server.ssl] + selected_referral = choice(preferred_referral_list) if preferred_referral_list else choice( + valid_referral_list) + + cachekey = (selected_referral['host'], selected_referral['port'] or self.connection.server.port, selected_referral['ssl']) + if self.connection.use_referral_cache and cachekey in self.referral_cache: + referral_connection = self.referral_cache[cachekey] + else: + referral_server = Server(host=selected_referral['host'], + port=selected_referral['port'] or self.connection.server.port, + use_ssl=selected_referral['ssl'], + get_info=self.connection.server.get_info, + formatter=self.connection.server.custom_formatter, + connect_timeout=self.connection.server.connect_timeout, + mode=self.connection.server.mode, + allowed_referral_hosts=self.connection.server.allowed_referral_hosts, + tls=Tls(local_private_key_file=self.connection.server.tls.private_key_file, + local_certificate_file=self.connection.server.tls.certificate_file, + validate=self.connection.server.tls.validate, + version=self.connection.server.tls.version, + ca_certs_file=self.connection.server.tls.ca_certs_file) if + selected_referral['ssl'] else None) + + from ..core.connection import Connection + + referral_connection = Connection(server=referral_server, + user=self.connection.user if not selected_referral['anonymousBindOnly'] else None, + password=self.connection.password if not selected_referral['anonymousBindOnly'] else None, + version=self.connection.version, + authentication=self.connection.authentication if not selected_referral['anonymousBindOnly'] else ANONYMOUS, + client_strategy=SYNC, + auto_referrals=True, + read_only=self.connection.read_only, + check_names=self.connection.check_names, + raise_exceptions=self.connection.raise_exceptions, + fast_decoder=self.connection.fast_decoder, + receive_timeout=self.connection.receive_timeout, + sasl_mechanism=self.connection.sasl_mechanism, + sasl_credentials=self.connection.sasl_credentials) + + if self.connection.usage: + self.connection._usage.referrals_connections += 1 + + referral_connection.open() + referral_connection.strategy._referrals = self._referrals + if self.connection.tls_started and not referral_server.ssl: # if the original server was in start_tls mode and the referral server is not in ssl then start_tls on the referral connection + if not referral_connection.start_tls(): + error = 'start_tls in referral not successful' + (' - ' + referral_connection.last_error if referral_connection.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.unbind() + raise LDAPStartTLSError(error) + + if self.connection.bound: + referral_connection.bind() + + if self.connection.usage: + self.connection._usage.referrals_followed += 1 + + return selected_referral, referral_connection, cachekey + + def do_operation_on_referral(self, request, referrals): + if log_enabled(PROTOCOL): + log(PROTOCOL, 'following referral for <%s>', self.connection) + selected_referral, referral_connection, cachekey = self.create_referral_connection(referrals) + if selected_referral: + if request['type'] == 'searchRequest': + referral_connection.search(selected_referral['base'] or request['base'], + selected_referral['filter'] or request['filter'], + selected_referral['scope'] or request['scope'], + request['dereferenceAlias'], + selected_referral['attributes'] or request['attributes'], + request['sizeLimit'], + request['timeLimit'], + request['typesOnly'], + controls=request['controls']) + elif request['type'] == 'addRequest': + referral_connection.add(selected_referral['base'] or request['entry'], + None, + request['attributes'], + controls=request['controls']) + elif request['type'] == 'compareRequest': + referral_connection.compare(selected_referral['base'] or request['entry'], + request['attribute'], + request['value'], + controls=request['controls']) + elif request['type'] == 'delRequest': + referral_connection.delete(selected_referral['base'] or request['entry'], + controls=request['controls']) + elif request['type'] == 'extendedReq': + referral_connection.extended(request['name'], + request['value'], + controls=request['controls'], + no_encode=True + ) + elif request['type'] == 'modifyRequest': + referral_connection.modify(selected_referral['base'] or request['entry'], + prepare_changes_for_request(request['changes']), + controls=request['controls']) + elif request['type'] == 'modDNRequest': + referral_connection.modify_dn(selected_referral['base'] or request['entry'], + request['newRdn'], + request['deleteOldRdn'], + request['newSuperior'], + controls=request['controls']) + else: + self.connection.last_error = 'referral operation not permitted' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPReferralError(self.connection.last_error) + + response = referral_connection.response + result = referral_connection.result + if self.connection.use_referral_cache: + self.referral_cache[cachekey] = referral_connection + else: + referral_connection.unbind() + else: + response = None + result = None + + return response, result + + def sending(self, ldap_message): + if log_enabled(NETWORK): + log(NETWORK, 'sending 1 ldap message for <%s>', self.connection) + try: + encoded_message = encode(ldap_message) + if self.connection.sasl_mechanism == DIGEST_MD5 and self.connection._digest_md5_kic and not self.connection.sasl_in_progress: + # If we are using DIGEST-MD5 and LDAP signing is enabled: add a signature to the message + sec_num = self.connection._digest_md5_sec_num # added underscore GC + kic = self.connection._digest_md5_kic # lowercase GC + + # RFC 2831 : encoded_message = sizeOf(encored_message + signature + 0x0001 + secNum) + encoded_message + signature + 0x0001 + secNum + signature = bytes.fromhex(md5_hmac(kic, int(sec_num).to_bytes(4, 'big') + encoded_message)[0:20]) + encoded_message = int(len(encoded_message) + 4 + 2 + 10).to_bytes(4, 'big') + encoded_message + signature + int(1).to_bytes(2, 'big') + int(sec_num).to_bytes(4, 'big') + self.connection._digest_md5_sec_num += 1 + + self.connection.socket.sendall(encoded_message) + if log_enabled(EXTENDED): + log(EXTENDED, 'ldap message sent via <%s>:%s', self.connection, format_ldap_message(ldap_message, '>>')) + if log_enabled(NETWORK): + log(NETWORK, 'sent %d bytes via <%s>', len(encoded_message), self.connection) + except socket.error as e: + self.connection.last_error = 'socket sending error' + str(e) + encoded_message = None + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketSendError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketSendError, type(e)(str(e)))(self.connection.last_error) + if self.connection.usage: + self.connection._usage.update_transmitted_message(self.connection.request, len(encoded_message)) + + def _start_listen(self): + # overridden on strategy class + raise NotImplementedError + + def _get_response(self, message_id, timeout): + # overridden in strategy class + raise NotImplementedError + + def receiving(self): + # overridden in strategy class + raise NotImplementedError + + def post_send_single_response(self, message_id): + # overridden in strategy class + raise NotImplementedError + + def post_send_search(self, message_id): + # overridden in strategy class + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError + + def unbind_referral_cache(self): + while len(self.referral_cache) > 0: + cachekey, referral_connection = self.referral_cache.popitem() + referral_connection.unbind() diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/ldifProducer.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/ldifProducer.py new file mode 100644 index 0000000..a39c4d7 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/ldifProducer.py @@ -0,0 +1,152 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from io import StringIO +from os import linesep +import random + +from ..core.exceptions import LDAPLDIFError +from ..utils.conv import prepare_for_stream +from ..protocol.rfc4511 import LDAPMessage, MessageID, ProtocolOp, LDAP_MAX_INT +from ..protocol.rfc2849 import operation_to_ldif, add_ldif_header +from ..protocol.convert import build_controls_list +from .base import BaseStrategy + + +class LdifProducerStrategy(BaseStrategy): + """ + This strategy is used to create the LDIF stream for the Add, Delete, Modify, ModifyDn operations. + You send the request and get the request in the ldif-change representation of the operation. + NO OPERATION IS SENT TO THE LDAP SERVER! + Connection.request will contain the result LDAP message in a dict form + Connection.response will contain the ldif-change format of the requested operation if available + You don't need a real server to connect to for this strategy + """ + + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = True + self.no_real_dsa = True + self.pooled = False + self.can_stream = True + self.line_separator = linesep + self.all_base64 = False + self.stream = None + self.order = dict() + self._header_added = False + random.seed() + + def _open_socket(self, address, use_ssl=False, unix_socket=False): # fake open socket + self.connection.socket = NotImplemented # placeholder for a dummy socket + if self.connection.usage: + self.connection._usage.open_sockets += 1 + + self.connection.closed = False + + def _close_socket(self): + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + self.connection.socket = None + self.connection.closed = True + + def _start_listen(self): + self.connection.listening = True + self.connection.closed = False + self.connection.bound = True + self._header_added = False + if not self.stream or (isinstance(self.stream, StringIO) and self.stream.closed): + self.set_stream(StringIO()) + + def _stop_listen(self): + self.stream.close() + self.connection.listening = False + self.connection.bound = False + self.connection.closed = True + + def receiving(self): + return None + + def send(self, message_type, request, controls=None): + """ + Build the LDAPMessage without sending to server + """ + message_id = random.randint(0, LDAP_MAX_INT) + ldap_message = LDAPMessage() + ldap_message['messageID'] = MessageID(message_id) + ldap_message['protocolOp'] = ProtocolOp().setComponentByName(message_type, request) + message_controls = build_controls_list(controls) + if message_controls is not None: + ldap_message['controls'] = message_controls + + self.connection.request = BaseStrategy.decode_request(message_type, request, controls) + self.connection.request['controls'] = controls + if self._outstanding is None: + self._outstanding = dict() + self._outstanding[message_id] = self.connection.request + return message_id + + def post_send_single_response(self, message_id): + self.connection.response = None + self.connection.result = None + if self._outstanding and message_id in self._outstanding: + request = self._outstanding.pop(message_id) + ldif_lines = operation_to_ldif(self.connection.request['type'], request, self.all_base64, self.order.get(self.connection.request['type'])) + if self.stream and ldif_lines and not self.connection.closed: + self.accumulate_stream(self.line_separator.join(ldif_lines)) + ldif_lines = add_ldif_header(ldif_lines) + self.connection.response = self.line_separator.join(ldif_lines) + return self.connection.response + + return None + + def post_send_search(self, message_id): + raise LDAPLDIFError('LDIF-CONTENT cannot be produced for Search operations') + + def _get_response(self, message_id, timeout): + pass + + def accumulate_stream(self, fragment): + if not self._header_added and self.stream.tell() == 0: + self._header_added = True + header = add_ldif_header(['-'])[0] + self.stream.write(prepare_for_stream(header + self.line_separator + self.line_separator)) + self.stream.write(prepare_for_stream(fragment + self.line_separator + self.line_separator)) + + def get_stream(self): + return self.stream + + def set_stream(self, value): + error = False + try: + if not value.writable(): + error = True + except (ValueError, AttributeError): + error = True + + if error: + raise LDAPLDIFError('stream must be writable') + + self.stream = value diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockAsync.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockAsync.py new file mode 100644 index 0000000..f9965dc --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockAsync.py @@ -0,0 +1,200 @@ +""" +""" + +# Created on 2016.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .. import ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES +from .mockBase import MockBaseStrategy +from .asynchronous import AsyncStrategy +from ..operation.search import search_result_done_response_to_dict, search_result_entry_response_to_dict +from ..core.results import DO_NOT_RAISE_EXCEPTIONS +from ..utils.log import log, log_enabled, ERROR, PROTOCOL +from ..core.exceptions import LDAPResponseTimeoutError, LDAPOperationResult +from ..operation.bind import bind_response_to_dict +from ..operation.delete import delete_response_to_dict +from ..operation.add import add_response_to_dict +from ..operation.compare import compare_response_to_dict +from ..operation.modifyDn import modify_dn_response_to_dict +from ..operation.modify import modify_response_to_dict +from ..operation.search import search_result_done_response_to_dict, search_result_entry_response_to_dict +from ..operation.extended import extended_response_to_dict + +# LDAPResult ::= SEQUENCE { +# resultCode ENUMERATED { +# success (0), +# operationsError (1), +# protocolError (2), +# timeLimitExceeded (3), +# sizeLimitExceeded (4), +# compareFalse (5), +# compareTrue (6), +# authMethodNotSupported (7), +# strongerAuthRequired (8), +# -- 9 reserved -- +# referral (10), +# adminLimitExceeded (11), +# unavailableCriticalExtension (12), +# confidentialityRequired (13), +# saslBindInProgress (14), +# noSuchAttribute (16), +# undefinedAttributeType (17), +# inappropriateMatching (18), +# constraintViolation (19), +# attributeOrValueExists (20), +# invalidAttributeSyntax (21), +# -- 22-31 unused -- +# noSuchObject (32), +# aliasProblem (33), +# invalidDNSyntax (34), +# -- 35 reserved for undefined isLeaf -- +# aliasDereferencingProblem (36), +# -- 37-47 unused -- +# inappropriateAuthentication (48), +# invalidCredentials (49), +# insufficientAccessRights (50), +# busy (51), +# unavailable (52), +# unwillingToPerform (53), +# loopDetect (54), +# -- 55-63 unused -- +# namingViolation (64), +# objectClassViolation (65), +# notAllowedOnNonLeaf (66), +# notAllowedOnRDN (67), +# entryAlreadyExists (68), +# objectClassModsProhibited (69), +# -- 70 reserved for CLDAP -- +# affectsMultipleDSAs (71), +# -- 72-79 unused -- +# other (80), +# ... }, +# matchedDN LDAPDN, +# diagnosticMessage LDAPString, +# referral [3] Referral OPTIONAL } + + +class MockAsyncStrategy(MockBaseStrategy, AsyncStrategy): # class inheritance sequence is important, MockBaseStrategy must be the first one + """ + This strategy create a mock LDAP server, with asynchronous access + It can be useful to test LDAP without accessing a real Server + """ + def __init__(self, ldap_connection): + AsyncStrategy.__init__(self, ldap_connection) + MockBaseStrategy.__init__(self) + #outstanding = dict() # a dictionary with the message id as key and a tuple (result, response) as value + + def post_send_search(self, payload): + message_id, message_type, request, controls = payload + async_response = [] + async_result = dict() + if message_type == 'searchRequest': + responses, result = self.mock_search(request, controls) + result['type'] = 'searchResDone' + for entry in responses: + response = search_result_entry_response_to_dict(entry, self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + response['type'] = 'searchResEntry' + + if self.connection.empty_attributes: + for attribute_type in request['attributes']: + attribute_name = str(attribute_type) + if attribute_name not in response['raw_attributes'] and attribute_name not in (ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES): + response['raw_attributes'][attribute_name] = list() + response['attributes'][attribute_name] = list() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute set to empty list for missing attribute <%s> in <%s>', + attribute_type, self) + if not self.connection.auto_range: + attrs_to_remove = [] + # removes original empty attribute in case a range tag is returned + for attribute_type in response['attributes']: + attribute_name = str(attribute_type) + if ';range' in attribute_name.lower(): + orig_attr, _, _ = attribute_name.partition(';') + attrs_to_remove.append(orig_attr) + for attribute_type in attrs_to_remove: + if log_enabled(PROTOCOL): + log(PROTOCOL, + 'attribute type <%s> removed in response because of same attribute returned as range by the server in <%s>', + attribute_type, self) + del response['raw_attributes'][attribute_type] + del response['attributes'][attribute_type] + + async_response.append(response) + async_result = search_result_done_response_to_dict(result) + async_result['type'] = 'searchResDone' + self._responses[message_id] = (request, async_result, async_response) + return message_id + + def post_send_single_response(self, payload): # payload is a tuple sent by self.send() made of message_type, request, controls + message_id, message_type, request, controls = payload + responses = [] + result = None + if message_type == 'bindRequest': + result = bind_response_to_dict(self.mock_bind(request, controls)) + result['type'] = 'bindResponse' + elif message_type == 'unbindRequest': + self.bound = None + elif message_type == 'abandonRequest': + pass + elif message_type == 'delRequest': + result = delete_response_to_dict(self.mock_delete(request, controls)) + result['type'] = 'delResponse' + elif message_type == 'addRequest': + result = add_response_to_dict(self.mock_add(request, controls)) + result['type'] = 'addResponse' + elif message_type == 'compareRequest': + result = compare_response_to_dict(self.mock_compare(request, controls)) + result['type'] = 'compareResponse' + elif message_type == 'modDNRequest': + result = modify_dn_response_to_dict(self.mock_modify_dn(request, controls)) + result['type'] = 'modDNResponse' + elif message_type == 'modifyRequest': + result = modify_response_to_dict(self.mock_modify(request, controls)) + result['type'] = 'modifyResponse' + elif message_type == 'extendedReq': + result = extended_response_to_dict(self.mock_extended(request, controls)) + result['type'] = 'extendedResp' + responses.append(result) + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + self._responses[message_id] = (request, result, responses) + return message_id + + + def get_response(self, message_id, timeout=None, get_request=False): + if message_id in self._responses: + request, result, response = self._responses.pop(message_id) + else: + raise(LDAPResponseTimeoutError('message id not in outstanding queue')) + + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + if get_request: + return response, result, request + else: + return response, result diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockBase.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockBase.py new file mode 100644 index 0000000..527d9c4 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockBase.py @@ -0,0 +1,921 @@ +""" +""" + +# Created on 2016.04.30 +# +# Author: Giovanni Cannata +# +# Copyright 2016 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import json +import re + +from random import SystemRandom + +from pyasn1.type.univ import OctetString + +from .. import SEQUENCE_TYPES, ALL_ATTRIBUTES +from ..operation.bind import bind_request_to_dict +from ..operation.delete import delete_request_to_dict +from ..operation.add import add_request_to_dict +from ..operation.compare import compare_request_to_dict +from ..operation.modifyDn import modify_dn_request_to_dict +from ..operation.modify import modify_request_to_dict +from ..operation.extended import extended_request_to_dict +from ..operation.search import search_request_to_dict, parse_filter, ROOT, AND, OR, NOT, MATCH_APPROX, \ + MATCH_GREATER_OR_EQUAL, MATCH_LESS_OR_EQUAL, MATCH_EXTENSIBLE, MATCH_PRESENT,\ + MATCH_SUBSTRING, MATCH_EQUAL +from ..utils.conv import json_hook, to_unicode, to_raw +from ..core.exceptions import LDAPDefinitionError, LDAPPasswordIsMandatoryError, LDAPInvalidValueError, LDAPSocketOpenError +from ..core.results import RESULT_SUCCESS, RESULT_OPERATIONS_ERROR, RESULT_UNAVAILABLE_CRITICAL_EXTENSION, \ + RESULT_INVALID_CREDENTIALS, RESULT_NO_SUCH_OBJECT, RESULT_ENTRY_ALREADY_EXISTS, RESULT_COMPARE_TRUE, \ + RESULT_COMPARE_FALSE, RESULT_NO_SUCH_ATTRIBUTE, RESULT_UNWILLING_TO_PERFORM, RESULT_PROTOCOL_ERROR, RESULT_CONSTRAINT_VIOLATION, RESULT_NOT_ALLOWED_ON_RDN +from ..utils.ciDict import CaseInsensitiveDict +from ..utils.dn import to_dn, safe_dn, safe_rdn +from ..protocol.sasl.sasl import validate_simple_password +from ..protocol.formatters.standard import find_attribute_validator, format_attribute_values +from ..protocol.rfc2696 import paged_search_control +from ..utils.log import log, log_enabled, ERROR, BASIC +from ..utils.asn1 import encode +from ..utils.conv import ldap_escape_to_bytes +from ..strategy.base import BaseStrategy # needed for decode_control() method +from ..protocol.rfc4511 import LDAPMessage, ProtocolOp, MessageID +from ..protocol.convert import build_controls_list + + +# LDAPResult ::= SEQUENCE { +# resultCode ENUMERATED { +# success (0), +# operationsError (1), +# protocolError (2), +# timeLimitExceeded (3), +# sizeLimitExceeded (4), +# compareFalse (5), +# compareTrue (6), +# authMethodNotSupported (7), +# strongerAuthRequired (8), +# -- 9 reserved -- +# referral (10), +# adminLimitExceeded (11), +# unavailableCriticalExtension (12), +# confidentialityRequired (13), +# saslBindInProgress (14), +# noSuchAttribute (16), +# undefinedAttributeType (17), +# inappropriateMatching (18), +# constraintViolation (19), +# attributeOrValueExists (20), +# invalidAttributeSyntax (21), +# -- 22-31 unused -- +# noSuchObject (32), +# aliasProblem (33), +# invalidDNSyntax (34), +# -- 35 reserved for undefined isLeaf -- +# aliasDereferencingProblem (36), +# -- 37-47 unused -- +# inappropriateAuthentication (48), +# invalidCredentials (49), +# insufficientAccessRights (50), +# busy (51), +# unavailable (52), +# unwillingToPerform (53), +# loopDetect (54), +# -- 55-63 unused -- +# namingViolation (64), +# objectClassViolation (65), +# notAllowedOnNonLeaf (66), +# notAllowedOnRDN (67), +# entryAlreadyExists (68), +# objectClassModsProhibited (69), +# -- 70 reserved for CLDAP -- +# affectsMultipleDSAs (71), +# -- 72-79 unused -- +# other (80), +# ... }, +# matchedDN LDAPDN, +# diagnosticMessage LDAPString, +# referral [3] Referral OPTIONAL } + +# noinspection PyProtectedMember,PyUnresolvedReferences + +SEARCH_CONTROLS = ['1.2.840.113556.1.4.319' # simple paged search [RFC 2696] + ] +SERVER_ENCODING = 'utf-8' + + +def random_cookie(): + return to_raw(SystemRandom().random())[-6:] + + +class PagedSearchSet(object): + def __init__(self, response, size, criticality): + self.size = size + self.response = response + self.cookie = None + self.sent = 0 + self.done = False + + def next(self, size=None): + if size: + self.size=size + + message = '' + response = self.response[self.sent: self.sent + self.size] + self.sent += self.size + if self.sent > len(self.response): + self.done = True + self.cookie = '' + else: + self.cookie = random_cookie() + + response_control = paged_search_control(False, len(self.response), self.cookie) + result = {'resultCode': RESULT_SUCCESS, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None, + 'controls': [BaseStrategy.decode_control(response_control)] + } + return response, result + + +class MockBaseStrategy(object): + """ + Base class for connection strategy + """ + + def __init__(self): + if not hasattr(self.connection.server, 'dit'): # create entries dict if not already present + self.connection.server.dit = CaseInsensitiveDict() + self.entries = self.connection.server.dit # for simpler reference + self.no_real_dsa = True + self.bound = None + self.custom_validators = None + self.operational_attributes = ['entryDN'] + self.add_entry('cn=schema', [], validate=False) # add default entry for schema + self._paged_sets = [] # list of paged search in progress + if log_enabled(BASIC): + log(BASIC, 'instantiated <%s>: <%s>', self.__class__.__name__, self) + + def _start_listen(self): + self.connection.listening = True + self.connection.closed = False + if self.connection.usage: + self.connection._usage.open_sockets += 1 + + def _stop_listen(self): + self.connection.listening = False + self.connection.closed = True + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + def _prepare_value(self, attribute_type, value, validate=True): + """ + Prepare a value for being stored in the mock DIT + :param value: object to store + :return: raw value to store in the DIT + """ + if validate: # if loading from json dump do not validate values: + validator = find_attribute_validator(self.connection.server.schema, attribute_type, self.custom_validators) + validated = validator(value) + if validated is False: + raise LDAPInvalidValueError('value non valid for attribute \'%s\'' % attribute_type) + elif validated is not True: # a valid LDAP value equivalent to the actual value + value = validated + raw_value = to_raw(value) + if not isinstance(raw_value, bytes): + raise LDAPInvalidValueError('The value "%s" of type %s for "%s" must be bytes or an offline schema needs to be provided when Mock strategy is used.' % ( + value, + type(value), + attribute_type, + )) + return raw_value + + def _update_attribute(self, dn, attribute_type, value): + pass + + def add_entry(self, dn, attributes, validate=True): + with self.connection.server.dit_lock: + escaped_dn = safe_dn(dn) + if escaped_dn not in self.connection.server.dit: + new_entry = CaseInsensitiveDict() + for attribute in attributes: + if attribute in self.operational_attributes: # no restore of operational attributes, should be computed at runtime + continue + if not isinstance(attributes[attribute], SEQUENCE_TYPES): # entry attributes are always lists of bytes values + attributes[attribute] = [attributes[attribute]] + if self.connection.server.schema and self.connection.server.schema.attribute_types[attribute].single_value and len(attributes[attribute]) > 1: # multiple values in single-valued attribute + return False + if attribute.lower() == 'objectclass' and self.connection.server.schema: # builds the objectClass hierarchy only if schema is present + class_set = set() + for object_class in attributes[attribute]: + if self.connection.server.schema.object_classes and object_class not in self.connection.server.schema.object_classes: + return False + # walkups the class hierarchy and buils a set of all classes in it + class_set.add(object_class) + class_set_size = 0 + while class_set_size != len(class_set): + new_classes = set() + class_set_size = len(class_set) + for class_name in class_set: + if self.connection.server.schema.object_classes[class_name].superior: + new_classes.update(self.connection.server.schema.object_classes[class_name].superior) + class_set.update(new_classes) + new_entry['objectClass'] = [to_raw(value) for value in class_set] + else: + new_entry[attribute] = [self._prepare_value(attribute, value, validate) for value in attributes[attribute]] + for rdn in safe_rdn(escaped_dn, decompose=True): # adds rdns to entry attributes + if rdn[0] not in new_entry: # if rdn attribute is missing adds attribute and its value + new_entry[rdn[0]] = [to_raw(rdn[1])] + else: + raw_rdn = to_raw(rdn[1]) + if raw_rdn not in new_entry[rdn[0]]: # add rdn value if rdn attribute is present but value is missing + new_entry[rdn[0]].append(raw_rdn) + new_entry['entryDN'] = [to_raw(escaped_dn)] + self.connection.server.dit[escaped_dn] = new_entry + return True + return False + + def remove_entry(self, dn): + with self.connection.server.dit_lock: + escaped_dn = safe_dn(dn) + if escaped_dn in self.connection.server.dit: + del self.connection.server.dit[escaped_dn] + return True + return False + + def entries_from_json(self, json_entry_file): + target = open(json_entry_file, 'r') + definition = json.load(target, object_hook=json_hook) + if 'entries' not in definition: + self.connection.last_error = 'invalid JSON definition, missing "entries" section' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + if not self.connection.server.dit: + self.connection.server.dit = CaseInsensitiveDict() + for entry in definition['entries']: + if 'raw' not in entry: + self.connection.last_error = 'invalid JSON definition, missing "raw" section' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + if 'dn' not in entry: + self.connection.last_error = 'invalid JSON definition, missing "dn" section' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + self.add_entry(entry['dn'], entry['raw'], validate=False) + target.close() + + def mock_bind(self, request_message, controls): + # BindRequest ::= [APPLICATION 0] SEQUENCE { + # version INTEGER (1 .. 127), + # name LDAPDN, + # authentication AuthenticationChoice } + # + # BindResponse ::= [APPLICATION 1] SEQUENCE { + # COMPONENTS OF LDAPResult, + # serverSaslCreds [7] OCTET STRING OPTIONAL } + # + # request: version, name, authentication + # response: LDAPResult + serverSaslCreds + request = bind_request_to_dict(request_message) + identity = request['name'] + if 'simple' in request['authentication']: + try: + password = validate_simple_password(request['authentication']['simple']) + except LDAPPasswordIsMandatoryError: + password = '' + identity = '' + else: + self.connection.last_error = 'only Simple Bind allowed in Mock strategy' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + # checks userPassword for password. userPassword must be a text string or a list of text strings + if identity in self.connection.server.dit: + if 'userPassword' in self.connection.server.dit[identity]: + # if self.connection.server.dit[identity]['userPassword'] == password or password in self.connection.server.dit[identity]['userPassword']: + if self.equal(identity, 'userPassword', password): + result_code = RESULT_SUCCESS + message = '' + self.bound = identity + else: + result_code = RESULT_INVALID_CREDENTIALS + message = 'invalid credentials' + else: # no user found, returns invalidCredentials + result_code = RESULT_INVALID_CREDENTIALS + message = 'missing userPassword attribute' + elif identity == '': + result_code = RESULT_SUCCESS + message = '' + self.bound = identity + else: + result_code = RESULT_INVALID_CREDENTIALS + message = 'missing object' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None, + 'serverSaslCreds': None + } + + def mock_delete(self, request_message, controls): + # DelRequest ::= [APPLICATION 10] LDAPDN + # + # DelResponse ::= [APPLICATION 11] LDAPResult + # + # request: entry + # response: LDAPResult + request = delete_request_to_dict(request_message) + dn = safe_dn(request['entry']) + if dn in self.connection.server.dit: + del self.connection.server.dit[dn] + result_code = RESULT_SUCCESS + message = '' + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_add(self, request_message, controls): + # AddRequest ::= [APPLICATION 8] SEQUENCE { + # entry LDAPDN, + # attributes AttributeList } + # + # AddResponse ::= [APPLICATION 9] LDAPResult + # + # request: entry, attributes + # response: LDAPResult + request = add_request_to_dict(request_message) + dn = safe_dn(request['entry']) + attributes = request['attributes'] + # converts attributes values to bytes + + if dn not in self.connection.server.dit: + if self.add_entry(dn, attributes): + result_code = RESULT_SUCCESS + message = '' + else: + result_code = RESULT_OPERATIONS_ERROR + message = 'error adding entry' + else: + result_code = RESULT_ENTRY_ALREADY_EXISTS + message = 'entry already exist' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_compare(self, request_message, controls): + # CompareRequest ::= [APPLICATION 14] SEQUENCE { + # entry LDAPDN, + # ava AttributeValueAssertion } + # + # CompareResponse ::= [APPLICATION 15] LDAPResult + # + # request: entry, attribute, value + # response: LDAPResult + request = compare_request_to_dict(request_message) + dn = safe_dn(request['entry']) + attribute = request['attribute'] + value = to_raw(request['value']) + if dn in self.connection.server.dit: + if attribute in self.connection.server.dit[dn]: + if self.equal(dn, attribute, value): + result_code = RESULT_COMPARE_TRUE + message = '' + else: + result_code = RESULT_COMPARE_FALSE + message = '' + else: + result_code = RESULT_NO_SUCH_ATTRIBUTE + message = 'attribute not found' + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_modify_dn(self, request_message, controls): + # ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { + # entry LDAPDN, + # newrdn RelativeLDAPDN, + # deleteoldrdn BOOLEAN, + # newSuperior [0] LDAPDN OPTIONAL } + # + # ModifyDNResponse ::= [APPLICATION 13] LDAPResult + # + # request: entry, newRdn, deleteOldRdn, newSuperior + # response: LDAPResult + request = modify_dn_request_to_dict(request_message) + dn = safe_dn(request['entry']) + new_rdn = request['newRdn'] + delete_old_rdn = request['deleteOldRdn'] + new_superior = safe_dn(request['newSuperior']) if request['newSuperior'] else '' + dn_components = to_dn(dn) + if dn in self.connection.server.dit: + if new_superior and new_rdn: # performs move in the DIT + new_dn = safe_dn(dn_components[0] + ',' + new_superior) + self.connection.server.dit[new_dn] = self.connection.server.dit[dn].copy() + moved_entry = self.connection.server.dit[new_dn] + if delete_old_rdn: + del self.connection.server.dit[dn] + result_code = RESULT_SUCCESS + message = 'entry moved' + moved_entry['entryDN'] = [to_raw(new_dn)] + elif new_rdn and not new_superior: # performs rename + new_dn = safe_dn(new_rdn + ',' + safe_dn(dn_components[1:])) + self.connection.server.dit[new_dn] = self.connection.server.dit[dn].copy() + renamed_entry = self.connection.server.dit[new_dn] + del self.connection.server.dit[dn] + renamed_entry['entryDN'] = [to_raw(new_dn)] + + for rdn in safe_rdn(new_dn, decompose=True): # adds rdns to entry attributes + renamed_entry[rdn[0]] = [to_raw(rdn[1])] + + result_code = RESULT_SUCCESS + message = 'entry rdn renamed' + else: + result_code = RESULT_UNWILLING_TO_PERFORM + message = 'newRdn or newSuperior missing' + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_modify(self, request_message, controls): + # ModifyRequest ::= [APPLICATION 6] SEQUENCE { + # object LDAPDN, + # changes SEQUENCE OF change SEQUENCE { + # operation ENUMERATED { + # add (0), + # delete (1), + # replace (2), + # ... }, + # modification PartialAttribute } } + # + # ModifyResponse ::= [APPLICATION 7] LDAPResult + # + # request: entry, changes + # response: LDAPResult + # + # changes is a dictionary in the form {'attribute': [(operation, [val1, ...]), ...], ...} + # operation is 0 (add), 1 (delete), 2 (replace), 3 (increment) + request = modify_request_to_dict(request_message) + dn = safe_dn(request['entry']) + changes = request['changes'] + result_code = 0 + message = '' + rdns = [rdn[0] for rdn in safe_rdn(dn, decompose=True)] + if dn in self.connection.server.dit: + entry = self.connection.server.dit[dn] + original_entry = entry.copy() # to preserve atomicity of operation + for modification in changes: + operation = modification['operation'] + attribute = modification['attribute']['type'] + elements = modification['attribute']['value'] + if operation == 0: # add + if attribute not in entry and elements: # attribute not present, creates the new attribute and add elements + if self.connection.server.schema and self.connection.server.schema.attribute_types and self.connection.server.schema.attribute_types[attribute].single_value and len(elements) > 1: # multiple values in single-valued attribute + result_code = RESULT_CONSTRAINT_VIOLATION + message = 'attribute is single-valued' + else: + entry[attribute] = [to_raw(element) for element in elements] + else: # attribute present, adds elements to current values + if self.connection.server.schema and self.connection.server.schema.attribute_types and self.connection.server.schema.attribute_types[attribute].single_value: # multiple values in single-valued attribute + result_code = RESULT_CONSTRAINT_VIOLATION + message = 'attribute is single-valued' + else: + entry[attribute].extend([to_raw(element) for element in elements]) + elif operation == 1: # delete + if attribute not in entry: # attribute must exist + result_code = RESULT_NO_SUCH_ATTRIBUTE + message = 'attribute must exists for deleting its values' + elif attribute in rdns: # attribute can't be used in dn + result_code = RESULT_NOT_ALLOWED_ON_RDN + message = 'cannot delete an rdn' + else: + if not elements: # deletes whole attribute if element list is empty + del entry[attribute] + else: + for element in elements: + raw_element = to_raw(element) + if self.equal(dn, attribute, raw_element): # removes single element + entry[attribute].remove(raw_element) + else: + result_code = 1 + message = 'value to delete not found' + if not entry[attribute]: # removes the whole attribute if no elements remained + del entry[attribute] + elif operation == 2: # replace + if attribute not in entry and elements: # attribute not present, creates the new attribute and add elements + if self.connection.server.schema and self.connection.server.schema.attribute_types and self.connection.server.schema.attribute_types[attribute].single_value and len(elements) > 1: # multiple values in single-valued attribute + result_code = RESULT_CONSTRAINT_VIOLATION + message = 'attribute is single-valued' + else: + entry[attribute] = [to_raw(element) for element in elements] + elif not elements and attribute in rdns: # attribute can't be used in dn + result_code = RESULT_NOT_ALLOWED_ON_RDN + message = 'cannot replace an rdn' + elif not elements: # deletes whole attribute if element list is empty + if attribute in entry: + del entry[attribute] + else: # substitutes elements + entry[attribute] = [to_raw(element) for element in elements] + elif operation == 3: # increment + if attribute not in entry: # attribute must exist + result_code = RESULT_NO_SUCH_ATTRIBUTE + message = 'attribute must exists for incrementing its values' + else: + if len(elements) != 1: + result_code = RESULT_PROTOCOL_ERROR + message = 'only one increment value is allowed' + else: + try: + entry[attribute] = [bytes(str(int(value) + int(elements[0])), encoding='utf-8') for value in entry[attribute]] + except: + result_code = RESULT_UNWILLING_TO_PERFORM + message = 'unable to increment value' + + if result_code: # an error has happened, restores the original dn + self.connection.server.dit[dn] = original_entry + else: + result_code = RESULT_NO_SUCH_OBJECT + message = 'object not found' + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + def mock_search(self, request_message, controls): + # SearchRequest ::= [APPLICATION 3] SEQUENCE { + # baseObject LDAPDN, + # scope ENUMERATED { + # baseObject (0), + # singleLevel (1), + # wholeSubtree (2), + # ... }, + # derefAliases ENUMERATED { + # neverDerefAliases (0), + # derefInSearching (1), + # derefFindingBaseObj (2), + # derefAlways (3) }, + # sizeLimit INTEGER (0 .. maxInt), + # timeLimit INTEGER (0 .. maxInt), + # typesOnly BOOLEAN, + # filter Filter, + # attributes AttributeSelection } + # + # SearchResultEntry ::= [APPLICATION 4] SEQUENCE { + # objectName LDAPDN, + # attributes PartialAttributeList } + # + # + # SearchResultReference ::= [APPLICATION 19] SEQUENCE + # SIZE (1..MAX) OF uri URI + # + # SearchResultDone ::= [APPLICATION 5] LDAPResult + # + # request: base, scope, dereferenceAlias, sizeLimit, timeLimit, typesOnly, filter, attributes + # response_entry: object, attributes + # response_done: LDAPResult + request = search_request_to_dict(request_message) + if controls: + decoded_controls = [self.decode_control(control) for control in controls if control] + for decoded_control in decoded_controls: + if decoded_control[1]['criticality'] and decoded_control[0] not in SEARCH_CONTROLS: + message = 'Critical requested control ' + str(decoded_control[0]) + ' not available' + result = {'resultCode': RESULT_UNAVAILABLE_CRITICAL_EXTENSION, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + return [], result + elif decoded_control[0] == '1.2.840.113556.1.4.319': # Simple paged search + if not decoded_control[1]['value']['cookie']: # new paged search + response, result = self._execute_search(request) + if result['resultCode'] == RESULT_SUCCESS: # success + paged_set = PagedSearchSet(response, int(decoded_control[1]['value']['size']), decoded_control[1]['criticality']) + response, result = paged_set.next() + if paged_set.done: # paged search already completed, no need to store the set + del paged_set + else: + self._paged_sets.append(paged_set) + return response, result + else: + return [], result + else: + for paged_set in self._paged_sets: + if paged_set.cookie == decoded_control[1]['value']['cookie']: # existing paged set + response, result = paged_set.next() # returns next bunch of entries as per paged set specifications + if paged_set.done: + self._paged_sets.remove(paged_set) + return response, result + # paged set not found + message = 'Invalid cookie in simple paged search' + result = {'resultCode': RESULT_OPERATIONS_ERROR, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + return [], result + + else: + return self._execute_search(request) + + def _execute_search(self, request): + responses = [] + base = safe_dn(request['base']) + scope = request['scope'] + attributes = request['attributes'] + if '+' in attributes: # operational attributes requested + attributes.extend(self.operational_attributes) + attributes.remove('+') + + attributes = [attr.lower() for attr in request['attributes']] + + filter_root = parse_filter(request['filter'], self.connection.server.schema, auto_escape=True, auto_encode=False, validator=self.connection.server.custom_validator, check_names=self.connection.check_names) + candidates = [] + if scope == 0: # base object + if base in self.connection.server.dit or base.lower() == 'cn=schema': + candidates.append(base) + elif scope == 1: # single level + for entry in self.connection.server.dit: + if entry.lower().endswith(base.lower()) and ',' not in entry[:-len(base) - 1]: # only leafs without commas in the remaining dn + candidates.append(entry) + elif scope == 2: # whole subtree + for entry in self.connection.server.dit: + if entry.lower().endswith(base.lower()): + candidates.append(entry) + + if not candidates: # incorrect base + result_code = RESULT_NO_SUCH_OBJECT + message = 'incorrect base object' + else: + matched = self.evaluate_filter_node(filter_root, candidates) + if self.connection.raise_exceptions and 0 < request['sizeLimit'] < len(matched): + result_code = 4 + message = 'size limit exceeded' + else: + for match in matched: + responses.append({ + 'object': match, + 'attributes': [{'type': attribute, + 'vals': [] if request['typesOnly'] else self.connection.server.dit[match][attribute]} + for attribute in self.connection.server.dit[match] + if attribute.lower() in attributes or ALL_ATTRIBUTES in attributes] + }) + if '+' not in attributes: # remove operational attributes + for op_attr in self.operational_attributes: + if op_attr.lower() in attributes: + # if the op_attr was explicitly requested, then keep it + continue + for i, attr in enumerate(responses[len(responses)-1]['attributes']): + if attr['type'] == op_attr: + del responses[len(responses)-1]['attributes'][i] + result_code = 0 + message = '' + + result = {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None + } + + return responses[:request['sizeLimit']] if request['sizeLimit'] > 0 else responses, result + + def mock_extended(self, request_message, controls): + # ExtendedRequest ::= [APPLICATION 23] SEQUENCE { + # requestName [0] LDAPOID, + # requestValue [1] OCTET STRING OPTIONAL } + # + # ExtendedResponse ::= [APPLICATION 24] SEQUENCE { + # COMPONENTS OF LDAPResult, + # responseName [10] LDAPOID OPTIONAL, + # responseValue [11] OCTET STRING OPTIONAL } + # + # IntermediateResponse ::= [APPLICATION 25] SEQUENCE { + # responseName [0] LDAPOID OPTIONAL, + # responseValue [1] OCTET STRING OPTIONAL } + request = extended_request_to_dict(request_message) + + result_code = RESULT_UNWILLING_TO_PERFORM + message = 'not implemented' + response_name = None + response_value = None + if self.connection.server.info: + for extension in self.connection.server.info.supported_extensions: + if request['name'] == extension[0]: # server can answer the extended request + if extension[0] == '2.16.840.1.113719.1.27.100.31': # getBindDNRequest [NOVELL] + result_code = 0 + message = '' + response_name = OctetString('2.16.840.1.113719.1.27.100.32') # getBindDNResponse [NOVELL] + response_value = OctetString(self.bound) + elif extension[0] == '1.3.6.1.4.1.4203.1.11.3': # WhoAmI [RFC4532] + result_code = 0 + message = '' + response_name = OctetString('1.3.6.1.4.1.4203.1.11.3') # WhoAmI [RFC4532] + response_value = OctetString(self.bound) + break + + return {'resultCode': result_code, + 'matchedDN': '', + 'diagnosticMessage': to_unicode(message, SERVER_ENCODING), + 'referral': None, + 'responseName': response_name, + 'responseValue': response_value + } + + def evaluate_filter_node(self, node, candidates): + """After evaluation each 2 sets are added to each MATCH node, one for the matched object and one for unmatched object. + The unmatched object set is needed if a superior node is a NOT that reverts the evaluation. The BOOLEAN nodes mix the sets + returned by the MATCH nodes""" + node.matched = set() + node.unmatched = set() + + if node.elements: + for element in node.elements: + self.evaluate_filter_node(element, candidates) + + if node.tag == ROOT: + return node.elements[0].matched + elif node.tag == AND: + first_element = node.elements[0] + node.matched.update(first_element.matched) + node.unmatched.update(first_element.unmatched) + + for element in node.elements[1:]: + node.matched.intersection_update(element.matched) + node.unmatched.intersection_update(element.unmatched) + elif node.tag == OR: + for element in node.elements: + node.matched.update(element.matched) + node.unmatched.update(element.unmatched) + elif node.tag == NOT: + node.matched = node.elements[0].unmatched + node.unmatched = node.elements[0].matched + elif node.tag == MATCH_GREATER_OR_EQUAL: + attr_name = node.assertion['attr'] + attr_value = node.assertion['value'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + for value in self.connection.server.dit[candidate][attr_name]: + if value.isdigit() and attr_value.isdigit(): # int comparison + if int(value) >= int(attr_value): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + else: + if to_unicode(value, SERVER_ENCODING).lower() >= to_unicode(attr_value, SERVER_ENCODING).lower(): # case insensitive string comparison + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_LESS_OR_EQUAL: + attr_name = node.assertion['attr'] + attr_value = node.assertion['value'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + for value in self.connection.server.dit[candidate][attr_name]: + if value.isdigit() and attr_value.isdigit(): # int comparison + if int(value) <= int(attr_value): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + else: + if to_unicode(value, SERVER_ENCODING).lower() <= to_unicode(attr_value, SERVER_ENCODING).lower(): # case insentive string comparison + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_EXTENSIBLE: + self.connection.last_error = 'Extensible match not allowed in Mock strategy' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPDefinitionError(self.connection.last_error) + elif node.tag == MATCH_PRESENT: + attr_name = node.assertion['attr'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_SUBSTRING: + attr_name = node.assertion['attr'] + # rebuild the original substring filter + if 'initial' in node.assertion and node.assertion['initial'] is not None: + substring_filter = re.escape(to_unicode(node.assertion['initial'], SERVER_ENCODING)) + else: + substring_filter = '' + + if 'any' in node.assertion and node.assertion['any'] is not None: + for middle in node.assertion['any']: + substring_filter += '.*' + re.escape(to_unicode(middle, SERVER_ENCODING)) + + if 'final' in node.assertion and node.assertion['final'] is not None: + substring_filter += '.*' + re.escape(to_unicode(node.assertion['final'], SERVER_ENCODING)) + + if substring_filter and not node.assertion.get('any', None) and not node.assertion.get('final', None): # only initial, adds .* + substring_filter += '.*' + + regex_filter = re.compile(substring_filter, flags=re.UNICODE | re.IGNORECASE) # unicode AND ignorecase + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate]: + for value in self.connection.server.dit[candidate][attr_name]: + if regex_filter.match(to_unicode(value, SERVER_ENCODING)): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + else: + node.unmatched.add(candidate) + elif node.tag == MATCH_EQUAL or node.tag == MATCH_APPROX: + attr_name = node.assertion['attr'] + attr_value = node.assertion['value'] + for candidate in candidates: + if attr_name in self.connection.server.dit[candidate] and self.equal(candidate, attr_name, attr_value): + node.matched.add(candidate) + else: + node.unmatched.add(candidate) + + def equal(self, dn, attribute_type, value_to_check): + # value is the value to match + attribute_values = self.connection.server.dit[dn][attribute_type] + if not isinstance(attribute_values, SEQUENCE_TYPES): + attribute_values = [attribute_values] + escaped_value_to_check = ldap_escape_to_bytes(value_to_check) + for attribute_value in attribute_values: + if self._check_equality(escaped_value_to_check, attribute_value): + return True + if self._check_equality(self._prepare_value(attribute_type, value_to_check), attribute_value): + return True + return False + + @staticmethod + def _check_equality(value1, value2): + if value1 == value2: # exact matching + return True + if str(value1).isdigit() and str(value2).isdigit(): + if int(value1) == int(value2): # int comparison + return True + try: + if to_unicode(value1, SERVER_ENCODING).lower() == to_unicode(value2, SERVER_ENCODING).lower(): # case insensitive comparison + return True + except UnicodeError: + pass + + return False + + def send(self, message_type, request, controls=None): + self.connection.request = self.decode_request(message_type, request, controls) + if self.connection.listening: + message_id = self.connection.server.next_message_id() + if self.connection.usage: # ldap message is built for updating metrics only + ldap_message = LDAPMessage() + ldap_message['messageID'] = MessageID(message_id) + ldap_message['protocolOp'] = ProtocolOp().setComponentByName(message_type, request) + message_controls = build_controls_list(controls) + if message_controls is not None: + ldap_message['controls'] = message_controls + asn1_request = BaseStrategy.decode_request(message_type, request, controls) + self.connection._usage.update_transmitted_message(asn1_request, len(encode(ldap_message))) + return message_id, message_type, request, controls + else: + self.connection.last_error = 'unable to send message, connection is not open' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketOpenError(self.connection.last_error) + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockSync.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockSync.py new file mode 100644 index 0000000..efd2c15 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/mockSync.py @@ -0,0 +1,133 @@ +""" +""" + +# Created on 2014.11.17 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from ..core.results import DO_NOT_RAISE_EXCEPTIONS +from .mockBase import MockBaseStrategy +from .. import ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES +from .sync import SyncStrategy +from ..operation.bind import bind_response_to_dict +from ..operation.delete import delete_response_to_dict +from ..operation.add import add_response_to_dict +from ..operation.compare import compare_response_to_dict +from ..operation.modifyDn import modify_dn_response_to_dict +from ..operation.modify import modify_response_to_dict +from ..operation.search import search_result_done_response_to_dict, search_result_entry_response_to_dict +from ..operation.extended import extended_response_to_dict +from ..core.exceptions import LDAPSocketOpenError, LDAPOperationResult +from ..utils.log import log, log_enabled, ERROR, PROTOCOL + + +class MockSyncStrategy(MockBaseStrategy, SyncStrategy): # class inheritance sequence is important, MockBaseStrategy must be the first one + """ + This strategy create a mock LDAP server, with synchronous access + It can be useful to test LDAP without accessing a real Server + """ + def __init__(self, ldap_connection): + SyncStrategy.__init__(self, ldap_connection) + MockBaseStrategy.__init__(self) + + def post_send_search(self, payload): + message_id, message_type, request, controls = payload + self.connection.response = [] + self.connection.result = dict() + if message_type == 'searchRequest': + responses, result = self.mock_search(request, controls) + for entry in responses: + response = search_result_entry_response_to_dict(entry, self.connection.server.schema, self.connection.server.custom_formatter, self.connection.check_names) + response['type'] = 'searchResEntry' + ### + if self.connection.empty_attributes: + for attribute_type in request['attributes']: + attribute_name = str(attribute_type) + if attribute_name not in response['raw_attributes'] and attribute_name not in (ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES): + response['raw_attributes'][attribute_name] = list() + response['attributes'][attribute_name] = list() + if log_enabled(PROTOCOL): + log(PROTOCOL, 'attribute set to empty list for missing attribute <%s> in <%s>', + attribute_type, self) + if not self.connection.auto_range: + attrs_to_remove = [] + # removes original empty attribute in case a range tag is returned + for attribute_type in response['attributes']: + attribute_name = str(attribute_type) + if ';range' in attribute_name.lower(): + orig_attr, _, _ = attribute_name.partition(';') + attrs_to_remove.append(orig_attr) + for attribute_type in attrs_to_remove: + if log_enabled(PROTOCOL): + log(PROTOCOL, + 'attribute type <%s> removed in response because of same attribute returned as range by the server in <%s>', + attribute_type, self) + del response['raw_attributes'][attribute_type] + del response['attributes'][attribute_type] + ### + self.connection.response.append(response) + result = search_result_done_response_to_dict(result) + result['type'] = 'searchResDone' + self.connection.result = result + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + + return self.connection.response + + def post_send_single_response(self, payload): # payload is a tuple sent by self.send() made of message_type, request, controls + message_id, message_type, request, controls = payload + responses = [] + result = None + if message_type == 'bindRequest': + result = bind_response_to_dict(self.mock_bind(request, controls)) + result['type'] = 'bindResponse' + elif message_type == 'unbindRequest': + self.bound = None + elif message_type == 'abandonRequest': + pass + elif message_type == 'delRequest': + result = delete_response_to_dict(self.mock_delete(request, controls)) + result['type'] = 'delResponse' + elif message_type == 'addRequest': + result = add_response_to_dict(self.mock_add(request, controls)) + result['type'] = 'addResponse' + elif message_type == 'compareRequest': + result = compare_response_to_dict(self.mock_compare(request, controls)) + result['type'] = 'compareResponse' + elif message_type == 'modDNRequest': + result = modify_dn_response_to_dict(self.mock_modify_dn(request, controls)) + result['type'] = 'modDNResponse' + elif message_type == 'modifyRequest': + result = modify_response_to_dict(self.mock_modify(request, controls)) + result['type'] = 'modifyResponse' + elif message_type == 'extendedReq': + result = extended_response_to_dict(self.mock_extended(request, controls)) + result['type'] = 'extendedResp' + self.connection.result = result + responses.append(result) + if self.connection.raise_exceptions and result and result['result'] not in DO_NOT_RAISE_EXCEPTIONS: + if log_enabled(PROTOCOL): + log(PROTOCOL, 'operation result <%s> for <%s>', result, self.connection) + raise LDAPOperationResult(result=result['result'], description=result['description'], dn=result['dn'], message=result['message'], response_type=result['type']) + return responses + diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/restartable.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/restartable.py new file mode 100644 index 0000000..55f1706 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/restartable.py @@ -0,0 +1,260 @@ +""" +""" + +# Created on 2014.03.04 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from time import sleep +import socket + +from .. import get_config_parameter +from .sync import SyncStrategy +from ..core.exceptions import LDAPSocketOpenError, LDAPOperationResult, LDAPMaximumRetriesError, LDAPStartTLSError +from ..utils.log import log, log_enabled, ERROR, BASIC + + +# noinspection PyBroadException,PyProtectedMember +class RestartableStrategy(SyncStrategy): + def __init__(self, ldap_connection): + SyncStrategy.__init__(self, ldap_connection) + self.sync = True + self.no_real_dsa = False + self.pooled = False + self.can_stream = False + self.restartable_sleep_time = get_config_parameter('RESTARTABLE_SLEEPTIME') + self.restartable_tries = get_config_parameter('RESTARTABLE_TRIES') + self._restarting = False + self._last_bind_controls = None + self._current_message_type = None + self._current_request = None + self._current_controls = None + self._restart_tls = None + self.exception_history = [] + + def open(self, reset_usage=False, read_server_info=True): + SyncStrategy.open(self, reset_usage, read_server_info) + + def _open_socket(self, address, use_ssl=False, unix_socket=False): + """ + Try to open and connect a socket to a Server + raise LDAPExceptionError if unable to open or connect socket + if connection is restartable tries for the number of restarting requested or forever + """ + try: + SyncStrategy._open_socket(self, address, use_ssl, unix_socket) # try to open socket using SyncWait + self._reset_exception_history() + return + except Exception as e: # machinery for restartable connection + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + + if not self._restarting: # if not already performing a restart + self._restarting = True + counter = self.restartable_tries + while counter > 0: # includes restartable_tries == True + if log_enabled(BASIC): + log(BASIC, 'try #%d to open Restartable connection <%s>', self.restartable_tries - counter, self.connection) + sleep(self.restartable_sleep_time) + if not self.connection.closed: + try: # resetting connection + self.connection.unbind() + except (socket.error, LDAPSocketOpenError): # don't trace catch socket errors because socket could already be closed + pass + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + try: # reissuing same operation + if self.connection.server_pool: + new_server = self.connection.server_pool.get_server(self.connection) # get a server from the server_pool if available + if self.connection.server != new_server: + self.connection.server = new_server + if self.connection.usage: + self.connection._usage.servers_from_pool += 1 + SyncStrategy._open_socket(self, address, use_ssl, unix_socket) # calls super (not restartable) _open_socket() + if self.connection.usage: + self.connection._usage.restartable_successes += 1 + self.connection.closed = False + self._restarting = False + self._reset_exception_history() + return + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if self.connection.usage: + self.connection._usage.restartable_failures += 1 + if not isinstance(self.restartable_tries, bool): + counter -= 1 + self._restarting = False + self.connection.last_error = 'restartable connection strategy failed while opening socket' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPMaximumRetriesError(self.connection.last_error, self.exception_history, self.restartable_tries) + + def send(self, message_type, request, controls=None): + self._current_message_type = message_type + self._current_request = request + self._current_controls = controls + if not self._restart_tls: # RFCs doesn't define how to stop tls once started + self._restart_tls = self.connection.tls_started + if message_type == 'bindRequest': # stores controls used in bind operation to be used again when restarting the connection + self._last_bind_controls = controls + + try: + message_id = SyncStrategy.send(self, message_type, request, controls) # tries to send using SyncWait + self._reset_exception_history() + return message_id + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if not self._restarting: # machinery for restartable connection + self._restarting = True + counter = self.restartable_tries + while counter > 0: + if log_enabled(BASIC): + log(BASIC, 'try #%d to send in Restartable connection <%s>', self.restartable_tries - counter, self.connection) + sleep(self.restartable_sleep_time) + if not self.connection.closed: + try: # resetting connection + self.connection.unbind() + except (socket.error, LDAPSocketOpenError): # don't trace socket errors because socket could already be closed + pass + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + failure = False + try: # reopening connection + self.connection.open(reset_usage=False, read_server_info=False) + if self._restart_tls: # restart tls if start_tls was previously used + if not self.connection.start_tls(read_server_info=False): + error = 'restart tls in restartable not successful' + (' - ' + self.connection.last_error if self.connection.last_error else '') + if log_enabled(ERROR): + log(ERROR, '%s for <%s>', error, self) + self.connection.unbind() + raise LDAPStartTLSError(error) + if message_type != 'bindRequest': + self.connection.bind(read_server_info=False, controls=self._last_bind_controls) # binds with previously used controls unless the request is already a bindRequest + if not self.connection.server.schema and not self.connection.server.info: + self.connection.refresh_server_info() + else: + self.connection._fire_deferred(read_info=False) # in case of lazy connection, not open by the refresh_server_info + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + failure = True + + if not failure: + try: # reissuing same operation + ret_value = self.connection.send(message_type, request, controls) + if self.connection.usage: + self.connection._usage.restartable_successes += 1 + self._restarting = False + self._reset_exception_history() + return ret_value # successful send + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + failure = True + + if failure and self.connection.usage: + self.connection._usage.restartable_failures += 1 + + if not isinstance(self.restartable_tries, bool): + counter -= 1 + + self._restarting = False + + self.connection.last_error = 'restartable connection failed to send' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPMaximumRetriesError(self.connection.last_error, self.exception_history, self.restartable_tries) + + def post_send_single_response(self, message_id): + try: + ret_value = SyncStrategy.post_send_single_response(self, message_id) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + + # if an LDAPExceptionError is raised then resend the request + try: + ret_value = SyncStrategy.post_send_single_response(self, self.send(self._current_message_type, self._current_request, self._current_controls)) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if not isinstance(e, LDAPOperationResult): + self.connection.last_error = 'restartable connection strategy failed in post_send_single_response' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise + + def post_send_search(self, message_id): + try: + ret_value = SyncStrategy.post_send_search(self, message_id) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + + # if an LDAPExceptionError is raised then resend the request + try: + ret_value = SyncStrategy.post_send_search(self, self.connection.send(self._current_message_type, self._current_request, self._current_controls)) + self._reset_exception_history() + return ret_value + except Exception as e: + if log_enabled(ERROR): + log(ERROR, '<%s> while restarting <%s>', e, self.connection) + self._add_exception_to_history(type(e)(str(e))) + if not isinstance(e, LDAPOperationResult): + self.connection.last_error = e.args + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise e + + def _add_exception_to_history(self, exc): + if not isinstance(self.restartable_tries, bool): # doesn't accumulate when restarting forever + if not isinstance(exc, LDAPMaximumRetriesError): # doesn't add the LDAPMaximumRetriesError exception + self.exception_history.append(exc) + + def _reset_exception_history(self): + if self.exception_history: + self.exception_history = [] + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/reusable.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/reusable.py new file mode 100644 index 0000000..01bd9d3 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/reusable.py @@ -0,0 +1,495 @@ +""" +""" + +# Created on 2014.03.23 +# +# Author: Giovanni Cannata +# +# Copyright 2014 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from datetime import datetime +from os import linesep +from threading import Thread, Lock +from time import sleep + +from .. import RESTARTABLE, get_config_parameter, AUTO_BIND_DEFAULT, AUTO_BIND_NONE, AUTO_BIND_NO_TLS, AUTO_BIND_TLS_AFTER_BIND, AUTO_BIND_TLS_BEFORE_BIND +from .base import BaseStrategy +from ..core.usage import ConnectionUsage +from ..core.exceptions import LDAPConnectionPoolNameIsMandatoryError, LDAPConnectionPoolNotStartedError, LDAPOperationResult, LDAPExceptionError, LDAPResponseTimeoutError +from ..utils.log import log, log_enabled, ERROR, BASIC +from ..protocol.rfc4511 import LDAP_MAX_INT + +TERMINATE_REUSABLE = 'TERMINATE_REUSABLE_CONNECTION' + +BOGUS_BIND = -1 +BOGUS_UNBIND = -2 +BOGUS_EXTENDED = -3 +BOGUS_ABANDON = -4 + +try: + from queue import Queue, Empty +except ImportError: # Python 2 + # noinspection PyUnresolvedReferences + from Queue import Queue, Empty + + +# noinspection PyProtectedMember +class ReusableStrategy(BaseStrategy): + """ + A pool of reusable SyncWaitRestartable connections with lazy behaviour and limited lifetime. + The connection using this strategy presents itself as a normal connection, but internally the strategy has a pool of + connections that can be used as needed. Each connection lives in its own thread and has a busy/available status. + The strategy performs the requested operation on the first available connection. + The pool of connections is instantiated at strategy initialization. + Strategy has two customizable properties, the total number of connections in the pool and the lifetime of each connection. + When lifetime is expired the connection is closed and will be open again when needed. + """ + pools = dict() + + def receiving(self): + raise NotImplementedError + + def _start_listen(self): + raise NotImplementedError + + def _get_response(self, message_id, timeout): + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError + + def set_stream(self, value): + raise NotImplementedError + + # noinspection PyProtectedMember + class ConnectionPool(object): + """ + Container for the Connection Threads + """ + def __new__(cls, connection): + if connection.pool_name in ReusableStrategy.pools: # returns existing connection pool + pool = ReusableStrategy.pools[connection.pool_name] + if not pool.started: # if pool is not started remove it from the pools singleton and create a new onw + del ReusableStrategy.pools[connection.pool_name] + return object.__new__(cls) + if connection.pool_keepalive and pool.keepalive != connection.pool_keepalive: # change lifetime + pool.keepalive = connection.pool_keepalive + if connection.pool_lifetime and pool.lifetime != connection.pool_lifetime: # change keepalive + pool.lifetime = connection.pool_lifetime + if connection.pool_size and pool.pool_size != connection.pool_size: # if pool size has changed terminate and recreate the connections + pool.terminate_pool() + pool.pool_size = connection.pool_size + return pool + else: + return object.__new__(cls) + + def __init__(self, connection): + if not hasattr(self, 'workers'): + self.name = connection.pool_name + self.master_connection = connection + self.workers = [] + self.pool_size = connection.pool_size or get_config_parameter('REUSABLE_THREADED_POOL_SIZE') + self.lifetime = connection.pool_lifetime or get_config_parameter('REUSABLE_THREADED_LIFETIME') + self.keepalive = connection.pool_keepalive + self.request_queue = Queue() + self.open_pool = False + self.bind_pool = False + self.tls_pool = False + self._incoming = dict() + self.counter = 0 + self.terminated_usage = ConnectionUsage() if connection._usage else None + self.terminated = False + self.pool_lock = Lock() + ReusableStrategy.pools[self.name] = self + self.started = False + if log_enabled(BASIC): + log(BASIC, 'instantiated ConnectionPool: <%r>', self) + + def __str__(self): + s = 'POOL: ' + str(self.name) + ' - status: ' + ('started' if self.started else 'terminated') + s += ' - responses in queue: ' + str(len(self._incoming)) + s += ' - pool size: ' + str(self.pool_size) + s += ' - lifetime: ' + str(self.lifetime) + s += ' - keepalive: ' + str(self.keepalive) + s += ' - open: ' + str(self.open_pool) + s += ' - bind: ' + str(self.bind_pool) + s += ' - tls: ' + str(self.tls_pool) + linesep + s += 'MASTER CONN: ' + str(self.master_connection) + linesep + s += 'WORKERS:' + if self.workers: + for i, worker in enumerate(self.workers): + s += linesep + str(i).rjust(5) + ': ' + str(worker) + else: + s += linesep + ' no active workers in pool' + + return s + + def __repr__(self): + return self.__str__() + + def get_info_from_server(self): + for worker in self.workers: + with worker.worker_lock: + if not worker.connection.server.schema or not worker.connection.server.info: + worker.get_info_from_server = True + else: + worker.get_info_from_server = False + + def rebind_pool(self): + for worker in self.workers: + with worker.worker_lock: + worker.connection.rebind(self.master_connection.user, + self.master_connection.password, + self.master_connection.authentication, + self.master_connection.sasl_mechanism, + self.master_connection.sasl_credentials) + + def start_pool(self): + if not self.started: + self.create_pool() + for worker in self.workers: + with worker.worker_lock: + worker.thread.start() + self.started = True + self.terminated = False + if log_enabled(BASIC): + log(BASIC, 'worker started for pool <%s>', self) + return True + return False + + def create_pool(self): + if log_enabled(BASIC): + log(BASIC, 'created pool <%s>', self) + self.workers = [ReusableStrategy.PooledConnectionWorker(self.master_connection, self.request_queue) for _ in range(self.pool_size)] + + def terminate_pool(self): + if not self.terminated: + if log_enabled(BASIC): + log(BASIC, 'terminating pool <%s>', self) + self.started = False + self.request_queue.join() # waits for all queue pending operations + for _ in range(len([worker for worker in self.workers if worker.thread.is_alive()])): # put a TERMINATE signal on the queue for each active thread + self.request_queue.put((TERMINATE_REUSABLE, None, None, None)) + self.request_queue.join() # waits for all queue terminate operations + self.terminated = True + if log_enabled(BASIC): + log(BASIC, 'pool terminated for <%s>', self) + + class PooledConnectionThread(Thread): + """ + The thread that holds the Reusable connection and receive operation request via the queue + Result are sent back in the pool._incoming list when ready + """ + def __init__(self, worker, master_connection): + Thread.__init__(self) + self.daemon = True + self.worker = worker + self.master_connection = master_connection + if log_enabled(BASIC): + log(BASIC, 'instantiated PooledConnectionThread: <%r>', self) + + # noinspection PyProtectedMember + def run(self): + self.worker.running = True + terminate = False + pool = self.master_connection.strategy.pool + while not terminate: + try: + counter, message_type, request, controls = pool.request_queue.get(block=True, timeout=self.master_connection.strategy.pool.keepalive) + except Empty: # issue an Abandon(0) operation to keep the connection live - Abandon(0) is a harmless operation + if not self.worker.connection.closed: + self.worker.connection.abandon(0) + continue + + with self.worker.worker_lock: + self.worker.busy = True + if counter == TERMINATE_REUSABLE: + terminate = True + if self.worker.connection.bound: + try: + self.worker.connection.unbind() + if log_enabled(BASIC): + log(BASIC, 'thread terminated') + except LDAPExceptionError: + pass + else: + if (datetime.now() - self.worker.creation_time).seconds >= self.master_connection.strategy.pool.lifetime: # destroy and create a new connection + try: + self.worker.connection.unbind() + except LDAPExceptionError: + pass + self.worker.new_connection() + if log_enabled(BASIC): + log(BASIC, 'thread respawn') + if message_type not in ['bindRequest', 'unbindRequest']: + try: + if pool.open_pool and self.worker.connection.closed: + self.worker.connection.open(read_server_info=False) + if pool.tls_pool and not self.worker.connection.tls_started: + self.worker.connection.start_tls(read_server_info=False) + if pool.bind_pool and not self.worker.connection.bound: + self.worker.connection.bind(read_server_info=False) + elif pool.open_pool and not self.worker.connection.closed: # connection already open, issues a start_tls + if pool.tls_pool and not self.worker.connection.tls_started: + self.worker.connection.start_tls(read_server_info=False) + if self.worker.get_info_from_server and counter: + self.worker.connection.refresh_server_info() + self.worker.get_info_from_server = False + response = None + result = None + if message_type == 'searchRequest': + response = self.worker.connection.post_send_search(self.worker.connection.send(message_type, request, controls)) + else: + response = self.worker.connection.post_send_single_response(self.worker.connection.send(message_type, request, controls)) + result = self.worker.connection.result + with pool.pool_lock: + pool._incoming[counter] = (response, result, BaseStrategy.decode_request(message_type, request, controls)) + except LDAPOperationResult as e: # raise_exceptions has raised an exception. It must be redirected to the original connection thread + with pool.pool_lock: + pool._incoming[counter] = (e, None, None) + # pool._incoming[counter] = (type(e)(str(e)), None, None) + # except LDAPOperationResult as e: # raise_exceptions has raised an exception. It must be redirected to the original connection thread + # exc = e + # with pool.pool_lock: + # if exc: + # pool._incoming[counter] = (exc, None, None) + # else: + # pool._incoming[counter] = (response, result, BaseStrategy.decode_request(message_type, request, controls)) + + self.worker.busy = False + pool.request_queue.task_done() + self.worker.task_counter += 1 + if log_enabled(BASIC): + log(BASIC, 'thread terminated') + if self.master_connection.usage: + pool.terminated_usage += self.worker.connection.usage + self.worker.running = False + + class PooledConnectionWorker(object): + """ + Container for the restartable connection. it includes a thread and a lock to execute the connection in the pool + """ + def __init__(self, connection, request_queue): + self.master_connection = connection + self.request_queue = request_queue + self.running = False + self.busy = False + self.get_info_from_server = False + self.connection = None + self.creation_time = None + self.task_counter = 0 + self.new_connection() + self.thread = ReusableStrategy.PooledConnectionThread(self, self.master_connection) + self.worker_lock = Lock() + if log_enabled(BASIC): + log(BASIC, 'instantiated PooledConnectionWorker: <%s>', self) + + def __str__(self): + s = 'CONN: ' + str(self.connection) + linesep + ' THREAD: ' + s += 'running' if self.running else 'halted' + s += ' - ' + ('busy' if self.busy else 'available') + s += ' - ' + ('created at: ' + self.creation_time.isoformat()) + s += ' - time to live: ' + str(self.master_connection.strategy.pool.lifetime - (datetime.now() - self.creation_time).seconds) + s += ' - requests served: ' + str(self.task_counter) + + return s + + def new_connection(self): + from ..core.connection import Connection + # noinspection PyProtectedMember + self.creation_time = datetime.now() + self.connection = Connection(server=self.master_connection.server_pool if self.master_connection.server_pool else self.master_connection.server, + user=self.master_connection.user, + password=self.master_connection.password, + auto_bind=AUTO_BIND_NONE, # do not perform auto_bind because it reads again the schema + version=self.master_connection.version, + authentication=self.master_connection.authentication, + client_strategy=RESTARTABLE, + auto_referrals=self.master_connection.auto_referrals, + auto_range=self.master_connection.auto_range, + sasl_mechanism=self.master_connection.sasl_mechanism, + sasl_credentials=self.master_connection.sasl_credentials, + check_names=self.master_connection.check_names, + collect_usage=self.master_connection._usage, + read_only=self.master_connection.read_only, + raise_exceptions=self.master_connection.raise_exceptions, + lazy=False, + fast_decoder=self.master_connection.fast_decoder, + receive_timeout=self.master_connection.receive_timeout, + return_empty_attributes=self.master_connection.empty_attributes) + + # simulates auto_bind, always with read_server_info=False + if self.master_connection.auto_bind and self.master_connection.auto_bind not in [AUTO_BIND_NONE, AUTO_BIND_DEFAULT]: + if log_enabled(BASIC): + log(BASIC, 'performing automatic bind for <%s>', self.connection) + self.connection.open(read_server_info=False) + if self.master_connection.auto_bind == AUTO_BIND_NO_TLS: + self.connection.bind(read_server_info=False) + elif self.master_connection.auto_bind == AUTO_BIND_TLS_BEFORE_BIND: + self.connection.start_tls(read_server_info=False) + self.connection.bind(read_server_info=False) + elif self.master_connection.auto_bind == AUTO_BIND_TLS_AFTER_BIND: + self.connection.bind(read_server_info=False) + self.connection.start_tls(read_server_info=False) + + if self.master_connection.server_pool: + self.connection.server_pool = self.master_connection.server_pool + self.connection.server_pool.initialize(self.connection) + + # ReusableStrategy methods + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = False + self.no_real_dsa = False + self.pooled = True + self.can_stream = False + if hasattr(ldap_connection, 'pool_name') and ldap_connection.pool_name: + self.pool = ReusableStrategy.ConnectionPool(ldap_connection) + else: + if log_enabled(ERROR): + log(ERROR, 'reusable connection must have a pool_name') + raise LDAPConnectionPoolNameIsMandatoryError('reusable connection must have a pool_name') + + def open(self, reset_usage=True, read_server_info=True): + # read_server_info not used + self.pool.open_pool = True + self.pool.start_pool() + self.connection.closed = False + if self.connection.usage: + if reset_usage or not self.connection._usage.initial_connection_start_time: + self.connection._usage.start() + + def terminate(self): + self.pool.terminate_pool() + self.pool.open_pool = False + self.connection.bound = False + self.connection.closed = True + self.pool.bind_pool = False + self.pool.tls_pool = False + + def _close_socket(self): + """ + Doesn't really close the socket + """ + self.connection.closed = True + + if self.connection.usage: + self.connection._usage.closed_sockets += 1 + + def send(self, message_type, request, controls=None): + if self.pool.started: + if message_type == 'bindRequest': + self.pool.bind_pool = True + counter = BOGUS_BIND + elif message_type == 'unbindRequest': + self.pool.bind_pool = False + counter = BOGUS_UNBIND + elif message_type == 'abandonRequest': + counter = BOGUS_ABANDON + elif message_type == 'extendedReq' and self.connection.starting_tls: + self.pool.tls_pool = True + counter = BOGUS_EXTENDED + else: + with self.pool.pool_lock: + self.pool.counter += 1 + if self.pool.counter > LDAP_MAX_INT: + self.pool.counter = 1 + counter = self.pool.counter + self.pool.request_queue.put((counter, message_type, request, controls)) + return counter + if log_enabled(ERROR): + log(ERROR, 'reusable connection pool not started') + raise LDAPConnectionPoolNotStartedError('reusable connection pool not started') + + def validate_bind(self, controls): + # in case of a new connection or different credentials + if (self.connection.user != self.pool.master_connection.user or + self.connection.password != self.pool.master_connection.password or + self.connection.authentication != self.pool.master_connection.authentication or + self.connection.sasl_mechanism != self.pool.master_connection.sasl_mechanism or + self.connection.sasl_credentials != self.pool.master_connection.sasl_credentials): + self.pool.master_connection.user = self.connection.user + self.pool.master_connection.password = self.connection.password + self.pool.master_connection.authentication = self.connection.authentication + self.pool.master_connection.sasl_mechanism = self.connection.sasl_mechanism + self.pool.master_connection.sasl_credentials = self.connection.sasl_credentials + self.pool.rebind_pool() + temp_connection = self.pool.workers[0].connection + old_lazy = temp_connection.lazy + temp_connection.lazy = False + if not self.connection.server.schema or not self.connection.server.info: + result = self.pool.workers[0].connection.bind(controls=controls) + else: + result = self.pool.workers[0].connection.bind(controls=controls, read_server_info=False) + + temp_connection.unbind() + temp_connection.lazy = old_lazy + if result: + self.pool.bind_pool = True # bind pool if bind is validated + return result + + def get_response(self, counter, timeout=None, get_request=False): + sleeptime = get_config_parameter('RESPONSE_SLEEPTIME') + request=None + if timeout is None: + timeout = get_config_parameter('RESPONSE_WAITING_TIMEOUT') + if counter == BOGUS_BIND: # send a bogus bindResponse + response = list() + result = {'description': 'success', 'referrals': None, 'type': 'bindResponse', 'result': 0, 'dn': '', 'message': '', 'saslCreds': None} + elif counter == BOGUS_UNBIND: # bogus unbind response + response = None + result = None + elif counter == BOGUS_ABANDON: # abandon cannot be executed because of multiple connections + response = list() + result = {'result': 0, 'referrals': None, 'responseName': '1.3.6.1.4.1.1466.20037', 'type': 'extendedResp', 'description': 'success', 'responseValue': 'None', 'dn': '', 'message': ''} + elif counter == BOGUS_EXTENDED: # bogus startTls extended response + response = list() + result = {'result': 0, 'referrals': None, 'responseName': '1.3.6.1.4.1.1466.20037', 'type': 'extendedResp', 'description': 'success', 'responseValue': 'None', 'dn': '', 'message': ''} + self.connection.starting_tls = False + else: + response = None + result = None + while timeout >= 0: # waiting for completed message to appear in _incoming + try: + with self.connection.strategy.pool.pool_lock: + response, result, request = self.connection.strategy.pool._incoming.pop(counter) + except KeyError: + sleep(sleeptime) + timeout -= sleeptime + continue + break + + if timeout <= 0: + if log_enabled(ERROR): + log(ERROR, 'no response from worker threads in Reusable connection') + raise LDAPResponseTimeoutError('no response from worker threads in Reusable connection') + + if isinstance(response, LDAPOperationResult): + raise response # an exception has been raised with raise_exceptions + + if get_request: + return response, result, request + + return response, result + + def post_send_single_response(self, counter): + return counter + + def post_send_search(self, counter): + return counter diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeRestartable.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeRestartable.py new file mode 100644 index 0000000..3c65176 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeRestartable.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2020.07.12 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .restartable import RestartableStrategy + + +class SafeRestartableStrategy(RestartableStrategy): + def __init__(self, ldap_connection): + RestartableStrategy.__init__(self, ldap_connection) + self.thread_safe = True diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeSync.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeSync.py new file mode 100644 index 0000000..dcd2b92 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/safeSync.py @@ -0,0 +1,32 @@ +""" +""" + +# Created on 2020.07.12 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +from .sync import SyncStrategy + + +class SafeSyncStrategy(SyncStrategy): + def __init__(self, ldap_connection): + SyncStrategy.__init__(self, ldap_connection) + self.thread_safe = True diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/sync.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/sync.py new file mode 100644 index 0000000..49224c6 --- /dev/null +++ b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/strategy/sync.py @@ -0,0 +1,251 @@ +""" +""" + +# Created on 2013.07.15 +# +# Author: Giovanni Cannata +# +# Copyright 2013 - 2020 Giovanni Cannata +# +# This file is part of ldap3. +# +# ldap3 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ldap3 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with ldap3 in the COPYING and COPYING.LESSER files. +# If not, see . + +import socket + +from .. import SEQUENCE_TYPES, get_config_parameter, DIGEST_MD5 +from ..core.exceptions import LDAPSocketReceiveError, communication_exception_factory, LDAPExceptionError, LDAPExtensionError, LDAPOperationResult, LDAPSignatureVerificationFailedError +from ..strategy.base import BaseStrategy, SESSION_TERMINATED_BY_SERVER, RESPONSE_COMPLETE, TRANSACTION_ERROR +from ..protocol.rfc4511 import LDAPMessage +from ..utils.log import log, log_enabled, ERROR, NETWORK, EXTENDED, format_ldap_message +from ..utils.asn1 import decoder, decode_message_fast +from ..protocol.sasl.digestMd5 import md5_hmac + +LDAP_MESSAGE_TEMPLATE = LDAPMessage() + + +# noinspection PyProtectedMember +class SyncStrategy(BaseStrategy): + """ + This strategy is synchronous. You send the request and get the response + Requests return a boolean value to indicate the result of the requested Operation + Connection.response will contain the whole LDAP response for the messageId requested in a dict form + Connection.request will contain the result LDAP message in a dict form + """ + + def __init__(self, ldap_connection): + BaseStrategy.__init__(self, ldap_connection) + self.sync = True + self.no_real_dsa = False + self.pooled = False + self.can_stream = False + self.socket_size = get_config_parameter('SOCKET_SIZE') + + def open(self, reset_usage=True, read_server_info=True): + BaseStrategy.open(self, reset_usage, read_server_info) + if read_server_info and not self.connection._deferred_open: + try: + self.connection.refresh_server_info() + except LDAPOperationResult: # catch errors from server if raise_exception = True + self.connection.server._dsa_info = None + self.connection.server._schema_info = None + + def _start_listen(self): + if not self.connection.listening and not self.connection.closed: + self.connection.listening = True + + def receiving(self): + """ + Receives data over the socket + Checks if the socket is closed + """ + messages = [] + receiving = True + unprocessed = b'' + data = b'' + get_more_data = True + # exc = None # not needed here GC + sasl_total_bytes_recieved = 0 + sasl_received_data = b'' # used to verify the signature + sasl_next_packet = b'' + # sasl_signature = b'' # not needed here? GC + # sasl_sec_num = b'' # used to verify the signature # not needed here, reformatted to lowercase GC + sasl_buffer_length = -1 # added, not initialized? GC + while receiving: + if get_more_data: + try: + data = self.connection.socket.recv(self.socket_size) + except (OSError, socket.error, AttributeError) as e: + self.connection.last_error = 'error receiving data: ' + str(e) + try: # try to close the connection before raising exception + self.close() + except (socket.error, LDAPExceptionError): + pass + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise communication_exception_factory(LDAPSocketReceiveError, exc)(self.connection.last_error) + raise communication_exception_factory(LDAPSocketReceiveError, type(e)(str(e)))(self.connection.last_error) + + # If we are using DIGEST-MD5 and LDAP signing is set : verify & remove the signature from the message + if self.connection.sasl_mechanism == DIGEST_MD5 and self.connection._digest_md5_kis and not self.connection.sasl_in_progress: + data = sasl_next_packet + data + + if sasl_received_data == b'' or sasl_next_packet: + # Remove the sizeOf(encoded_message + signature + 0x0001 + secNum) from data. + sasl_buffer_length = int.from_bytes(data[0:4], "big") + data = data[4:] + sasl_next_packet = b'' + sasl_total_bytes_recieved += len(data) + sasl_received_data += data + + if sasl_total_bytes_recieved >= sasl_buffer_length: + # When the LDAP response is splitted accross multiple TCP packets, the SASL buffer length is equal to the MTU of each packet..Which is usually not equal to self.socket_size + # This means that the end of one SASL packet/beginning of one other....could be located in the middle of data + # We are using "sasl_received_data" instead of "data" & "unprocessed" for this reason + + # structure of messages when LDAP signing is enabled : sizeOf(encoded_message + signature + 0x0001 + secNum) + encoded_message + signature + 0x0001 + secNum + sasl_signature = sasl_received_data[sasl_buffer_length - 16:sasl_buffer_length - 6] + sasl_sec_num = sasl_received_data[sasl_buffer_length - 4:sasl_buffer_length] + sasl_next_packet = sasl_received_data[sasl_buffer_length:] # the last "data" variable may contain another sasl packet. We'll process it at the next iteration. + sasl_received_data = sasl_received_data[:sasl_buffer_length - 16] # remove signature + 0x0001 + secNum + the next packet if any, from sasl_received_data + + kis = self.connection._digest_md5_kis # renamed to lowercase GC + calculated_signature = bytes.fromhex(md5_hmac(kis, sasl_sec_num + sasl_received_data)[0:20]) + if sasl_signature != calculated_signature: + raise LDAPSignatureVerificationFailedError("Signature verification failed for the recieved LDAP message number " + str(int.from_bytes(sasl_sec_num, 'big')) + ". Expected signature " + calculated_signature.hex() + " but got " + sasl_signature.hex() + ".") + sasl_total_bytes_recieved = 0 + unprocessed += sasl_received_data + sasl_received_data = b'' + else: + unprocessed += data + if len(data) > 0: + length = BaseStrategy.compute_ldap_message_size(unprocessed) + if length == -1: # too few data to decode message length + get_more_data = True + continue + if len(unprocessed) < length: + get_more_data = True + else: + if log_enabled(NETWORK): + log(NETWORK, 'received %d bytes via <%s>', len(unprocessed[:length]), self.connection) + messages.append(unprocessed[:length]) + unprocessed = unprocessed[length:] + get_more_data = False + if len(unprocessed) == 0: + receiving = False + else: + receiving = False + + if log_enabled(NETWORK): + log(NETWORK, 'received %d ldap messages via <%s>', len(messages), self.connection) + return messages + + def post_send_single_response(self, message_id): + """ + Executed after an Operation Request (except Search) + Returns the result message or None + """ + responses, result = self.get_response(message_id) + self.connection.result = result + if result['type'] == 'intermediateResponse': # checks that all responses are intermediates (there should be only one) + for response in responses: + if response['type'] != 'intermediateResponse': + self.connection.last_error = 'multiple messages received error' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + + responses.append(result) + return responses + + def post_send_search(self, message_id): + """ + Executed after a search request + Returns the result message and store in connection.response the objects found + """ + responses, result = self.get_response(message_id) + self.connection.result = result + if isinstance(responses, SEQUENCE_TYPES): + self.connection.response = responses[:] # copy search result entries + return responses + + self.connection.last_error = 'error receiving response' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + + def _get_response(self, message_id, timeout): + """ + Performs the capture of LDAP response for SyncStrategy + """ + ldap_responses = [] + response_complete = False + while not response_complete: + responses = self.receiving() + if responses: + for response in responses: + if len(response) > 0: + if self.connection.usage: + self.connection._usage.update_received_message(len(response)) + if self.connection.fast_decoder: + ldap_resp = decode_message_fast(response) + dict_response = self.decode_response_fast(ldap_resp) + else: + ldap_resp, _ = decoder.decode(response, asn1Spec=LDAP_MESSAGE_TEMPLATE) # unprocessed unused because receiving() waits for the whole message + dict_response = self.decode_response(ldap_resp) + if log_enabled(EXTENDED): + log(EXTENDED, 'ldap message received via <%s>:%s', self.connection, format_ldap_message(ldap_resp, '<<')) + if int(ldap_resp['messageID']) == message_id: + ldap_responses.append(dict_response) + if dict_response['type'] not in ['searchResEntry', 'searchResRef', 'intermediateResponse']: + response_complete = True + elif int(ldap_resp['messageID']) == 0: # 0 is reserved for 'Unsolicited Notification' from server as per RFC4511 (paragraph 4.4) + if dict_response['responseName'] == '1.3.6.1.4.1.1466.20036': # Notice of Disconnection as per RFC4511 (paragraph 4.4.1) + return SESSION_TERMINATED_BY_SERVER + elif dict_response['responseName'] == '2.16.840.1.113719.1.27.103.4': # Novell LDAP transaction error unsolicited notification + return TRANSACTION_ERROR + else: + self.connection.last_error = 'unknown unsolicited notification from server' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + elif int(ldap_resp['messageID']) != message_id and dict_response['type'] == 'extendedResp': + self.connection.last_error = 'multiple extended responses to a single extended request' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPExtensionError(self.connection.last_error) + # pass # ignore message with invalid messageId when receiving multiple extendedResp. This is not allowed by RFC4511 but some LDAP server do it + else: + self.connection.last_error = 'invalid messageId received' + if log_enabled(ERROR): + log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + raise LDAPSocketReceiveError(self.connection.last_error) + # response = unprocessed + # if response: # if this statement is removed unprocessed data will be processed as another message + # self.connection.last_error = 'unprocessed substrate error' + # if log_enabled(ERROR): + # log(ERROR, '<%s> for <%s>', self.connection.last_error, self.connection) + # raise LDAPSocketReceiveError(self.connection.last_error) + else: + return SESSION_TERMINATED_BY_SERVER + ldap_responses.append(RESPONSE_COMPLETE) + + return ldap_responses + + def set_stream(self, value): + raise NotImplementedError + + def get_stream(self): + raise NotImplementedError diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__init__.py b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/__init__.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4b44bf413a424a1bb868da07022b3c91d4e640d GIT binary patch literal 142 zcmZ?b<>g`kg4wH6Q$h4&5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vUza+OnzaXjpvA`HgmX>7Z6zj*wXXa&=#K-FuRNmsS$<0qG%}KQb J8Tc89831(|A$0%% literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/asn1.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/asn1.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc0afa0618da90287a46598c313708e319889b30 GIT binary patch literal 6209 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/config.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c4a81f79de6b8f1122334254772ba332ad4777a GIT binary patch literal 5476 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 GR_)&bk7f}7 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/conv.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/conv.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e27fe50fe10d82730ec3894c45019e7569f179fa GIT binary patch literal 6259 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 BmW}`b literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/dn.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/dn.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22534ddefbc8a61c2f48774fb4ac7c612264976a GIT binary patch literal 8100 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 literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ntlm.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ntlm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f14c9f604664d940e56a2c800bba201cf268618 GIT binary patch literal 11329 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 HlsWi62aw!A literal 0 HcmV?d00001 diff --git a/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ordDict.cpython-37.pyc b/install-soft-on-Astra-linux/lib/python3.7/site-packages/ldap3/utils/__pycache__/ordDict.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d0d5ac85135486b358ed6911cbeed629e55d3e5 GIT binary patch literal 3569 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